# Migration Univention Corporate Server & Kopano nach Zamba AD & Mailcow

# Univention Corporate Server durch Zamba AD und Mailcow ersetzen

**Migration von Univention UCS und Kopano zu Zamba Active Directory, Mailcow und Proxmox VE.** Viele kleinere Unternehmen nutzen **Univention Corporate Server** hauptsächlich als Domain Controller und Benutzerverwaltung. Wenn UCS nur noch als Active Directory dient und Kopano ohnehin abgelöst werden soll, ist der Betrieb häufig unnötig aufwendig.

Mit **Zamba Active Directory**, **Mailcow**, **Proxmox VE**, optional **Proxmox Mail Gateway** und **Mailpiler** lässt sich eine schlanke, moderne Open-Source-Infrastruktur aufbauen, die schneller wartbar ist und sich ideal für kleine und mittlere Unternehmen eignet.

> **Updates von Mailcow und Zamba AD Controller laufen künftig in wenigen Minuten statt in mehreren Stunden.**
> 
> Kunden, die Keycloak oder eine vollständig vom Hersteller supportete UCS-Umgebung benötigen, sollten weiterhin bei Univention bleiben.

**Passende Kurse finden Sie auf [cloudistboese.de](https://cloudistboese.de) unter den Themen Mailcow, Domain Controller ablösen und Alles ohne Windows.**

---

## Vorteile der Migration

- Univention UCS kann in kleinen Umgebungen ersetzt werden
- Active Directory bleibt mit Samba/Zamba erhalten
- Mailcow ersetzt Kopano als moderne Groupware
- Updates werden deutlich einfacher und schneller
- Proxmox VE ermöglicht Snapshots, Backups und einfache Wiederherstellung
- LDAP-Anbindung für Mailcow, Mailpiler und weitere Dienste bleibt möglich
- Die Umgebung wird schlanker, transparenter und besser wartbar

## Systemvoraussetzungen

- Bestehender Univention Corporate Server im AD-Modus
- Kopano oder vergleichbare Groupware mit IMAP-Zugriff
- Proxmox VE 8.x oder neuer
- Linux Container mit installiertem Git
- Grundkenntnisse in DNS, Active Directory, Mailservern und Proxmox VE

## Übersicht der Migration

1. Zamba Active Directory als zweiten Domain Controller installieren
2. Active Directory replizieren und prüfen
3. DNS auf den neuen Domain Controller umstellen
4. Mailcow installieren
5. LDAP-Anbindung in Mailcow konfigurieren
6. Benutzer und Mailboxen synchronisieren
7. Mails von Kopano nach Mailcow migrieren
8. Kalender und Kontakte übernehmen
9. Aliase und Weiterleitungen prüfen
10. Mailcow produktiv schalten
11. FSMO-Rollen übernehmen
12. Univention UCS demoten und abschalten
13. LDAP-Clients auf den neuen Zamba AD umstellen

---

## Zamba Active Directory als zweiten Domain Controller installieren

Die Installation erfolgt auf dem Proxmox Host, zum Beispiel im Verzeichnis `/root`.

```bash
git clone -b dev https://github.com/bashclub/zamba-lxc-toolbox
cd zamba-lxc-toolbox
cp conf/zamba.conf.example conf/zamba.conf
```

### zamba.conf anpassen

In der Datei `conf/zamba.conf` werden die Werte an die bestehende Umgebung angepasst.

```bash
LXC_TEMPLATE_STORAGE="local"
LXC_ROOTFS_SIZE="32"
LXC_ROOTFS_STORAGE="rpool-data"
LXC_SHAREFS_SIZE="100"
LXC_SHAREFS_STORAGE="rpool-data"

LXC_HOSTNAME="zmb-ad"
LXC_DOMAIN="windomain.local"
LXC_IP="10.0.0.254/24"
LXC_GW="10.0.0.1"
LXC_DNS="10.0.0.4"

LXC_BRIDGE="vmbr0"
LXC_PWD='Admin123'

ZMB_REALM="WINDOMAIN.LOCAL"
ZMB_DOMAIN="WINDOMAIN"
ZMB_ADMIN_USER="administrator"
ZMB_ADMIN_PASS='Admin123'
```

**Hinweis:** `LXC_DNS` zeigt zunächst auf den alten UCS-DNS-Server. Bei Windows-Domänen sollte vorher gegebenenfalls das Funktionslevel geprüft werden.

### Zamba AD Join starten

```bash
bash install.sh -i 100
```

Im Menü wird **Zamba-AD-Join** gewählt.

### Replikation prüfen

Nach der Installation kann der Container betreten und die Replikation geprüft werden.

```bash
pct enter 100
su -
wbinfo -u
wbinfo -g
```

Wenn alle Benutzer und Gruppen angezeigt werden, ist der Join grundsätzlich erfolgreich.

> **Empfehlung:** In Proxmox sollte anschließend der alte UCS-DNS-Server aus der Hostkonfiguration entfernt werden, sobald der neue Zamba AD DNS zuverlässig funktioniert.

### smb.conf anpassen

Folgende Anpassungen können in der `smb.conf` hilfreich sein:

```bash
vi /etc/samba/smb.conf
```

```ini
[global]
ldap server require strong auth = no
dns forwarder = 1.1.1.1 1.0.0.1
```

---

## DNS auf den neuen Domain Controller umstellen

DNS ist bei Active Directory fast immer der kritischste Punkt. Sobald der neue Zamba Domain Controller sauber repliziert, werden feste IP-Konfigurationen und DHCP-Einstellungen angepasst.

- Alle Server mit statischer IP erhalten den neuen Zamba AD als DNS-Server
- Im DHCP-Server wird der alte UCS-DNS durch den neuen DC ersetzt
- Alte UCS-DNS-Einträge werden später bereinigt
- RSAT DNS-Konsole zur Kontrolle verwenden

> **Merksatz:** It was DNS.

---

## Mailcow installieren

Für Mailcow wird ein weiterer LXC verwendet. Die Installation erfolgt ebenfalls über die Zamba LXC Toolbox.

```bash
cp conf/zamba.conf.example conf/zamba.conf
```

Für Mailcow müssen insbesondere Hostname und Netzwerkeinstellungen angepasst werden.

```bash
bash install.sh -i 101
```

Im Menü wird **Mailcow** gewählt.

### Mailcow aktualisieren

```bash
pct enter 101
su -
cd /opt/mailcow-dockerized
apt install jq
./update.sh
```

Danach wird das Mailcow-Webinterface geöffnet:

```
https://10.0.0.253/admin
```

---

## Grundkonfiguration von Mailcow

### Unbedingt notwendige Schritte

- **Admin-Passwort ändern:** System / Konfiguration / Administrator bearbeiten
- **Alle Maildomains eintragen:** E-Mail / Konfiguration / Domains
- **Schwellwerte und Quotas beachten**
- **LDAP-Bind-User im AD anlegen:** zum Beispiel `bind-mailcow`

### LDAP in Mailcow konfigurieren

Die LDAP-Anbindung erfolgt unter:

> System / Konfiguration / Zugang / Identity Provider

- Identity Provider: LDAP
- Host: IP des neuen Zamba AD
- Port: 636
- Benutze SSL: an
- Ignoriere SSL Fehler: an
- Base DN: `CN=Users,DC=windomain,DC=local`
- Username Feld: `mail`
- Attribute Feld: `mail`
- Bind DN: `CN=bind-mailcow,CN=Users,DC=windomain,DC=local`
- Bind Passwort: Passwort des Bind-Users
- Attribute Mapping: Standardvorlage / Default
- Benutzer beim Login erstellen: an
- Vollsynchronisation: an
- Importiere Benutzer: an
- Sync / Import interval: für den Anfang 1 Minute

Der Erfolg wird unter **E-Mail / Mailboxen** kontrolliert.

---

## E-Mails von Kopano nach Mailcow migrieren

Die Migration erfolgt über IMAP-Synchronisation.

### Mailcow Sync Job erstellen

In Mailcow:

> E-Mail / Synchronisationen / Neuen Sync Job erstellen

- Host: IP des Kopano-Servers
- Port: 993
- Benutzername: Windows-Loginname
- Elemente ausschließen: Regex-Inhalt entfernen, da zu gefährlich
- `--delete2duplicates` nur verwenden, solange Mails noch auf Kopano laufen

> Kopano hat standardmäßig IMAP teilweise deaktiviert. In der `server.conf` nach `disable` suchen oder in UMC beim Benutzer unter Kopano IMAP aktivieren.

Der Erfolg der Synchronisation sollte im Dialog und in den Logs kontrolliert werden.

---

## Kalender aus Kopano exportieren

Kopano stellt Kalender über CalDAV bereit. Beispiele:

<table id="bkmrk-http%3A%2F%2Fkopano%3A8080%2Fc"><tbody><tr><td>`http://kopano:8080/caldav/<user>/<folder-name>/`</td><td>Kalender oder Aufgabenordner im Benutzerpostfach</td></tr><tr><td>`http://kopano:8080/caldav/<user>/<sub-folder>/`</td><td>Selbst erstellter Unterkalender</td></tr><tr><td>`http://kopano:8080/caldav/<other-user>/<folder-name>/`</td><td>Freigegebener Kalender eines anderen Benutzers</td></tr><tr><td>`http://kopano:8080/caldav/public/<foldername>/`</td><td>Öffentlicher Kalender</td></tr><tr><td>`http://kopano:8080/caldav/<user>/`</td><td>Standardkalender des Benutzers</td></tr></tbody></table>

Die exportierten Dateien können anschließend im SOGo-Frontend oder in einem Mailclient importiert werden.

---

## Kontakte exportieren und importieren

### Kontakte exportieren

Der Export kann über den alten Mailclient erfolgen. Alternativ kann ein Python-Script mit Kopano-MAPI genutzt werden.

```bash
sudo apt install python3-kopano
mkdir export
wget https://raw.githubusercontent.com/bashclub/trmm-scripts/refs/heads/main/kopano-export-contacts.py
python3 kopano-export-contacts.py
```

Das Script exportiert Kontakte in Unterordner pro Benutzer, da Kopano kein echtes CardDAV für diesen Zweck bereitstellt.

### Kontakte importieren

- Outlook kann beim Export oder Import Probleme verursachen
- SOGo importiert Kontakte oft nur einzeln
- eM Client war in der Praxis häufig die beste Lösung für den Import vieler VCF-Dateien per Drag &amp; Drop

Beispiel für CardDAV-Anbindung:

```
https://kunde.dyndns.org/SOGo/dav/user@domain.de/Contacts/personal/
```

---

## Aliase und Weiterleitungen übernehmen

### Aliase finden

```bash
univention-ldapsearch -LLL | grep @ | grep mailAlternative
```

Aliase werden in Mailcow unter **E-Mail / Aliasse / Alias hinzufügen** eingetragen.

### Weiterleitungen finden

```bash
univention-ldapsearch -LLL | grep mailForward
```

> Weiterleitungen werden im SOGo-Webfrontend unter E-Mail konfiguriert, nicht direkt in Mailcow.

---

## Mailcow produktiv schalten

### NAT und Portweiterleitungen

Auf der Firewall, zum Beispiel OPNsense, können Aliase verwendet werden.

```
p_mailcow: 80 443 465 993 4190
h_mailcow: 10.0.0.253
```

Port Forwarding:

```
any > WAN IP > p_mailcow > h_mailcow
```

### Mailcow neu starten

```bash
pct enter 101
su -
rm /opt/mailcow-dockerized/data/conf/nginx/redirect.conf
cd /opt/mailcow-dockerized
docker compose down
```

### Optional: Greylisting deaktivieren

```bash
vi /opt/mailcow-dockerized/data/conf/rspamd/local.d/greylist.conf
```

```ini
enabled = false;
```

### Optional: Let’s Encrypt Einstellungen

```bash
vi /opt/mailcow-dockerized/mailcow.conf
```

```ini
SKIP_LETS_ENCRYPT=n
SKIP_HTTP_VERIFICATION=y
```

```bash
docker compose up -d
```

### Let’s Encrypt kontrollieren

```bash
docker compose logs --tail=200 -f acme-mailcow
```

### Alternativ eigenes Zertifikat verwenden

Eigene Zertifikate können hier abgelegt werden:

```
/opt/mailcow-dockerized/data/assets/ssl
```

- `cert.pem`
- `key.pem`

Danach DNS-Werte beim Provider kontrollieren:

> E-Mail / Domains / DNS

---

## Abschluss der Migration

- Synchronisationen nach erfolgreicher Migration deaktivieren
- Optional Proxmox Mail Gateway auf Mailcow verweisen
- Alten Univention Corporate Server abschalten
- FSMO-Rollen auf Zamba AD übertragen
- Alte UCS-Fragmente bereinigen
- LDAP-Clients auf neuen Zamba AD umstellen

### FSMO-Rollen übernehmen

```bash
pct enter 100
su -
samba-tool fsmo transfer --role=all -Uadministrator
samba-tool domain demote --remove-other-dead-server=UCS
rm /etc/cron.d/sysvol-sync
```

### Bereinigung

- RSAT DNS-Konsole nach alten Fragmenten durchsuchen
- Alte DNS-Einträge entfernen
- Optional Metadata Cleanup durchführen

### LDAP-Clients anpassen

Für bestehende LDAP-Clients werden neue Bind-User pro Rolle angelegt. Anschließend werden die LDAP-Parameter angepasst.

- IP: neuer Zamba AD
- Port: von 7389 auf 636 mit SSL ändern
- UID auf `sAMAccountName` ändern
- Bind DN von `uid` auf `cn` ändern

---

## Proxmox Mail Gateway mit Mailcow verbinden

### Greylisting in Mailcow deaktivieren

```bash
vi /opt/mailcow-dockerized/data/conf/rspamd/local.d/greylist.conf
```

```ini
enabled = false;
```

```bash
docker compose restart rspamd-mailcow
```

### Routing in Mailcow

- Konfiguration / Routing / Networks
- `ipvompmg:26`
- Greylisting deaktivieren

### Senderabhängige Transport Maps

- Für alle Maildomains, die PMG nutzen
- ID 1: `ipvompmg:26`

### Proxmox Mail Gateway

- Configuration / Mail Proxy
- Relay Domain setzen
- Transport zur Mailcow konfigurieren
- Kein MX für internen Transport verwenden

Beim DNS-Provider werden die PMG-Werte statt der direkten Mailcow-Werte gesetzt.

---

## Mailpiler als Mailarchiv integrieren

Mailpiler kann ebenfalls über die LXC Toolbox installiert werden.

### Mailcow für Archivweiterleitung vorbereiten

- System / Konfiguration / Einstellungen / Weiterleitungs-Hosts
- IP des Mailpilers eintragen

### BCC an das Archiv

- System / Konfiguration / Routing / Transport
- Ziel: `piler.windomain.local`
- Next Hop: `10.0.0.x`

### BCC-Maps einrichten

Unter:

> E-Mail / Konfiguration / Adressumschreibung / BCC-Maps

Für jede Maildomain jeweils eingehend und ausgehend:

- Lokales Ziel: `sysops.tv`
- BCC-Ziel: `piler@piler.windomain.local`
- Domain: `sysops.tv`

Kontrolle im Mailpiler:

```bash
tail -f /var/log/mail.log
```

> Eine LDAP-Anpassung im Mailpiler wäre in `config-site.php` möglich, funktioniert jedoch nicht zuverlässig für Aliase.

---

## Doppelte Mails bei mehrfacher Kopano-Synchronisation vermeiden

Die IMAP-Kompatibilität von Kopano ist in der Praxis oft problematisch. Wenn Mails doppelt oder dreifach erscheinen, kann eine gezielte Bereinigung und erneute Synchronisation helfen.

```bash
apt install kopano-migration-imap
nano migrate.sh
```

```bash
#!/bin/bash

set -euo pipefail

if [ "$#" -ne 6 ]; then
  echo "Verwendung:"
  echo "$0 <host1> <host2> <user1> <pass1> <user2> <pass2>"
  exit 1
fi

HOST1="$1"
HOST2="$2"
USER1="$3"
PASS1="$4"
USER2="$5"
PASS2="$6"

MAILCOW_DOVECOT_CONTAINER="565cef8dac49"

echo "=========================================="
echo "Bereinige Zielordner auf Mailcow"
echo "=========================================="

docker exec "$MAILCOW_DOVECOT_CONTAINER" \
  doveadm expunge -u "$USER2" mailbox "Gesendet" ALL || true

docker exec "$MAILCOW_DOVECOT_CONTAINER" \
  doveadm mailbox delete -u "$USER2" "Sent" || true

docker exec "$MAILCOW_DOVECOT_CONTAINER" \
  doveadm mailbox delete -u "$USER2" "Gesendete Objekte" || true

docker exec "$MAILCOW_DOVECOT_CONTAINER" \
  doveadm mailbox delete -u "$USER2" "Gesendete Objekte/Gesendete Objekte" || true

echo "=========================================="
echo "Starte IMAP Sync"
echo "=========================================="

kopano-migration-imap \
  --host1 "$HOST1" \
  --host2 "$HOST2" \
  --user1 "$USER1" \
  --password1 "$PASS1" \
  --user2 "$USER2" \
  --password2 "$PASS2" \
  --ssl1 \
  --ssl2 \
  --regextrans2 's#^Gel&APY-schte Objekte$#Papierkorb#' \
  --useheader Message-Id \
  --addheader \
  --usecache \
  --syncinternaldates \
  --skipsize \
  --nofoldersizes \
  --nofoldersizesatend \
  --delete2 \
  --delete2folders \
  --delete2duplicates \
  --exclude '(?i)^trash$|^junk$|^spam$|^unwanted$|^&U3CPbg-($|/)'

echo "=========================================="
echo "Migration abgeschlossen"
echo "=========================================="
```

Ausführen mit:

```bash
bash migrate.sh quellip zielip login passwortucs email@adresse.de passwortmailcow
```

> Das Beispiel nimmt keine Papierkörbe oder Spam-Ordner mit. Dies wird über `--exclude` gesteuert.

---

## Optionale DNS-Einträge für Autokonfiguration

Für Thunderbird, eM Client und weitere Programme können SRV-Records gesetzt werden, damit Mail, Kalender und Kontakte automatisch gefunden werden.

```
_autodiscover._tcp  IN  SRV  0 0 443 q.deine-domain.de.
_caldavs._tcp       IN  SRV  0 1 443 q.deine-domain.de.
_carddavs._tcp      IN  SRV  0 1 443 q.deine-domain.de.
_imaps._tcp         IN  SRV  0 1 993 q.deine-domain.de.
_matrix._tcp        IN  SRV  0 1 465 matrix.deine-domain.de.
_sieve._tcp         IN  SRV  0 1 4190 mail.deine-domain.de.
_smtps._tcp         IN  SRV  0 1 465 q.deine-domain.de.
_submissions._tcp   IN  SRV  0 1 465 q.deine-domain.de.
```

---

## Fazit

Mit **Zamba Active Directory**, **Mailcow** und **Proxmox VE** lässt sich eine bestehende Univention-/Kopano-Umgebung vollständig durch moderne Open-Source-Komponenten ersetzen. Für kleine und mittlere Unternehmen entsteht eine schlanke, wartbare und zukunftssichere Infrastruktur.

- Active Directory bleibt erhalten
- Kopano wird durch Mailcow ersetzt
- Updates werden deutlich schneller
- Proxmox VE ermöglicht einfache Snapshots und Backups
- Mailpiler und Proxmox Mail Gateway können integriert werden
- Der Betrieb wird transparenter und besser kontrollierbar

## Passende Schulungen

Wenn Sie die Migration unter Anleitung durchführen möchten, finden Sie passende Live-Schulungen auf [cloudistboese.de](https://cloudistboese.de):

- Windows Domain Controller mit Samba/Zamba ablösen
- Open-Source Mailserver mit Mailcow betreiben
- Alles ohne Windows
- Proxmox produktiv mit ZFS betreiben
- Replikationen und Backups trojanersicher