Skip to content

Self-Host mit Docker

Peacock CMS läuft komplett auf deiner eigenen Hardware — keine Cloud-Abhängigkeit, kein SaaS-Lock-In. Drei Komponenten reichen: Postgres, Redis, der Octane-API-Container. Optional kommen Meilisearch (Volltext-Suche) + MinIO (S3-kompatibler Asset-Store) dazu.

1-Minute-Setup mit install.sh

bash
git clone https://github.com/webhoch-com/peacock
cd peacock
./install.sh

Das Script:

  1. Prüft, ob Docker + pnpm + Composer installiert sind (sonst Hinweis-Output).
  2. Erzeugt apps/api/.env mit zufälligen DB-/Redis-Credentials + APP_KEY.
  3. Startet die 5 Backing-Services (docker compose -f infra/docker/docker-compose.yml up -d).
  4. Führt composer install && php artisan migrate aus.
  5. Seedet einen Demo-Tenant mit drei vorbereiteten Blueprints + einer welcome-Story.
  6. Druckt den Admin-Login-Token aus, mit dem du dich auf http://localhost:8000/app/ einloggen kannst.

Manuelles Setup (für volle Kontrolle)

bash
# Backing services
docker compose -f infra/docker/docker-compose.yml up -d
# → peacock-postgres (5439), peacock-redis (6389), peacock-minio (9009/9010),
#   peacock-meilisearch (7709), peacock-mailpit (1039/8039)

# API
cd apps/api
cp .env.example .env
php artisan key:generate
composer install
php artisan migrate
php artisan db:seed --class=DemoTenantSeeder

# Octane / FrankenPHP
php artisan octane:start --host=127.0.0.1 --port=8000

# Admin (separates Terminal)
cd apps/admin
pnpm install
pnpm dev   # → http://127.0.0.1:5173

Production-Deploy

Production-docker-compose.yml mountet einen externen Postgres-Volume, härtet Redis (--requirepass) und nutzt nginx als TLS-Terminator vor dem Octane-Container. Der API-Port bleibt auf 127.0.0.1:8050 gebunden, sodass nur nginx Zugriff hat.

Nginx-Snippet auf dem Host:

nginx
location ^~ /v1/ {
    proxy_pass http://127.0.0.1:8050;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header CF-IPCountry "";   # SSRF-Schutz für Audience-Segments
}

Helm-Chart (Kubernetes)

infra/k8s/peacock-chart/ enthält ein produktionsreifes Helm-Chart:

bash
helm install peacock infra/k8s/peacock-chart \
  --namespace peacock --create-namespace \
  --set api.image=ghcr.io/webhoch-com/peacock-api:latest \
  --set ingress.host=peacock.example.com \
  --set postgres.password=$(openssl rand -base64 24) \
  --set redis.password=$(openssl rand -base64 24)

Der Chart deployt: API-Deployment + HPA, Postgres-StatefulSet + PVC, Redis-Deployment, optional Meilisearch + MinIO, Service-Mesh-kompatible Probes (/up, /up?deep=1).

Updates

bash
cd peacock
git pull origin main
( cd apps/api && composer install && php artisan migrate )
docker compose -f infra/docker/docker-compose.yml restart peacock-api

Beim Production-Compose: neues Image pullen + docker compose up -d startet rolling-restart ohne Downtime — die DB-Migrations laufen davor.

Backups

Postgres-Dump täglich um 03:00 lokale Zeit:

bash
docker exec peacock-postgres pg_dump -U peacock peacock | gzip > backups/peacock-$(date +%F).sql.gz

backups/ liegt außerhalb des Container-Volumes — wird vom Host gesichert.

Siehe auch