# SOGo

**Cicle formatiu**: CFGM Sistemes Microinformàtics i Xarxes (SMX) / CFGS Administració de sistemes informàtics en xarxa (ASIX)

**Mòdul:** 0227 - Serveis de xarxa / 0375 - Serveis de xarxa i Internet

**Sistema operatiu:** Ubuntu Server 26.04 LTS

# 1. Què és SOGo

[SOGo](https://www.sogo.nu/) (*Scalable OpenGroupware.org*) és un servidor de **groupware** lliure i modern que ofereix calendaris compartits, llibretes d'adreces i correu electrònic a través d'un navegador web (interfície AJAX) o de clients natius com Mozilla Thunderbird, Apple Calendar/Contacts o Microsoft Outlook.

![SOGo logo](https://proferamon.com/tic/imatges/sogo/sogo01.png)

A diferència de solucions com Microsoft Exchange o Zimbra, SOGo **no reimplementa** els serveis de correu, directori o base de dades: reutilitza la infraestructura ja existent (IMAP, SMTP, LDAP, SQL), fent-lo fàcil d'integrar en un entorn ja muntat. És, per tant, la peça que falta entre el servidor de correu/directori i l'usuari final, oferint una interfície unificada.

Va néixer com a evolució del projecte OpenGroupware.org (Skyrix, 1998) i té la primera versió estable el 2009. Actualment, el desenvolupa i el manté l'empresa canadenca **Inverse** (avui part d'**Alinto**).

> [!NOTE]
> Un servidor groupware és un sistema que centralitza i coordina la informació i les eines de treball col·laboratiu d'un grup d'usuaris o d'una organització, en lloc de deixar que cadascú gestioni les seves dades de manera aïllada.
Típicament ofereix, com a mínim, aquests tres pilars:
> 
> **Correu electrònic:** bústies compartides o individuals accessibles des de qualsevol client (IMAP/SMTP).
>
> **Calendaris compartits:** permeten veure la disponibilitat d'altres usuaris, convocar reunions, reservar recursos (sales, projectors) i sincronitzar cites entre dispositius.
>
> **Llibretes d'adreces compartides:** un directori de contactes comú per a tota l'organització (sovint anomenat GAL, Global Address List).

# 2. Llicència

SOGo es distribueix sota llicències lliures:

> - El **servidor** (`sogo`, dimoni `sogod`) es publica sota **GNU GPL v2 o posterior**.
> - Les **biblioteques** (SOPE, els mòduls de suport) es publiquen sota **GNU LGPL v2.1 o posterior**.
> - Alguns components addicionals utilitzen **MPL**.

És programari 100% lliure i gratuït: no hi ha edició "community" limitada ni funcionalitats tancades darrere d'un mur de pagament, a diferència d'altres solucions de groupware comercials. Alinto ofereix, opcionalment, suport professional i un dipòsit de paquets de producció (de pagament), però l'ús del programari en si no requereix cap llicència comercial.

# 3. Funcionalitats

- **Webmail AJAX**: client de correu complet via navegador, amb la mateixa aparença i funcions que Thunderbird/Lightning.
- **Calendaris compartits**: gestió d'esdeveniments, recursos (sales, projectors), invitacions i planificació (*free/busy*).
- **Llibretes d'adreces compartides** i llibreta d'adreces global (GAL).
- **Tasques i notes**.
- **Protocols estàndard**: CalDAV, CardDAV, GroupDAV, WebDAV ACL, iMIP/iTIP per a la interoperabilitat amb clients de tercers.
- **Microsoft ActiveSync (EAS)**: sincronització nativa amb dispositius mòbils (Android, iOS) i amb Microsoft Outlook, sense necessitat de connectors MAPI de pagament.
- **Multidomini**: un mateix servidor pot allotjar diversos dominis de correu de manera aïllada.
- **Reutilització d'infraestructura existent**: IMAP (Dovecot, Cyrus), SMTP (Postfix), LDAP/AD (OpenLDAP, Samba AD-DC, Active Directory), base de dades (MariaDB/MySQL, PostgreSQL, Oracle).
- **Integració amb Thunderbird** mitjançant els complements *SOGo Connector* i *SOGo Integrator*.
- **Sincronització amb Outlook** mitjançant el connector lliure *Outlook CalDav Synchronizer*.
- **API DAV completa**, cosa que fa el sistema molt scriptable per a automatitzacions.
- **Zero Effort Groupware (ZEG)**: una OVA preconfigurada (SOGo + MySQL + Dovecot + Postfix + Apache + Samba 4) per fer proves ràpides sense haver de muntar tota la infraestructura.
- **Sieve**: per a gestionar filtres de correu des de la interfície web.
- **Backups**: SOGo inclou `sogo-tool` per fer còpies de seguretat de preferències, esdeveniments i contactes de cada usuari (vegeu la secció [Manteniment i eines](#manteniment-i-eines)).

# 4. Requisits

SOGo reutilitza serveis existents, així que abans d'instal·lar-lo cal tenir (o preveure instal·lar):

| Component | Opcions suportades |
|---|--------|
| Base de dades | MariaDB / MySQL, PostgreSQL, Oracle |
| Directori d'usuaris | OpenLDAP, Samba AD-DC, Microsoft Active Directory, Novell eDirectory |
| Servidor IMAP | Dovecot ≥ 2.x o Cyrus IMAP ≥ 2.4 (amb extensions ACL, UIDPLUS, QRESYNC/CONDSTORE i ANNOTATE o X-GUID si es vol ActiveSync) |
| Servidor SMTP | Postfix, Exim, etc. |
| Servidor web (proxy invers) | Apache2 o Nginx |
| Memòria compartida | Memcached (recomanat per a sessions i rendiment) |

Recursos de maquinari orientatius per a un entorn petit/mitjà (docència, laboratori, PIME):

> - CPU: 2 nuclis
> - RAM: 2 GB mínim, 4 GB recomanats en producció
> - Disc: depèn del volum de correu i adjunts (SOGo mateix no emmagatzema els correus, això ho fa l'IMAP)

# 5. Escenari d'aquest document

| Rol | Hostname | IP | Sistema |
|---|---|---|---|
| Servidor correu + SOGo | `correu` | `10.0.2.10` | Ubuntu Server 26.04 |
| Servidor OpenLDAP | `ldapserver` | `10.0.2.20` | Ubuntu Server 26.04 |
| Client| `client` | IP dinàmica: `10.0.2.14` | Ubuntu Desktop 26.04 |
| Domini LDAP | `dc=thos,dc=local` | — | — |

## 5.1. Topologia de xarxa

![Topologia de xarxa](https://proferamon.com/tic/imatges/sogo/sogo02.png)

## 5.2. Diagrama de fluxos d'autenticació

![Fluxos d'autenticació](https://proferamon.com/tic/imatges/sogo/sogo03.png)

# 6. PART 1: Implementació de la màquina `correu`

## 6.1. Configuració prèvia del sistema

Abans de començar, fes les configuracions bàsiques del servidor (hostname, IP, hosts, ports i actualització).

Canvia el nom de la màquina:

```bash
sudo hostnamectl set-hostname correu
```

Edita el fitxer de hosts:

```bash
sudo nano /etc/hosts
```

```nano
127.0.0.1 localhost
10.0.2.10 correu.thos.local correu
10.0.2.20 ldapserver.thos.local ldapserver
```

Actualitza la llista de paquets:

```bash
sudo apt update
```

Actualitza els paquets:

```bash
sudo apt upgrade
```

## 6.2. Certificat TLS únic per a tots els serveis d’aquesta màquina

Instal·la `ssl-cert` que crea un certificat autosignat SSL/TSL "snakeoil" i el grup d'usuaris `ssl-cert`:

```bash
sudo apt install ssl-cert
```

Crea la carpeta per als certificats de `thos.local`:

```bash
sudo mkdir -p /etc/ssl/thos
```

Genera un certificat autosignat per al servidor de correu:

```bash
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /etc/ssl/thos/correu.key \
  -out /etc/ssl/thos/correu.crt \
  -subj "/C=ES/ST=Catalunya/L=Mataro/O=IES Thos i Codina/OU=ASIX/CN=correu.thos.local"
```

Canvia els permisos de la clau:

```bash
sudo chmod 640 /etc/ssl/thos/correu.key
```

Canvia el propietari de la clau:

```bash
sudo chown root:ssl-cert /etc/ssl/thos/correu.key
```

## 6.3. Postfix

Instal·la Postfix:

```bash
sudo apt install postfix
```

| Pregunta | Resposta |
|---|---|
| Tipus de configuració | `Lloc d'Internet` |
| Nom del correu del sistema | `thos.local` |

### Autenticació SMTP (SASL via Dovecot)

Per configurar Postfix per a SMTP-AUTH mitjançant SASL (Dovecot SASL), executa aquestes ordres al terminal:

Delega l'autenticació a Dovecot:

```bash
sudo postconf -e 'smtpd_sasl_type = dovecot'
```

Indica la ruta:

```bash
sudo postconf -e 'smtpd_sasl_path = private/auth'
```

Deixa el domini local buit explícitament:

```bash
sudo postconf -e 'smtpd_sasl_local_domain ='
```

Prohibeix els mecanismes SASL que permeten autenticació anònima:

```bash
sudo postconf -e 'smtpd_sasl_security_options = noanonymous'
```

Activa compatibilitat amb clients de correu antics:

```bash
sudo postconf -e 'broken_sasl_auth_clients = yes'
```

Activa el mecanisme d'autenticació SMTP:

```bash
sudo postconf -e 'smtpd_sasl_auth_enable = yes'
```

Defineix la política de qui pot enviar correu cap a on. Si el client s'ha autenticat amb usuari/contrasenya (via SASL/Dovecot), es permet immediatament, sigui quina sigui la destinació. Si no s'ha autenticat, però la petició ve d'una xarxa de confiança definida a mynetworks (per exemple la teva pròpia xarxa interna `thos.local`), també es permet:

```bash
sudo postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks,reject_unauth_destination'
```

> [!NOTE]
> El paràmetre de configuració **smtpd_sasl_path** és una ruta relativa al directori de cua de Postfix, normalment `/var/spool/postfix/`.

Hi ha diverses propietats del mecanisme SASL que val la pena avaluar per millorar la seguretat del desplegament. L'opció "**noanonymous**" impedeix l'ús de mecanismes que permeten l'autenticació anònima.

### TLS (certificat compartit)

Configura el xifratge TLS de Postfix, tant per al correu que envia cap a fora (client SMTP) com per al que rep dels teus usuaris/clients (servidor SMTP).

Intenta sempre fer STARTTLS si el servidor remot ho ofereix, però si el remot no ho suporta, continua sense xifrar en lloc de fallar l'entrega. És el nivell més compatible, pensat perquè el correu surti igualment encara que el destinatari no tingui TLS.:

```bash
sudo postconf -e 'smtp_tls_security_level = may'
```

Exigeix STARTTLS abans d'acceptar el missatge:

```bash
sudo postconf -e 'smtpd_tls_security_level = encrypt'
```

Afegeix un avís als logs (`Warning: ... TLS is available but was not used`). És purament informatiu, per detectar servidors remots mal configurats:

```bash
sudo postconf -e 'smtp_tls_note_starttls_offer = yes'
```

Nivell de detall dels registres relacionats amb TLS al costat servidor. 1 és un nivell bàsic:

```bash
sudo postconf -e 'smtpd_tls_loglevel = 1'
```

Fa que Postfix afegeixi informació sobre el xifratge TLS usat dins la capçalera de cada missatge que rep:

```bash
sudo postconf -e 'smtpd_tls_received_header = yes'
```

Nom canònic del servidor de correu:

```bash
sudo postconf -e 'myhostname = correu.thos.local'
```

Ruta al certificat públic que Postfix presentarà als clients quan aquests facin STARTTLS:

```bash
sudo postconf -e 'smtpd_tls_cert_file=/etc/ssl/thos/correu.crt'
```

Ruta a la clau privada corresponent a aquest certificat:

```bash
sudo postconf -e 'smtpd_tls_key_file=/etc/ssl/thos/correu.key'
```

Canvia el propietari del fitxer `/var/spool/postfix/etc/resolv.conf`:

```bash
sudo chown root:root /var/spool/postfix/etc/resolv.conf
```

### SMTPS (465) i Submission (587)

SMTPS (port 465) és el protocol SMTP però amb xifratge TLS des del primer moment (TLS implícit). Es configura al fitxer `/etc/postfix/master.cf`

```bash
sudo nano -l /etc/postfix/master.cf
```

Comenta la línia 12: 

```nano 
#smtp      inet  n       -       n       -       -       smtpd
```

Enganxa aquestes línies a continuació de la línia 12:

```nano 
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
submission inet n - y - - smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o smtpd_tls_auth_only=yes
```

Comprova la sintaxi de la configuració:

```bash
sudo postfix check
```

Reinicia el dimoni de Postfix:

```bash
sudo systemctl restart postfix
```

Verifica l'estat:

```bash
sudo systemctl status postfix
```

Resposta esperada:

```ini
● postfix.service - Postfix Mail Transport Agent (main/default instance)
     Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; preset: enabled)
     Active: active (running) since Wed 2026-07-15 13:56:29 UTC; 4s ago
 Invocation: 2676a0780d9d457f9c60041a694cce81
       Docs: man:postfix(1)
    Process: 3697 ExecStartPre=postfix check (code=exited, status=0/SUCCESS)
    Process: 3803 ExecStart=postfix debian-systemd-start (code=exited, status=0/SUCCESS)
   Main PID: 3811 (master)
      Tasks: 3 (limit: 1718)
     Memory: 2.9M (peak: 4.1M)
        CPU: 222ms
     CGroup: /system.slice/postfix.service
             ├─3811 /usr/lib/postfix/sbin/master -w
             ├─3812 pickup -l -t unix -u
             └─3813 qmgr -l -t unix -u

de jul. 15 13:56:29 correu systemd[1]: Starting postfix.service - Postfix Mail Transport Agent (main/default instance)...
de jul. 15 13:56:29 correu postfix/master[3811]: daemon started -- version 3.10.6, configuration /etc/postfix
de jul. 15 13:56:29 correu systemd[1]: Started postfix.service - Postfix Mail Transport Agent (main/default instance).
```

## 6.4. Dovecot amb autenticació LDAP

Dovecot és el servidor IMAP/POP3 que permet accés a les bústies, i també s'utilitza per autenticació (SASL).

Instal·la Dovecot:

```bash
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d dovecot-ldap
```

### Certificat TLS

Edita la configuració específica de Dovecot relativa als paràmetres SSL/TLS:

```bash
sudo nano /etc/dovecot/conf.d/10-ssl.conf
```

Comenta les línies:

```nano
#ssl_server_cert_file = /etc/dovecot/private/dovecot.pem
#ssl_server_key_file = /etc/dovecot/private/dovecot.key
```

Afegeix les línies: 

```nano
ssl_server_cert_file = /etc/ssl/thos/correu.crt
ssl_server_key_file = /etc/ssl/thos/correu.key
```

### Esquema de bústies vmail

Crea el grup `vmail`:

```bash
sudo groupadd -g 5000 vmail
```

Crea l'usuari `vmail`:

```bash
sudo useradd -u 5000 -g vmail -d /var/mail/vhosts \
  -s /usr/sbin/nologin vmail
```

Crea la carpeta *home* de l'usuari `vmail`:

```bash
sudo mkdir -p /var/mail/vhosts
```

Canvia el propietari i el grup de la carpeta:

```bash
sudo chown vmail:vmail /var/mail/vhosts
```

Canvia els permisos:

```bash
sudo chmod 700 /var/mail/vhosts
```

Edita la configuració de Dovecot que defineix on i com s'emmagatzemen els correus dels usuaris (el "mail storage"):

```bash
sudo nano /etc/dovecot/conf.d/10-mail.conf
```

Comenta:

```nano
#mail_driver = mbox
#mail_home = /home/%{user | username}
#mail_path = %{home}/mail
#mail_inbox_path = /var/mail/%{user}
```

Afegeix:

```nano
mail_driver = maildir
mail_path = /var/mail/vhosts/%{user}
mailbox_list_layout = fs
```

### Autenticació d'usuaris LDAP 

Defineix el mecanisme d'autenticació general de Dovecot: quins mètodes es permeten, si es permet autenticació en clar, i quins "backends" s'activen.
 
```bash 
sudo nano -l /etc/dovecot/conf.d/10-auth.conf
```

Comenta la línia 116:

```nano
#!include auth-system.conf.ext
```

Descomenta les línies:

```nano
!include auth-ldap.conf.ext
auth_mechanisms = plain login
```

Defineix com Dovecot es connecta al servidor LDAP per validar credencials i obtenir informació de l'usuari (com el seu home, uid/gid, o la ruta del maildir):

```bash
sudo nano /etc/dovecot/conf.d/auth-ldap.conf.ext
```

Afegeix al final:

```nano 
ldap_uris = ldap://ldapserver.thos.local
ldap_auth_dn = cn=admin,dc=thos,dc=local
ldap_auth_dn_password = CONTRASENYA_LDAP
ldap_base = ou=Usuaris,dc=thos,dc=local
passdb ldap {
  passdb_ldap_filter = (|(uid=%{user})(mail=%{user}))
  ldap_bind = yes
  fields {
    user = %{ldap:uid}
  }
}
userdb ldap {
  userdb_ldap_filter = (|(uid=%{user})(mail=%{user}))
  fields {
    user = %{ldap:uid}
    uid = vmail
    gid = vmail
    home = /var/mail/vhosts/%{ldap:uid}
  }
}
```

Defineix els processos i sockets que Dovecot fa servir internament — no és tan sobre "com autenticar" o "on són els correus", sinó sobre com es comuniquen entre si els diferents components de Dovecot.

```bash
sudo nano -l /etc/dovecot/conf.d/10-master.conf
```

Afegeix a la línia 108:

```nano  
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
```

Mostra la configuració efectiva de Dovecot, però amb una particularitat important: només mostra les directives que difereixen dels valors per defecte (o que has configurat explícitament), no tot el fitxer de configuració complet, i detecta errors de sintaxi immediatament:

```bash  
sudo doveconf -n
```

Reinicia el dimoni:

```bash
sudo systemctl restart dovecot
```

Verifica l'estat del servei:

```bash
sudo systemctl status dovecot
```

Resposta esperada:

```ini
● dovecot.service - Dovecot IMAP/POP3 email server
     Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; preset: enabled)
     Active: active (running) since Wed 2026-07-15 14:10:32 UTC; 7s ago
 Invocation: 5dd78e1a7c7546f1978edac259315063
       Docs: man:dovecot(1)
             https://doc.dovecot.org/
   Main PID: 6962 (dovecot)
     Status: "v2.4.2 (0962ed2104) running"
      Tasks: 4 (limit: 1718)
     Memory: 7.5M (peak: 9.5M)
        CPU: 47ms
     CGroup: /system.slice/dovecot.service
             ├─6962 /usr/sbin/dovecot -F
             ├─6965 dovecot/anvil
             ├─6966 dovecot/log
             └─6967 dovecot/config

de jul. 15 14:10:32 correu systemd[1]: Starting dovecot.service - Dovecot IMAP/POP3 email server...
de jul. 15 14:10:32 correu dovecot[6962]: master: Dovecot v2.4.2 (0962ed2104) starting up for imap, pop3 (core dumps disabled)
de jul. 15 14:10:32 correu systemd[1]: Started dovecot.service - Dovecot IMAP/POP3 email server.
```

# 7. PART 2: Implementació de la màquina `ldapserver`

## 7.1. Prepara el sistema

Actualitza la llista de paquets:

```bash
sudo apt update
```

Actualitza el sistema:

```bash
sudo apt upgrade
```

Configura el hostname:

```bash
sudo hostnamectl set-hostname ldapserver
```

Afegeix l'entrada al fitxer `/etc/hosts`:

```bash
sudo nano /etc/hosts
```

Afegeix aquestes línies:

```nano
10.0.2.10 correu.thos.local correu
10.0.2.20 ldapserver.thos.local ldapserver
```

Comprova:

```bash
hostname -f
```

Resposta esperada:

```ini
ldapserver.thos.local
```

## 7.2. Instal·la els paquets de LDAP

```bash
sudo apt install slapd ldap-utils
```

Durant la instal·lació, el sistema demanarà la **contrasenya de l'administrador LDAP**. Introdueix-la i confirma-la.

> [!IMPORTANT] 
> Recorda aquesta contrasenya; és la de `cn=admin,dc=thos,dc=local`. Al llarg d'aquest document apareix diverses vegades com: **CONTRASENYA_LDAP**

## 7.3. Verifica la instal·lació

Comprova que el servei està actiu:

```bash
sudo systemctl status slapd
```

Resposta esperada:

```ini
● slapd.service - OpenLDAP Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; preset: enabled)
     Active: active (running) since Wed 2026-07-15 14:14:09 UTC; 1min 26s ago
 Invocation: 8e814a25fc784a1ca82e56a7e41380d4
       Docs: man:slapd
             man:slapd-config
             man:slapd-mdb
   Main PID: 3446 (slapd)
      Tasks: 3 (limit: 1718)
     Memory: 3M (peak: 3.4M)
        CPU: 16ms
     CGroup: /system.slice/slapd.service
             └─3446 /usr/sbin/slapd -d0 -h "ldap:/// ldapi:///" -u openldap -g openldap

de jul. 15 14:14:09 ldapserver systemd[1]: Starting slapd.service - OpenLDAP Server Daemon...
de jul. 15 14:14:09 ldapserver slapd[3446]: @(#) $OpenLDAP: slapd 2.6.10+dfsg-1ubuntu5 (Nov 24 2025 11:17:55) $
                                                    Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
de jul. 15 14:14:09 ldapserver slapd[3446]: slapd starting
de jul. 15 14:14:09 ldapserver systemd[1]: Started slapd.service - OpenLDAP Server Daemon.
```

Comprova que escolta al port 389:

```bash
sudo ss -tlnp | grep slapd
```

Resposta esperada:

```ini
LISTEN 0      2048         0.0.0.0:389       0.0.0.0:*    users:(("slapd",pid=3446,fd=7))
LISTEN 0      2048            [::]:389          [::]:*    users:(("slapd",pid=3446,fd=8)) 
```

Prova de connexió bàsica (sense autenticació):

```bash
ldapsearch -x -b "dc=thos,dc=local" -H ldap://localhost
```

Resposta esperada:

```ini
# extended LDIF
#
# LDAPv3
# base <dc=thos,dc=local> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# thos.local
dn: dc=thos,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: thos.local
dc: thos

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
```

Prova amb autenticació d'administrador:

```bash
ldapsearch -x -D "cn=admin,dc=thos,dc=local" -W -b "dc=thos,dc=local"
```

La resposta ha de mostrar l'entrada arrel del directori.

Resposta esperada:

```ini
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=thos,dc=local> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# thos.local
dn: dc=thos,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: thos.local
dc: thos

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
```

## 7.4. Activa el log del servidor

Crea el fitxer `log.ldif`:

```bash
sudo nano log.ldif
```

```nano
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
```

Aplica'l:

```bash
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f log.ldif
```

Configura `rsyslog` per separar els logs de LDAP:

```bash
sudo nano /etc/rsyslog.d/10-slapd.conf
```

```nano
local4.*    /var/log/slapd.log
```

Reinicia syslog:

```bash
sudo systemctl restart rsyslog
```

Reinicia ldap:

```bash
sudo systemctl restart slapd
```

## 7.5. Afegeix índexs per millorar el rendiment

```bash
sudo nano index.ldif
```

```nano
# fitxer: index.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcDbIndex
olcDbIndex: objectClass eq
olcDbIndex: uid eq,pres,sub
olcDbIndex: cn eq,pres,sub
olcDbIndex: sn eq,pres,sub
olcDbIndex: mail eq,pres,sub
olcDbIndex: memberUid eq
```

```bash
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif
```

## 7.6. Crea les unitats organitzatives bàsiques

Crea el fitxer `estructura.ldif`:

```bash
sudo nano estructura.ldif
```

```nano
# Unitat organitzativa: Usuaris
dn: ou=Usuaris,dc=thos,dc=local
objectClass: organizationalUnit
ou: Usuaris
description: Usuaris del sistema

# Unitat organitzativa: Grups
dn: ou=Grups,dc=thos,dc=local
objectClass: organizationalUnit
ou: Grups
description: Grups del sistema
```

Importa l'estructura:

```bash
ldapadd -x -D "cn=admin,dc=thos,dc=local" -W -f estructura.ldif
```

Resposta esperada:

```ini
Enter LDAP Password: 
adding new entry "ou=Usuaris,dc=thos,dc=local"

adding new entry "ou=Grups,dc=thos,dc=local"
```

Verifica:

```bash
ldapsearch -x -b "dc=thos,dc=local" -H ldap://localhost "(objectClass=organizationalUnit)"
```

Resposta esperada:

```ini
# extended LDIF
#
# LDAPv3
# base <dc=thos,dc=local> with scope subtree
# filter: (objectClass=organizationalUnit)
# requesting: ALL
#

# Usuaris, thos.local
dn: ou=Usuaris,dc=thos,dc=local
objectClass: organizationalUnit
ou: Usuaris
description: Usuaris del sistema

# Grups, thos.local
dn: ou=Grups,dc=thos,dc=local
objectClass: organizationalUnit
ou: Grups
description: Grups del sistema

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2
```

## 7.7. Crea usuaris

Primer, genera un hash de contrasenya:

Introdueix la contrasenya i et retornarà el hash {SSHA}...

```bash
slappasswd
```

Resposta esperada:

```ini
New password: 
Re-enter new password: 
{SSHA}TBIdrK2UoZVHk6h9bORCURCYz/3DccH2
```

Crea el fitxer `usuaris.ldif`:

```bash
sudo nano usuaris.ldif
```

```nano
# Usuari: Joan Garcia
dn: uid=joan,ou=Usuaris,dc=thos,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: joan
cn: Joan Garcia
sn: Garcia
givenName: Joan
displayName: Joan Garcia
mail: joan@thos.local
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/joan
loginShell: /bin/bash
userPassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

# Usuari: Maria Puig
dn: uid=maria,ou=Usuaris,dc=thos,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: maria
cn: Maria Puig
sn: Puig
givenName: Maria
displayName: Maria Puig
mail: maria@thos.local
uidNumber: 10002
gidNumber: 10001
homeDirectory: /home/maria
loginShell: /bin/bash
userPassword: {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

> [!IMPORTANT] 
> Substitueix `{SSHA}XXXXX...` pel hash generat amb `slappasswd`.

```bash
ldapadd -x -D "cn=admin,dc=thos,dc=local" -W -f usuaris.ldif
```

Resposta esperada:

```ini
Enter LDAP Password: 
adding new entry "uid=joan,ou=Usuaris,dc=thos,dc=local"

adding new entry "uid=maria,ou=Usuaris,dc=thos,dc=local"
```

## 7.8. Crea grups

Crea el fitxer `grups.ldif`:

```bash
sudo nano grups.ldif
```

```nano
# Grup: professors
dn: cn=professors,ou=Grups,dc=thos,dc=local
objectClass: posixGroup
cn: professors
gidNumber: 10001
memberUid: joan
memberUid: maria

# Grup: alumnes
dn: cn=alumnes,ou=Grups,dc=thos,dc=local
objectClass: posixGroup
cn: alumnes
gidNumber: 10002
```

```bash
ldapadd -x -D "cn=admin,dc=thos,dc=local" -W -f grups.ldif
```

Resposta esperada:

```ini
Enter LDAP Password: 
adding new entry "cn=professors,ou=Grups,dc=thos,dc=local"

adding new entry "cn=alumnes,ou=Grups,dc=thos,dc=local"
```

# 8. PART 3: Continuació de la implementació de la màquina `correu`

## 8.1. Verificació de LDAP (client-side)

Instal·la les eines de línia d'ordres per interactuar directament amb servidors LDAP:

```bash
sudo apt install ldap-utils
```

Consulta la resolució de noms del sistema per a `ldapserver.thos.local`:

```bash
getent hosts ldapserver.thos.local
```

Resposta esperada:

```ini
10.0.2.20       ldapserver.thos.local ldapserver
```

Consulta LDAP per verificar l'existència (i el DN) de l'usuari joan:

```bash
ldapsearch -x -H ldap://ldapserver.thos.local \
  -D "cn=admin,dc=thos,dc=local" \
  -w CONTRASENYA_LDAP \
  -b "ou=Usuaris,dc=thos,dc=local" "(uid=joan)" dn
```

Resposta esperada:

```ini
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
-b: command not found
```

## 8.2. Dovecot: entrega LMTP i comunicació amb Postfix

Demana a Dovecot que llisti les bústies (mailboxes/carpetes) de l'usuari joan:

```bash
sudo doveadm mailbox list -u joan
```

Resposta esperada:

```ini
INBOX
```

Instal·la el paquet que afegeix el suport per al protocol LMTP (Local Mail Transfer Protocol) a Dovecot:

```bash
sudo apt install dovecot-lmtpd
```

Modifica la definició els processos i sockets que Dovecot fa servir internament — no és tan sobre "com autenticar" o "on són els correus", sinó sobre com es comuniquen entre si els diferents components de Dovecot.

```bash
sudo nano /etc/dovecot/conf.d/10-master.conf
```

Dins del bloc `service lmtp { ... }`, afegeix:

```nano
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
```

## 8.3. Postfix: mapa LDAP per a destinataris

Afegeix a Postfix el suport per consultar mapes (maps) directament des d'un servidor LDAP:

```bash
sudo apt install postfix-ldap
```

Edita el fitxer de configuració de mapa LDAP per a Postfix:

```bash
sudo nano /etc/postfix/ldap-users.cf
```

```nano
server_host = ldapserver.thos.local
search_base = ou=Usuaris,dc=thos,dc=local
bind = yes
bind_dn = cn=admin,dc=thos,dc=local
bind_pw = CONTRASENYA_LDAP
query_filter = (mail=%s)
result_attribute = mail
```

Canvia els permisos:

```bash
sudo chmod 640 /etc/postfix/ldap-users.cf
```

Canvia el grup:

```bash
sudo chgrp postfix /etc/postfix/ldap-users.cf
```

## 8.4. Postfix: configuració de dominis virtuals

Defineix la llista de dominis pels quals Postfix accepta correu com a destinatari final via virtual mailboxes:

```bash
sudo postconf -e 'virtual_mailbox_domains = thos.local'
```

Defineix quin mecanisme de transport fa servir Postfix per lliurar correu als destinataris dels dominis virtuals:

```bash
sudo postconf -e 'virtual_transport = lmtp:unix:private/dovecot-lmtp'
```

Indica que, en lloc d'un mapa estàtic, Postfix consultarà en temps real el fitxer LDAP configurat:

```bash
sudo postconf -e 'virtual_mailbox_maps = ldap:/etc/postfix/ldap-users.cf'
```

Fixa `mydestination` explícitament al valor "segur" per defecte:

```bash
sudo postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost'
```

## 8.5. Validació i aplicació dels canvis

Valida la configuració i l'entorn de Postfix:

```bash
sudo postfix check
```

Reinicia el servei Dovecot:

```bash
sudo systemctl restart dovecot
```

Comprova l'estat del servei Dovecot:

```bash
sudo systemctl status dovecot
```

Resposta esperada:

```ini
● dovecot.service - Dovecot IMAP/POP3 email server
     Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; preset: enabled)
     Active: active (running) since Wed 2026-07-15 14:27:54 UTC; 35s ago
 Invocation: 7439f50a31d54dde87a8a4c6be272946
       Docs: man:dovecot(1)
             https://doc.dovecot.org/
   Main PID: 7848 (dovecot)
     Status: "v2.4.2 (0962ed2104) running"
      Tasks: 4 (limit: 1718)
     Memory: 7.5M (peak: 9.7M)
        CPU: 49ms
     CGroup: /system.slice/dovecot.service
             ├─7848 /usr/sbin/dovecot -F
             ├─7849 dovecot/anvil
             ├─7850 dovecot/log
             └─7851 dovecot/config

de jul. 15 14:27:54 correu systemd[1]: Starting dovecot.service - Dovecot IMAP/POP3 email server...
de jul. 15 14:27:54 correu dovecot[7848]: master: Dovecot v2.4.2 (0962ed2104) starting up for imap, lmtp, pop3 (core dumps disabled)
de jul. 15 14:27:54 correu systemd[1]: Started dovecot.service - Dovecot IMAP/POP3 email server.
```

Reinicia el servei Postfix:

```bash
sudo systemctl restart postfix
```

Comprova l'estat del servei Postfix:

```bash
sudo systemctl status posfix
```

Resposta esperada:

```ini
● postfix.service - Postfix Mail Transport Agent (main/default instance)
     Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; preset: enabled)
     Active: active (running) since Wed 2026-07-15 14:27:59 UTC; 2min 44s ago
 Invocation: e39eab1d6ac741c386a20cb8711b2309
       Docs: man:postfix(1)
    Process: 7867 ExecStartPre=postfix check (code=exited, status=0/SUCCESS)
    Process: 7972 ExecStart=postfix debian-systemd-start (code=exited, status=0/SUCCESS)
   Main PID: 7980 (master)
      Tasks: 3 (limit: 1718)
     Memory: 2.9M (peak: 4.3M)
        CPU: 221ms
     CGroup: /system.slice/postfix.service
             ├─7980 /usr/lib/postfix/sbin/master -w
             ├─7981 pickup -l -t unix -u
             └─7982 qmgr -l -t unix -u

de jul. 15 14:27:59 correu systemd[1]: Starting postfix.service - Postfix Mail Transport Agent (main/default instance)...
de jul. 15 14:27:59 correu postfix/master[7980]: daemon started -- version 3.10.6, configuration /etc/postfix
de jul. 15 14:27:59 correu systemd[1]: Started postfix.service - Postfix Mail Transport Agent (main/default instance).
```

## 8.6. Activa el dipòsit universe i actualitza

Ubuntu 26.04 LTS ja inclou el paquet `sogo` al dipòsit **universe**, amb la versió `5.12.4`, així que **no cal afegir el dipòsit de pagament d'Alinto** per fer proves o per a un ús no crític; n'hi ha prou amb els dipòsits oficials d'Ubuntu.

> [!WARNING]
> Si es vol la darrera versió amb suport oficial d'Alinto (actualitzacions més ràpides, suport professional), cal donar-se d'alta al dipòsit de producció `https://packages.sogo.nu/` amb usuari i contrasenya. Aquest document se centra en la via lliure (paquet d'`universe`).

Activa el dipòsit `universe`:

```bash
sudo add-apt-repository universe
```

Actualitza la llista de paquets:

```bash
sudo apt update
```

## 8.7. Instal·la el motor de base de dades MariaDB

```bash
sudo apt install mariadb-server
```

Un cop instal·lat, assegura’l:

```bash
sudo mariadb-secure-installation
```

Respon afirmativament a totes les preguntes (establir contrasenya root, eliminar usuaris anònims, desactivar accés remot de root, eliminar la base de dades de test i recarregar privilegis).

## 8.8. Crea la base de dades

Accedeix a MariaDB com a root:

```bash
sudo mysql -u root -p
```

Executa dins de la consola SQL:

```sql
CREATE DATABASE sogo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'sogo'@'localhost' IDENTIFIED BY 'CONTRASENYA_BBDD';
CREATE USER 'sogo'@'127.0.0.1' IDENTIFIED BY 'CONTRASENYA_BBDD';
GRANT ALL PRIVILEGES ON sogo.* TO 'sogo'@'localhost';
GRANT ALL PRIVILEGES ON sogo.* TO 'sogo'@'127.0.0.1';
FLUSH PRIVILEGES;
EXIT;
```

## 8.9. Instal·la SOGo i dependències

```bash
sudo apt install sogo sogo-activesync memcached
```

Aquesta instal·lació inclou:

> - `sogo` / `sogo-common`: el dimoni `sogod` i fitxers comuns
> - `sogo-activesync`: mòdul opcional per a sincronització amb mòbils via EAS
> - `memcached`: emmagatzematge en memòria per a sessions i rendiment

## 8.10. Configura SOGo

```bash
sudo nano /etc/sogo/sogo.conf
```

Substitueix-ho tot per:

```nano  
{
  SOGoProfileURL = "mysql://sogo:CONTRASENYA_BBDD@127.0.0.1:3306/sogo/sogo_user_profile";
  OCSFolderInfoURL = "mysql://sogo:CONTRASENYA_BBDD@127.0.0.1:3306/sogo/sogo_folder_info";
  OCSSessionsFolderURL = "mysql://sogo:CONTRASENYA_BBDD@127.0.0.1:3306/sogo/sogo_sessions_folder";
  OCSEMailAlarmsFolderURL = "mysql://sogo:CONTRASENYA_BBDD@127.0.0.1:3306/sogo/sogo_alarms_folder";
  SOGoLanguage = Catalan;
  SOGoAppointmentSendEMailNotifications = YES;
  SOGoMailingMechanism = smtp;
  SOGoTimeZone = "Europe/Madrid";

  SOGoSentFolderName = Sent;
  SOGoTrashFolderName = Trash;
  SOGoDraftsFolderName = Drafts;

  SOGoSMTPServer = "smtps://correu.thos.local:465";
  SOGoSMTPAuthenticationType = PLAIN;
  SOGoIMAPServer = "imaps://correu.thos.local:993";
  SOGoSieveServer = "sieve://correu.thos.local:4190/?tls=YES";
  SOGoIMAPAclConformsToIMAPExt = YES;

  SOGoVacationEnabled = NO;
  SOGoForwardEnabled = NO;
  SOGoSieveScriptsEnabled = NO;
  SOGoFirstDayOfWeek = 0;
  SOGoMailMessageCheck = manually;
  SOGoMailAuxiliaryUserAccountsEnabled = NO;
  SOGoMemcachedHost = 127.0.0.1;

  SOGoMailDomain = "thos.local";

  SOGoUserSources = (
    {
      type = ldap;
      CNFieldName = cn;
      IDFieldName = uid;
      UIDFieldName = uid;
      baseDN = "ou=Usuaris,dc=thos,dc=local";
      bindDN = "cn=admin,dc=thos,dc=local";
      bindPassword = "CONTRASENYA_LDAP";
      hostname = "ldap://ldapserver.thos.local";
      id = "IES Thos i Codina";
      canAuthenticate = YES;
      isAddressBook = YES;
    },
    {
      type = ldap;
      CNFieldName = cn;
      IDFieldName = uid;
      UIDFieldName = mail;
      baseDN = "ou=Usuaris,dc=thos,dc=local";
      bindDN = "cn=admin,dc=thos,dc=local";
      bindPassword = "CONTRASENYA_LDAP";
      hostname = "ldap://ldapserver.thos.local";
      id = directory_mail;
      canAuthenticate = YES;
      isAddressBook = NO;
    }
  );
}
```

Canvia el propietari i el grup:

```bash
sudo chown sogo:sogo /etc/sogo/sogo.conf
```

Canvia els permisos:

```bash
sudo chmod 600 /etc/sogo/sogo.conf
```

## 8.11. Proxy invers

Instal·la el servidor web Apache:

```bash
sudo apt install apache2
```

Habilita els mòduls:

```bash
sudo a2enmod proxy proxy_http headers rewrite ssl
```

Afegeix l'usuari `www-data` al grup `ssl-cert`:

```bash
sudo usermod -aG ssl-cert www-data
```

Defineix com Apache actua de proxy invers cap al servidor SOGo, el qual internament escolta en un altre port (el 20000) via el seu propi dimoni: 

```bash
sudo nano /etc/apache2/conf-available/sogo.conf
```

Afegeix:

```nano  
<Location /SOGo>
    ProxyPass        http://127.0.0.1:20000/SOGo retry=0
    ProxyPassReverse http://127.0.0.1:20000/SOGo
    Require all granted
</Location>

Alias /SOGo.woa/WebServerResources/ /usr/lib/x86_64-linux-gnu/GNUstep/SOGo/WebServerResources/
Alias /SOGo/WebServerResources/ /usr/lib/x86_64-linux-gnu/GNUstep/SOGo/WebServerResources/

<Directory /usr/lib/x86_64-linux-gnu/GNUstep/SOGo/WebServerResources/>
    Require all granted
</Directory>

RewriteEngine On
RewriteRule ^/.well-known/caldav /SOGo/dav [R]
RewriteRule ^/.well-known/carddav /SOGo/dav [R]

<Location /SOGo/WebServerResources>
    ProxyPass !
</Location>
```

Activa el fitxer de configuració de SOGo:

```bash
sudo a2enconf sogo
```

## 8.12. VirtualHosts

Configura el VirtualHost del protocol HTTPS:

```bash
sudo nano /etc/apache2/sites-available/sogo-ssl.conf
```

Afegeix:

```nano  
<VirtualHost *:443>
  ServerName correu.thos.local

  SSLEngine on
  SSLCertificateFile /etc/ssl/thos/correu.crt
  SSLCertificateKeyFile /etc/ssl/thos/correu.key

  ProxyRequests Off
  ProxyPreserveHost On

  RequestHeader set "x-webobjects-server-port" "443"
  RequestHeader set "x-webobjects-server-name" "correu.thos.local"
  RequestHeader set "x-webobjects-server-url" "https://correu.thos.local"
  RequestHeader set "x-webobjects-adaptor-version" "mod_proxy"

  Include /etc/apache2/conf-available/sogo.conf
</VirtualHost>
```

Modifica la pàgina per defecte perquè redirigeixi cap a HTTPS:

```bash
sudo nano /etc/apache2/sites-available/000-default.conf
```

Afegeix abans de `</VirtualHost>`:

```nano
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

Activa el fitxer de configuració del site:

```bash  
sudo a2ensite sogo-ssl
```

Comprova la sintaxi:

```bash
sudo apache2ctl configtest
```

Resposta esperada:

```ini
Syntax OK
```

Reinicia el servidor Apache:

```bash
sudo systemctl restart apache2
```

Verifica l'estat del servei:

```bash
sudo systemctl status apache2
```

Resposta esperada:

```ini
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
     Active: active (running) since Wed 2026-07-15 14:43:44 UTC; 10s ago
 Invocation: b85f3f0d6ae64073b61024aac0a4751b
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 11711 (apache2)
     Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
      Tasks: 55 (limit: 1718)
     Memory: 7.4M (peak: 7.4M)
        CPU: 37ms
     CGroup: /system.slice/apache2.service
             ├─11711 /usr/sbin/apache2 -k start -DFOREGROUND
             ├─11714 /usr/sbin/apache2 -k start -DFOREGROUND
             └─11715 /usr/sbin/apache2 -k start -DFOREGROUND

de jul. 15 14:43:44 correu systemd[1]: Starting apache2.service - The Apache HTTP Server...
de jul. 15 14:43:44 correu systemd[1]: Started apache2.service - The Apache HTTP Server.
```

## 8.13. Certificats

Copia el certificat de `thos.local` a la carpeta on Ubuntu busca certificats de CA addicionals per confiar-hi a escala de sistema:

```bash
sudo cp /etc/ssl/thos/correu.crt /usr/local/share/ca-certificates/correu-thos-local.crt
```

Crida l'eina d'Ubuntu que reconstrueix el magatzem de confiança de certificats del sistema:

```bash
sudo update-ca-certificates --fresh
```

Resposta esperada:

```ini
Clearing symlinks in /etc/ssl/certs...
done.
Updating certificates in /etc/ssl/certs...
rehash: warning: skipping ca-certificates.crt, it does not contain exactly one certificate or CRL
122 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
```

## 8.14. Engega o reinicia els serveis

Habilita l'engegada del servei `memcached` en l'arrencada i activa'l ara mateix:

```bash
sudo systemctl enable --now memcached
```

Habilita l'engegada del servei `sogo` en l'arrencada:

```bash
sudo systemctl enable sogo
```

Reinicia SOGo:

```bash
sudo systemctl restart sogo
```

Reinicia Postfix:

```bash
sudo systemctl restart postfix
```

Reinicia Dovecot:

```bash
sudo systemctl restart dovecot
```

Verifica l'estat del servei SOGo:

```bash
sudo systemctl status sogo
```

Resposta esperada:

```ini
● sogo.service - SOGo is a groupware server
     Loaded: loaded (/usr/lib/systemd/system/sogo.service; enabled; preset: enabled)
     Active: active (running) since Wed 2026-07-15 14:48:39 UTC; 18s ago
 Invocation: ab9cd76a157f4703b0862695d1c4cb07
       Docs: https://sogo.nu/files/docs/SOGoInstallationGuide.html
    Process: 13414 ExecStart=/usr/sbin/sogod -WOWorkersCount ${PREFORK} -WOPidFile /run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log (code=exited, status=0/SUCCESS)
   Main PID: 13418 (sogod)
      Tasks: 4 (limit: 1718)
     Memory: 45.4M (peak: 45.7M)
        CPU: 163ms
     CGroup: /system.slice/sogo.service
             ├─13418 /usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log
             ├─13419 /usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log
             ├─13420 /usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log
             └─13421 /usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log

de jul. 15 14:48:39 correu systemd[1]: Starting sogo.service - SOGo is a groupware server...
de jul. 15 14:48:39 correu systemd[1]: Started sogo.service - SOGo is a groupware server.
```

## 8.15. Accedeix a la interfície gràfica

L'accés web queda disponible a `https://correu.thos.local/SOGo/` 

![Prem el botó Advanced](https://proferamon.com/tic/imatges/sogo/sogo04.png)

---

![Prem to correu.thos.local (Risky)](https://proferamon.com/tic/imatges/sogo/sogo05.png)

---

![Finestra d'inici de sessió de SOGo](https://proferamon.com/tic/imatges/sogo/sogo06.png)

---

![Accedeix amb un usuari LDAP](https://proferamon.com/tic/imatges/sogo/sogo07.png)

---

![Interfície de gestió del correu](https://proferamon.com/tic/imatges/sogo/sogo08.png)

---

![Redacció d'un missatge](https://proferamon.com/tic/imatges/sogo/sogo09.png)

---

![Missatge enviat](https://proferamon.com/tic/imatges/sogo/sogo10.png)

---

![Accedeix amb l'usuari destinatari](https://proferamon.com/tic/imatges/sogo/sogo11.png)

---

![Tens un nou missatge a la safata d'entrada](https://proferamon.com/tic/imatges/sogo/sogo12.png)

---

![Lectura del missatge](https://proferamon.com/tic/imatges/sogo/sogo13.png)

---

![Resposta al remitent](https://proferamon.com/tic/imatges/sogo/sogo14.png)

---

![Missatge respost al remitent](https://proferamon.com/tic/imatges/sogo/sogo15.png)

# 9. Calendaris

## 9.1. Comparteix un calendari des de la interfície web

1. Inicia sessió com a `joan`.
2. Prem el botó dels **Calendaris**.
3. Fes clic dret sobre **Calendari personal** (el calendari per defecte) → **Compartir...**

   ![Comparteix calendari](https://proferamon.com/tic/imatges/sogo/sogo16.png)

4. Cerca l'usuari amb qui el vulguis compartir. En l'exemple: `maria@thos.local`
5. Marca **Subscriure usuari**.
6. Marca el nivell d'accés que vulguis donar-li (d'ordre creixent d'accés):

   > | Permís | Què permet |
   > |---|--------|
   > | **Veure data i hora** | Només veu que hi ha un esdeveniment, sense detalls |
   > | **Veure-ho tot** | Veu tots els detalls de l'esdeveniment |
   > | **Respondre** | Pot acceptar/rebutjar invitacions (implica "Veure-ho tot") |
   > | **Modificar** | Pot editar esdeveniments (implica "Veure-ho tot" i "Respondre") |

   > També hi ha caselles separades per permetre **crear** i **esborrar** esdeveniments, independents del nivell anterior.

   ![Tria les opcions de compartició](https://proferamon.com/tic/imatges/sogo/sogo17.png)

7. Guarda els canvis.

   ![Calendari compartit amb un esdeveniment](https://proferamon.com/tic/imatges/sogo/sogo18.png)

## 9.2. Subscriu-te al calendari compartit

1. Inicia sessió com a `maria`.
2. A la pestanya **Calendaris** → **Subscripcions**
3. Hauria d'aparèixer el `Calendari personal de joan` a la llista (si `maria` ja té algun permís assignat).

   ![Calendari compartit](https://proferamon.com/tic/imatges/sogo/sogo19.png)

4. Els esdeveniments de `joan` són visibles.

   ![Esdeveniment](https://proferamon.com/tic/imatges/sogo/sogo20.png)

## 9.3. Automatitza-ho: permisos per defecte per a tots els usuaris

Si vols que **tots** els usuaris comparteixin automàticament, per exemple, la disponibilitat (`Veure data i hora`) amb la resta sense haver-ho de fer manualment cada cop, hi ha un paràmetre a `sogo.conf`:

```nano
SOGoCalendarDefaultRoles = ("PublicViewer");
```

Aquest s'aplica als esdeveniments marcats com a **públics** de tots els calendaris personals nous.

## 9.4. Gestió per línia d'ordres (útil per a scripts/automatització massiva)

Si mai vols assignar permisos de calendari a molts usuaris alhora (per exemple, tots els alumnes d'un grup compartint amb el professor), `sogo-tool` ho permet sense passar per la interfície web:

```bash
sudo sogo-tool manage-acl add joan Calendar/personal maria '["PublicViewer","ConfidentialViewer"]'
```

# 10. Llibreta d'adreces

Com que ja has configurat `isAddressBook = YES` a la primera font LDAP de `sogo.conf`, **la llibreta d'adreces global (GAL) ja està activa des del principi** — cada usuari ha de veure automàticament la resta d'usuaris del directori LDAP com a contactes, sense haver de configurar res més.

## 10.1. Comprova que la GAL ja funciona

1. Inicia sessió com a `joan`.
2. Ves a la pestanya **Llibretes d'adreces**.
3. Hauries de veure, a més de "Personal", una entrada tipus **Llibretes d'adreces globals** amb el nom exacte que has definit al fitxer `/etc/sogo/sogo.conf` (`id = "IES Thos i Codina";`).

   ![Llibreta d'adreces global](https://proferamon.com/tic/imatges/sogo/sogo21.png)

4. Cerca `maria` — hauria d'aparèixer automàticament, sense que ningú l'hagi afegit manualment.

   ![Recerca a la llibreta d'adreces](https://proferamon.com/tic/imatges/sogo/sogo22.png)

## 10.2. Només de lectura

La GAL (basada en LDAP) és **només de lectura** — els usuaris no hi poden afegir ni editar contactes. Si un usuari vol un contacte propi editable, ha d'anar a la seva llibreta **Personal**.

![Llibreta d'adreces personal](https://proferamon.com/tic/imatges/sogo/sogo23.png)

## 10.3. Comparteix una llibreta d'adreces personal

Si `joan` vol compartir la seva llibreta *Personal* (per exemple, una llista de contactes externs que ha anat creant) amb `maria`:

1. Llibretes d'adreces → clic sobre **Llibreta personal d'adreces** → **Compartir...**
2. Afegeix `maria`, i marca **Subscriure usuari**.
3. Tria el nivell d'accés: **Visualitzador** (només lectura) o **Modificador** (pot editar/afegir contactes).

   ![Compartició d'una llibreta d'adreces personal](https://proferamon.com/tic/imatges/sogo/sogo24.png)

## 10.4. Crea una llibreta d'adreces addicional

1. Llibretes d'adreces → icona **+** al costat de "Llibretes d'adreces".
2. Dona-li un nom (`Contactes ASIX`, per exemple).
3. Comparteix-la amb qui vulguis, igual que a la secció anterior.

   ![Nova llibreta d'adreces](https://proferamon.com/tic/imatges/sogo/sogo25.png)

## 10.5. Autocompleta en redactar correus

Aquesta funciona automàticament un cop la GAL està activa: en escriure un nom o `@thos.local` al camp "Per a" d'un correu nou, SOGo cerca tant a la llibreta personal com a la GAL.

# 11. Filtres de correu

**Sieve** (RFC 5228) és un llenguatge senzill i segur per definir **regles de filtratge de correu del costat del servidor** — és a dir, les regles s'apliquen quan el correu **arriba al servidor** (abans que arribi al client), no dins de Thunderbird o SOGo com a aplicació. Per això, si tens diversos dispositius o clients, les regles funcionen igual arreu, sense haver-les de configurar a cadascun.

Amb Sieve pots, per exemple:

> - Moure correus a una carpeta segons el remitent o l'assumpte
> - Rebutjar o descartar correu brossa
> - Reenviar automàticament
> - Configurar un missatge de **vacances/absència** (autorespon una vegada per remitent)

Per seguretat, Sieve **no permet executar programes ni codi arbitrari** — és deliberadament limitat a accions de filtratge, cosa que el fa segur d'oferir a usuaris no confiables sense risc per al servidor.

Hi ha dues peces separades:

| Component | Funció |
|---|---|
| **Motor Sieve** (a Dovecot, via el paquet `dovecot-sieve`, part del projecte **Pigeonhole**) | Executa realment els scripts quan arriba un correu (via LDA o LMTP) |
| **ManageSieve** (protocol RFC 5804, port **4190**) | Permet als usuaris (o a SOGo, en el teu cas) pujar/editar els seus scripts remotament, sense accés directe al sistema de fitxers |

SOGo actua com a **client ManageSieve**: quan configures regles de filtratge des de la interfície web de SOGo, en realitat SOGo es connecta per ManageSieve al port 4190 de Dovecot i hi puja el script Sieve corresponent.

## 11.1. Instal·la els paquets

```bash
sudo apt install dovecot-sieve dovecot-managesieved
```

## 11.2. Activa el protocol `sieve` (ManageSieve)

```bash
sudo nano /etc/dovecot/dovecot.conf
```

Busca la línia:

```bash
#protocols = imap pop3 lmtp
```

Canvia-la per:

```nano
protocols = imap lmtp sieve
```

## 11.3. Activa el connector Sieve a LMTP

```bash
sudo nano -l /etc/dovecot/conf.d/20-lmtp.conf
```

Descomenta les línies 40, 41 i 42:

```nano
  mail_plugins {
    sieve = yes
  }
```

## 11.4. Configura on es desen els scripts

```bash
sudo nano -l /etc/dovecot/conf.d/90-sieve.conf
```

Descomenta les línies 11-15:

```nano
sieve_script personal {
  driver = file
  path = ~/sieve
  active_path = ~/.dovecot.sieve
}
```

## 11.5. Verifica i reinicia

Comprova la sintaxi:

```bash
sudo doveconf -n
```

Reinicia Dovecot:

```bash
sudo systemctl restart dovecot
```

Verifica:

```bash
sudo ss -tlnp | grep 4190
```

Hauries de veure Dovecot escoltant al port **4190**.

```ini
LISTEN 0      100          0.0.0.0:4190       0.0.0.0:*    users:(("dovecot",pid=2926,fd=55))                                                                     
LISTEN 0      100             [::]:4190          [::]:*    users:(("dovecot",pid=2926,fd=56))
```

## 11.6. Activa'l a SOGo

Ja tens aquesta línia a `sogo.conf`:

```bash
SOGoSieveServer = "sieve://correu.thos.local:4190/?tls=YES";
```

I si vols que apareguin les opcions de filtres a la interfície edita el fitxer `sogo.conf`:

```bash
sudo nano /etc/sogo/sogo.conf
```

Estableix els valors a 'YES':

```nano
SOGoVacationEnabled = YES;
SOGoForwardEnabled = YES;
SOGoSieveScriptsEnabled = YES;
```

Reinicia SOGo:

```bash
sudo systemctl restart sogo
```

## 11.7 Comprovació manual

```bash
openssl s_client -connect correu.thos.local:4190 -starttls sieve -quiet
```

Hauria de respondre amb una salutació `"IMPLEMENTATION" "Dovecot Pigeonhole"` i la llista de capacitats Sieve suportades.

```ini
Connecting to 10.0.2.10
depth=0 C=ES, ST=Catalunya, L=Mataro, O=IES Thos i Codina, OU=ASIX, CN=correu.thos.local
verify return:1
OK "Begin TLS negotiation now."
"IMPLEMENTATION" "Dovecot Pigeonhole"
"SIEVE" "fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include body variables enotify environment mailbox date index ihave duplicate mime foreverypart extracttext"
"NOTIFY" "mailto"
"SASL" "PLAIN LOGIN"
"VERSION" "1.0"
OK "TLS negotiation successful."
```

Per sortir escriu `LOGOUT`:

```ini
OK "Logout completed."
```

Un cop fet, a la interfície de SOGo apareixeran tres pestanyes: **Filtres, Vacances i Redirigir** a Preferències → Correu, on els usuaris podran crear filtres, un missatge de vacances, o reenviaments, sense necessitat de tocar res més al servidor.

![Pestanyes Filtres, Vacances i Redirigir](https://proferamon.com/tic/imatges/sogo/sogo26.png)

# 12. Accés dels clients

| Client | Protocol | Notes |
|---|---|---|
| Navegador web | HTTPS | Interfície completa, AJAX |
| Mozilla Thunderbird | CalDAV/CardDAV nadiu, o extensions *SOGo Connector*/*Integrator* | Integració més completa amb els complements d'Alinto |
| Apple Calendar / Contacts | CalDAV / CardDAV | Configuració nativa del sistema operatiu |
| Microsoft Outlook | ActiveSync o *Outlook CalDav Synchronizer* (lliure) | Sense necessitat de connectors MAPI de pagament |
| Android / iOS / Windows Phone | ActiveSync o clients CalDAV/CardDAV (p. ex. DAVx⁵) | Push i sincronització bidireccional |

URL típica per a CalDAV manual: `https://<servidor>/SOGo/dav/<usuari>/Calendar/personal/`

# 13. Manteniment i eines

- **`sogo-tool`**: eina de línia d'ordres inclosa al paquet `sogo` a Debian/Ubuntu, útil per a còpies de seguretat i restauració.

    Crea la còpia de seguretat:

    ```bash
    sudo sogo-tool backup /var/backups/sogo ALL
    ```

    Restaura la còpia de seguretat:

    ```bash
    sudo sogo-tool restore /var/backups/sogo/20260713 usuari1
    ```

- **Registres**: `journalctl -u sogo -f` per seguir el dimoni en temps real.
- **Sistema de seguiment d'errors** oficial per reportar bugs (cal donar-se d'alta per pujar de rol de lector a informador).

# 14. Enllaços d'interès

> - Web oficial: <https://www.sogo.nu/>
> - Guia oficial d'instal·lació i configuració: <https://www.sogo.nu/files/docs/SOGoInstallationGuide.html>
> - FAQ d'instal·lació a Ubuntu: <https://www.sogo.nu/support/faq/how-to-install-sogo-on-ubuntu.html>
> - Paquet oficial a Ubuntu (Launchpad): <https://launchpad.net/ubuntu/+source/sogo>
> - Cerca de paquets Ubuntu: <https://packages.ubuntu.com/sogo>
> - Descàrrega de l'entorn de proves complet i preconfigurat ZEG (Zero Effort Groupware): <https://www.sogo.nu/download.html#zeg>
> - Presentació de característiques: <https://www.sogo.nu/about.html>
> - Dipòsit de codi (GitHub, mirall): cerca "Alinto SOGo" o el projecte `sogo` a GitHub

#### Versions d'aquest document

> + [HTML](https://proferamon.com/tic/sogo.html)
> + [PDF](https://proferamon.com/tic/pdf/sogo.pdf)
> + [ODT](https://proferamon.com/tic/odt/sogo.odt)
> + [MD](https://proferamon.com/tic/md/sogo.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)