FlatWiki: Zwei Instanzen auf einem Ubuntu-Server (Caddy + HTTPS)

Kategorie: Allgemein | Profil: Standard | Zugriff: alle | Unverschlüsselt | Integrität: geprüft

Zuletzt geändert: 2026-02-17T17:10:28.544Z | von admin

Diese Anleitung zeigt, wie du zwei getrennte FlatWiki-Instanzen auf einem frischen Ubuntu-24.04-Server betreibst:

  • wiki.domain1.de
  • wiki.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.yml nur 127.0.0.1:<PORT>:<PORT> verwenden
  • Wenn in /admin/ssl steht NODE_ENV=production: Nein:
    • NODE_ENV=production in config.env setzen
    • Container neu starten

11. Sicherheitshinweise

  • config.env niemals in Git committen
  • Schlüssel regelmäßig sichern (Backup, Recovery-Prozess testen)
  • Root-Login per Passwort später deaktivieren und SSH-Key nutzen