====== SOGo ======
**[[http://www.sogo.nu/|SOGo]]** è groupware opensource, tra le caratteristiche importanti troviamo:
* Webmail AJAX-based
* Server CalDAV con condivisione calendari
* Server CardDAV con condivisione contatti
* Multidominio (separazione utenti per dominio)
Attenzione: in Debain Wheezy è disponibile SOGo 1.3, quindi conviente installare Debian Jessie (attualmente in testing) per avere SOGo 2.0.5a.
===== Pacchetti Debian =====
* sogo
* postgresql
* memcached (vedere problema ipv4/ipv6 qui: http://wiki.sogo.nu/CommonProblems)
* tmpreaper (vedere il README che non viene attivato!)
* php5
* apache2-mpm-prefork
Se interessa il supporto LDAP installare anche:
* slapd
* ldap-utils
* phpldapadmin
Moduli Apache necessari
* **rewrite** - Il file di configurazione ''/etc/apache2/conf-enabled/sogo.conf'' richiede il rewrite in modo che funzionino i **%%/.well-known/caldav/%%** e **%%/.well-known/carddav/%%**.
===== Demone sogod =====
**ATTENZIONE** alla sintassi del file di configurazione! Dalla versione 1.3.16 (Debian Wheezy) alla version 2.0.7 (Debian Jessie) cambiano cose sostanziali, come la sintassi degli URL di collegamento.
Una volta installato il pacchetto Debian e con l'opportuno file di configurazione **''/etc/sogo/sogo.conf''** è possibile far partire/fermare il servizio con **''/etc/init.d/sogo {start|stop|restart}''**. Il demone si pone in ascolto sulla porta **TCP 20000**, ma non è previsto connettersi direttamente ad essa da internet (lasciare pertanto il firewall chiuso!).
{
SOGoPageTitle = "Rigacci.Org SmartMail";
SOGoLanguage = Italiano;
SOGoTimeZone = Europe/Rome;
SOGoProfileURL = "postgresql://sogo:MySecret@127.0.0.1:5432/sogo/sogo_user_profile";
OCSFolderInfoURL = "postgresql://sogo:MySecret@127.0.0.1:5432/sogo/sogo_folder_info";
OCSSessionsFolderURL = "postgresql://sogo:MySecret@127.0.0.1:5432/sogo/sogo_sessions_folder";
OCSEMailAlarmsFolderURL = "postgresql://sogo:MySecret@127.0.0.1:5432/sogo/sogo_alarms_folder";
SOGoMailingMechanism = smtp;
SOGoSMTPServer = "localhost";
SOGoIMAPServer = "imap://localhost:143/?tls=YES";
// Maildir will be created as $HOME/Maildir/.Sent/, etc.
SOGoSentFolderName = "INBOX/Sent";
SOGoTrashFolderName = "INBOX/Trash";
SOGoDraftsFolderName = "INBOX/Drafts";
SOGoJunkFolderName = "INBOX/Spam";
SOGoIMAPAclConformsToIMAPExt = YES;
SOGoSieveServer = "sieve://localhost:4190/?tls=YES";
SOGoVacationEnabled = YES;
SOGoForwardEnabled = YES;
SOGoSieveScriptsEnabled = NO;
SOGoFirstDayOfWeek = 1;
SOGoMailMessageCheck = manually;
SOGoMailAuxiliaryUserAccountsEnabled = NO;
SOGoAppointmentSendEMailNotifications = YES;
// Append the domain name to the c_uid to obtain an unique UID.
// We don't want this because the user already is required to
// log-in with the full (and unique) name@domain.
//SOGoEnableDomainBasedUID = YES;
// Show domain drop-down at login.
//SOGoLoginDomains = ("rigacci.org", "rigacci.net");
domains = {
"rigacci.org" = {
SOGoMailDomain = "rigacci.org";
SOGoIMAPServer = "imap://smartmail.rigacci.org:143/?tls=YES";
SOGoMailingMechanism = smtp;
SOGoSMTPServer = 127.0.0.1;
SOGoUserSources = ({
type = sql;
id = directory_rigacci_org;
displayName = "Rigacci.Org Users";
viewURL = "postgresql://sogo:MySecret@127.0.0.1:5432/sogo/sogo_users_rigacci_org";
canAuthenticate = YES;
isAddressBook = YES;
userPasswordAlgorithm = md5;
//MailFieldNames = ("second_email");
},{
type = sql;
id = "addressbook_rigacci_org";
displayName = "SQL Address-book for Rigacci.Org";
viewURL = "postgresql://sogo:MySecret@127.0.0.1:5432/sogo/sogo_addressbook_rigacci_org";
canAuthenticate = NO;
isAddressBook = YES;
},{
type = ldap;
id = "ldap_addressbook";
displayName = "LDAP addressbook for Rigacci.Org";
CNFieldName = cn;
IDFieldName = uidNumber;
UIDFieldName = uidNumber;
baseDN = "ou=Addressbook,dc=rigacci,dc=org";
bindDN = "cn=guest,ou=Addressbook,dc=rigacci,dc=org";
bindPassword = guest;
hostname = "127.0.0.1";
isAddressBook = YES;
canAuthenticate = NO;
userPasswordAlgorithm = md5;
});
};
"rigacci.net" = {
SOGoMailDomain = "rigacci.net";
SOGoIMAPServer = "imap://mail.rigacci.net:143/?tls=YES";
SOGoMailingMechanism = smtp;
SOGoSMTPServer = 127.0.0.1;
SOGoUserSources = ({
type = sql;
id = directory_rigacci_net;
viewURL = "postgresql://sogo:MySecret@127.0.0.1:5432/sogo/sogo_users_rigacci_net";
canAuthenticate = YES;
isAddressBook = NO;
userPasswordAlgorithm = md5;
});
};
};
}
===== Configurazione Apache =====
Per la configurazione standard di Apache con SOGo sono necessari alcuni moduli:
* proxy
* proxy_http
* headers
Quindi si copia il file di esempio ''/usr/share/doc/sogo/apache.conf'' in **''/etc/apache2/conf.d/sogo.conf''** modificando solo alcune righe:
RequestHeader set "x-webobjects-server-port" "443"
RequestHeader set "x-webobjects-server-name" "smartmail.rigacci.org"
RequestHeader set "x-webobjects-server-url" "https://smartmail.rigacci.org"
Dopo aver riavviato il server Apache è possibile puntare un browser all'URL **''%%http:///SOGo/%%''**
La funzione principale contenuta nel file di configurazione è quella di effettuare il proxy dal prefisso **''/SOGo''** verso il demone che ascolta sulla porta **TCP 20000**.
===== Database =====
Nel nostro esempio si utilizza PostgreSQL, si inizia con la creazione del database:
CREATE USER sogo PASSWORD '******';
CREATE DATABASE sogo OWNER sogo ENCODING 'UTF8';
quindi si crea la tabella per l'autenticazione di un dominio:
CREATE TABLE sogo_users_rigacci_org (
c_uid VARCHAR PRIMARY KEY,
c_name VARCHAR,
c_password VARCHAR,
c_cn VARCHAR,
mail VARCHAR,
second_email VARCHAR
);
i campi necessari per una tabella su cui fare l'autenticazione sono ''c_uid'', ''c_name'', ''c_password'', ''c_cn'' e ''mail''.
Infine si inserice un utente:
INSERT INTO sogo_users_rigacci_org VALUES
('niccolo@rigacci.org', 'niccolo', MD5('********'), 'Niccolo Rigacci', 'niccolo@rigacci.org');
==== Rimozione utente ====
Rimuovere un utente dal database non è banale, perché per ogni utente vengono create numerose tabelle di supporto.
FIXME Vedere il contenuto della tabella **''sogo_folder_info''** per capire quali altre tabelle rimuovere. Dopo aver fatto pulizia delle tabelle accessorie, si possono rimuovere i record relativi all'utente anche da **''sogo_folder_info''** e da **''sogo_user_profile''**.
DELETE FROM sogo_folder_info WHERE c_path2 = 'niccolo@rigacci.org';
DELETE FROM sogo_user_profile WHERE c_uid = 'niccolo@rigacci.org';
===== Tuning =====
Le seguenti valutazioni sono state fatte su una installazione di **circa 30 utenti**.
La parte più onerosa pare il numero di processi **imapd** contemporaneamente in esecuzione. Empiricamente risultano circa tre connessioni contemporanee per utente (client Mozilla Thunderbird). Poichè tutti gli utenti erano mascherati dietro un singolo indirizzo IP, in **''/etc/courier/imapd''** si imposta:
MAXDAEMONS=200
MAXPERIP=100
Un altro problema è sui child eseguiti da **''sogod''**, se non ce ne sono a sufficienza il processo padre entra in un loop sbagliato occupando il **100% della CPU**. Un child dovrebbe essere impegnato solo per la durata di una richiesta http, presumibilmente una decina sarebbero sufficienti. Abbiamo preferito averne 32 mettendo in **''/etc/default/sogo''**:
PREFORK=32
Il demone **''sogod''** fa interrogazioni continue al database **PostgreSQL**, teoricamente non ci dovrebbero essere più connessioni dei child ''sogod''. L'impostazione predefinita di Debian dovrebbe essere sufficiente, in **''/etc/postgresql/9.3/main/postgresql.conf''**:
max_connections = 100
===== LDAP Addressbook =====
Una rubrica LDAP viene considerata //globale// in quanto è accessibile a tutti gli utenti del dominio. **L'accesso è in sola lettura e non può essere condiviso via CardDAV**.
===== SQL Addressbook =====
Da un punto di vista funzionale è del tutto simile alla rubrica su LDAP.
===== Patch =====
Se la schermata di login iniziale non si presenta con la linga predefinita, applicare questa **[[https://github.com/inverse-inc/sogo/commit/dfcf0caa93b8195a8ee7ef97cfc5ec2fcdcfa929|patch bug #1798]]**.
===== Condivisione rubrica con Android =====
Si installa l'app **[[https://play.google.com/store/apps/details?id=org.dmfs.carddav.sync|CardDAV-Sync free beta]]**. Si tratta di un fornitore di contatti per l'ambiente Android, quindi una volta configurato compare nell'elenco //Impostazioni//, //Account//.
* Aggiungi un account, CardDAV
* Nome del server: sogo.rigacci.org (indicare solo il nome del server)
* Usa SSL: sì
* Nome utente: niccolo@rigacci.org (indicare il valore inserito in **c_uid**)
* Password: ********
* Rubriche da sincronizzare (sceglierne una):
* Rubrica personale
* Sincronizzare solo dal server al telefono
Per sincronizzare dalla rubrica personale SOGo verso il telefono: //Impostazioni//, //Account//, //CardDAV//, //Rubrica personale//, //Menu//, //Sincronizza ora//.
==== Sincronizzazione ====
**Attenzione!** Pare che le modifiche al tipo di sincronizzazione non abbiano effetto immediato! Forse si deve riavviare il telefono dopo una modifica per essere sicuri che siano effettive. FIXME Dalle prove fatte (CardDAV-Sync free 0.4.5 e SOGo 2.0.7) il meccanismo di sincronizzazione non è affidabile al 100%.
=== Unidirezionale dal server al telefono ===
Con l'opzione **//Sincronizzazione unidirezionale solo dal server al telefono//** le modifiche fatte all'account dal telefono (es. aggiunta della foto, aggiunta di campi, ecc.) non vengono propagate sul server.
FIXME L'opzione **//Forza la sincronizzazione//** dovrebbe servire a sovrascrivere o meno le modifiche fatte sul telefono durante l'aggiornamento, cioè a far prevalere o meno le informazioni dal server. In realtà questa opzione pare non funzionare assolutamente (forse si deve riavviare?): le modifiche fatte sul telefono ad un contatto restano fintanto che lo stesso contatto non viene modificato anche sul server, ma appena il contatto viene aggiornato sul server alcune informazioni vengono comunque sovrascritte (es. la foto aggiunta sul telefono viene rimossa), altri campi aggiunti sul telefono restano intatti (es. il nickname), indipendentemente dal settaggio di questa opzione.
=== Bidirezionale ===
Con l'opzione **//Il telefono ha la precedenza//**, le modifiche fatte sul telefono (aggiunta foto, aggiunta campi, modifiche) vengono propagate sul server. Tuttavia alcuni campi inseriti nel telefono non compaiono sul server, ad esempio i campi nickname e note.
===== Filtri Sieve =====
Per attivare il risponditore automatico (vacation) e l'inoltro si deve ipostare nella sezione principale di **/etc/sogo/sogo.conf**:
SOGoVacationEnabled = YES;
SOGoForwardEnabled = YES;
Dopo aver riavviato il servizio, nella sezione //Impostazioni// => //Posta// della webamil SOGo compaiono le schede **Risponditore automatico** e **Inoltro**. Può capitare che quando si cerca di salvare le nuove impostazioni si ottiene il popup di errore **Servizio temporaneamente non disponibile**, che corrisponde all'errore in **/var/log/sogo/sogo.log**:
sogod [32518]: <0x...[SOGoSieveManager]> Could not login 'username@example.org' on Sieve server:
<0x...[NGSieveClient]: socket=>:
{RawResponse = "{}"; result = 0; }
È possibile anche abilitare una sezione per **filtri Sieve generici** basati su //oggetto//, //mittente// o //destinatario// con possibili azioni: //scarta//, //inoltra//, //sposta in//, ecc. È sufficiente impostare in **/etc/sogo/sogo.conf**:
SOGoSieveScriptsEnabled = YES;
L'impostazione può essere fatta a livello generale oppure per il singolo dominio (se la configurazione sfrutta la sezione **domains**).
I filtri possono essere creati e gestiti dalla webmail: **Preferenze** => **Posta** => **Filtri**. In un sistema con Dovecot Sieve i filtri per ciascun utente vengono salvati in **$HOME/sieve/sogo.sieve**.
===== Add SoGO as an application for mailto links =====
Whenever you login into the SoGO webmail, the browser my ask you if you want to **Add "your.site" as an application for mailto links?**; this is because the SoGO Javascript executes a **window.navigator.registerProtocolHandler()** call. If you are annoyed by this request you can disable it at least in Firefox by visiting the **about:config** URL and changing **network.protocol-handler.external.mailto** to **false**.
===== Session timeout =====
After upgrading SoGO from **5.0.1** to **5.8.0** (e.g. by upgrading from **Debian 11 Bullseye** to **Debian 12 Bookworm**) the webmail session exipres in a few minutes, despite user activity. This is a known bug cause by a datbase table being not be properly updated.
To fix the problem you can drop the faulty table from the SQL prompt and restart the SoGO service; the table will be re-created with the corrected structure:
DROP TABLE sogo_sessions_folder;
systemctl restart sogo.service
This hack will upgrade the field **c_value** from **character varying(255)** to **character varying(4096)** (using the PostgreSQL backend).
See this [[https://www.mail-archive.com/users@sogo.nu/msg31265.html|SoGO mailing list message]].