#!/usr/bin/env bash set -euo pipefail DIR="/opt/hx-ki/com2-stack" F="$DIR/docker-compose.yml" ENVF="$DIR/.env" NET="hxki-internal" mkdir -p "$DIR" echo "=== COM2 · CANONICAL WRITE + UP ===" # Netzwerk muss existieren (external) docker network inspect "$NET" >/dev/null 2>&1 || docker network create "$NET" >/dev/null # .env (Passwörter hier) cat > "$ENVF" <<'ENV' PG_USER=hxki PG_PASSWORD=CHANGE_ME_STRONG PG_DB=n8n MAUTIC_DB_ROOT_PASSWORD=CHANGE_ME_STRONG MAUTIC_DB_NAME=mautic MAUTIC_DB_USER=mautic MAUTIC_DB_PASSWORD=CHANGE_ME_STRONG N8N_HOST=n8n.hx-ki.com N8N_PROTOCOL=https ENV # Compose: autark, ohne Grafana cat > "$F" <<'YML' services: hxki-postgres: image: postgres:16 container_name: hxki-postgres restart: unless-stopped environment: POSTGRES_USER: ${PG_USER} POSTGRES_PASSWORD: ${PG_PASSWORD} POSTGRES_DB: ${PG_DB} volumes: - /opt/hx-ki/postgres:/var/lib/postgresql/data networks: [hxki-internal] ports: ["5432:5432"] hxki-mariadb: image: mariadb:10.11 container_name: hxki-mariadb restart: unless-stopped command: ["--character-set-server=utf8mb4","--collation-server=utf8mb4_unicode_ci"] environment: MARIADB_ROOT_PASSWORD: ${MAUTIC_DB_ROOT_PASSWORD} MARIADB_DATABASE: ${MAUTIC_DB_NAME} MARIADB_USER: ${MAUTIC_DB_USER} MARIADB_PASSWORD: ${MAUTIC_DB_PASSWORD} volumes: - /opt/hx-ki/mautic/db:/var/lib/mysql networks: [hxki-internal] ports: ["3306:3306"] hxki-mautic: image: mautic/mautic:5-apache container_name: hxki-mautic restart: unless-stopped depends_on: [hxki-mariadb] environment: MAUTIC_DB_HOST: hxki-mariadb MAUTIC_DB_USER: ${MAUTIC_DB_USER} MAUTIC_DB_PASSWORD: ${MAUTIC_DB_PASSWORD} MAUTIC_DB_NAME: ${MAUTIC_DB_NAME} volumes: - /opt/hx-ki/mautic/app:/var/www/html networks: [hxki-internal] ports: ["8080:80"] hxki-n8n: image: docker.n8n.io/n8nio/n8n:latest container_name: hxki-n8n restart: unless-stopped depends_on: [hxki-postgres] environment: DB_TYPE: postgresdb DB_POSTGRESDB_HOST: hxki-postgres DB_POSTGRESDB_PORT: 5432 DB_POSTGRESDB_DATABASE: ${PG_DB} DB_POSTGRESDB_USER: ${PG_USER} DB_POSTGRESDB_PASSWORD: ${PG_PASSWORD} N8N_HOST: ${N8N_HOST} N8N_PROTOCOL: ${N8N_PROTOCOL} N8N_PORT: 5678 N8N_EDITOR_BASE_URL: ${N8N_PROTOCOL}://${N8N_HOST} WEBHOOK_URL: ${N8N_PROTOCOL}://${N8N_HOST} volumes: - /data/HXKI_WORKSPACE/router:/home/node/.n8n - /data/HXKI_WORKSPACE:/data/HXKI_WORKSPACE networks: [hxki-internal] ports: ["5678:5678"] # Caddy auf COM2 – Cluster-Client: Container bleibt drin. # Cluster-spezifische Settings kommen über DEIN Caddy-Cluster-Mechanismus (Volumes/Env/Config), # den wir nicht raten, sondern aus deinem vorhandenen COM2-Caddy Setup übernehmen. hx-caddy: image: caddy:2 container_name: hx-caddy restart: unless-stopped networks: [hxki-internal] ports: - "80:80" - "443:443" - "443:443/udp" - "2019:2019" volumes: - /opt/hx-ki/caddy/Caddyfile:/etc/caddy/Caddyfile:ro - /opt/hx-ki/caddy/data:/data - /opt/hx-ki/caddy/config:/config networks: hxki-internal: external: true YML echo "[1] Validate" ( cd "$DIR" && docker compose --env-file .env config >/dev/null ) echo "OK: compose valide." echo "[2] Up" ( cd "$DIR" && docker compose --env-file .env up -d ) echo "[3] Status" docker ps --format 'NAME={{.Names}} STATUS={{.Status}} PORTS={{.Ports}}' | egrep 'hxki-|hx-caddy' || true echo "=== ENDE ==="