FlatWiki: Zwei Instanzen auf einem Ubuntu-Server (Caddy + HTTPS)
Diese Anleitung zeigt, wie du zwei getrennte FlatWiki-Instanzen auf einem frischen Ubuntu-24.04-Server betreibst:
wiki.domain1.dewiki.domain2.de
1. Ziel-Setup
- Instanz 1 läuft intern auf
127.0.0.1:3001 - Instanz 2 läuft intern auf
127.0.0.1:3002 - Öffentlich erreichbar nur über Caddy auf
80/443 - Direkter Zugriff auf FlatWiki-Container-Ports von außen ist nicht nötig
2. Voraussetzungen
- Ubuntu 24.04 (frisch)
- Root-Zugang
- DNS zeigt auf den Server:
- A-Record für beide Domains
- Optional AAAA-Record (nur wenn IPv6 korrekt eingerichtet ist)
- Offene Ports in Firewall/Sicherheitsgruppe:
22,80,443
3. Basisinstallation (Docker + Caddy)
apt-get update
apt-get install -y ca-certificates curl gnupg git ufw lsb-release caddy
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable --now docker caddy
docker compose version
4. Instanz 1 einrichten (wiki.domain1.de)
cd /opt
git clone https://github.com/McCryptoX/FlatWiki.git flatwiki-domain1
cd /opt/flatwiki-domain1
chmod +x install.sh
./install.sh config.env
grep -q '^HOST=' config.env && sed -i 's/^HOST=.*/HOST=0.0.0.0/' config.env || echo 'HOST=0.0.0.0' >> config.env
grep -q '^PORT=' config.env && sed -i 's/^PORT=.*/PORT=3001/' config.env || echo 'PORT=3001' >> config.env
grep -q '^NODE_ENV=' config.env && sed -i 's/^NODE_ENV=.*/NODE_ENV=production/' config.env || echo 'NODE_ENV=production' >> config.env
cat > docker-compose.run.yml <<'YML'
services:
flatwiki:
build: .
container_name: flatwiki-domain1
restart: unless-stopped
env_file:
- ./config.env
ports:
- "127.0.0.1:3001:3001"
volumes:
- ./data:/app/data
YML
docker compose -f docker-compose.run.yml up -d --build
5. Instanz 2 einrichten (wiki.domain2.de)
cd /opt
git clone https://github.com/McCryptoX/FlatWiki.git flatwiki-domain2
cd /opt/flatwiki-domain2
chmod +x install.sh
./install.sh config.env
grep -q '^HOST=' config.env && sed -i 's/^HOST=.*/HOST=0.0.0.0/' config.env || echo 'HOST=0.0.0.0' >> config.env
grep -q '^PORT=' config.env && sed -i 's/^PORT=.*/PORT=3002/' config.env || echo 'PORT=3002' >> config.env
grep -q '^NODE_ENV=' config.env && sed -i 's/^NODE_ENV=.*/NODE_ENV=production/' config.env || echo 'NODE_ENV=production' >> config.env
cat > docker-compose.run.yml <<'YML'
services:
flatwiki:
build: .
container_name: flatwiki-domain2
restart: unless-stopped
env_file:
- ./config.env
ports:
- "127.0.0.1:3002:3002"
volumes:
- ./data:/app/data
YML
docker compose -f docker-compose.run.yml up -d --build
6. Caddy für beide Domains konfigurieren (Let's Encrypt automatisch)
cp -a /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak.$(date +%F-%H%M%S)
cat > /etc/caddy/Caddyfile <<'CADDY'
{
email server@example.com
}
wiki.domain1.de {
encode zstd gzip
reverse_proxy 127.0.0.1:3001
}
wiki.domain2.de {
encode zstd gzip
reverse_proxy 127.0.0.1:3002
}
CADDY
caddy fmt --overwrite /etc/caddy/Caddyfile
systemctl reload caddy
7. Firewall setzen
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 443/udp
ufw --force enable
8. Prüfung
docker ps --format 'table {{.Names}}\t{{.Ports}}'
ss -ltnp | grep -E ':3001|:3002|:80 |:443 '
systemctl status caddy --no-pager
Aufruf im Browser:
9. Updates einspielen
cd /opt/flatwiki-domain1
git pull --ff-only origin main
docker compose -f docker-compose.run.yml up -d --build
cd /opt/flatwiki-domain2
git pull --ff-only origin main
docker compose -f docker-compose.run.yml up -d --build
10. Typische Fehler
Fehler:Bind for 0.0.0.0:3000 failed: port is already allocated
Ursache:
Eine Instanz versucht noch auf Port 3000 zu binden.
Lösung:
- Für Instanz 1:
PORT=3001 - Für Instanz 2:
PORT=3002 - In beiden
docker-compose.run.ymlnur127.0.0.1:<PORT>:<PORT>verwenden - Wenn in
/admin/sslstehtNODE_ENV=production: Nein:NODE_ENV=productioninconfig.envsetzen- Container neu starten
11. Sicherheitshinweise
config.envniemals in Git committen- Schlüssel regelmäßig sichern (Backup, Recovery-Prozess testen)
- Root-Login per Passwort später deaktivieren und SSH-Key nutzen
Verlinkt von
Keine eingehenden internen Links gefunden.