Ana içeriğe geç

Docker Compose

Depo kökündeki docker-compose.yml referans kurulumdur. API, worker, panel, MongoDB 7 ve Redis 7'yi özel bir bridge ağında çalıştırır ve otomatik yüklenen docker-compose.override.yml üzerinden API ile paneli yalnızca loopback'e (127.0.0.1:3000 ve 127.0.0.1:3001) yayınlar; böylece açık bir VPS, önüne koyduğunuz reverse proxy'nin ötesinde hiçbir şey göstermez. Panelin kendi ayarları Panel kurulumu'nda.

Kurulum

git clone https://github.com/Aproder/opennotification.git
cd opennotification
cp .env.example .env
bun run generate:keys >> .env # ENCRYPTION_KEY, HMAC_SECRET, admin token, oturum sırrı, VAPID çifti
bun run generate:admin-password >> .env
docker compose up -d
docker compose ps

Compose, ENCRYPTION_KEY, HMAC_SECRET, ADMIN_API_TOKEN, SESSION_SECRET ve ADMIN_PASSWORD_HASH olmadan başlamayı reddeder (${VAR:?…} koruması); yarım doldurulmuş bir .env boş sırlarla çalışmak yerine sesli biçimde başarısız olur.

Servis URL'leri (MONGO_URL, REDIS_URL) compose dosyasının içinde servis adlarına ayarlıdır; aynı .env servisler Docker'da da host'ta da çalışsa iş görür.

Servisler ne yapar

ServisİmajNotlar
apidocker/api.Dockerfile/health healthcheck'i. Mongo kapalıyken 503 döner ama ayakta kalır; açılışta Redis'e ulaşamazsa hemen çıkar (kuyruğa alınmış bir push kabul edilip kaybedilmemeli).
workerdocker/worker.Dockerfilecampaign-fanout, push-ios, push-android, push-web, webhooks, maintenance kuyruklarını tüketir. SIGTERM'de süren push'lar bitsin diye stop_grace_period: 45s.
dashboarddocker/dashboard.DockerfileNext.js standalone derlemesi. API'ye http://api:3000 olarak ulaşır; ADMIN_API_TOKEN, SESSION_SECRET, ADMIN_PASSWORD_HASH ister (Compose onlarsız başlamayı reddeder). Healthcheck /login'de.
docsdocker/docs.DockerfileDokümantasyon sitesi, nginx arkasında statik dosyalar. Yerelde 127.0.0.1:3002; Traefik altında DOCS_DOMAIN.
backupmongo:7 (profil backup)İsteğe bağlı mongodump sidecar'ı: docker compose --profile backup up -d. Bkz. Operasyon › Yedekler.
mongomongo:7--wiredTigerCacheSizeGB ${MONGO_CACHE_GB:-1}. Veri mongo_data volume'unda.
redisredis:7-alpine--maxmemory-policy noeviction --appendonly yes. Veri redis_data'da.
Tehlike
Redis noeviction ile çalışmalı

allkeys-lru altında Redis BullMQ job hash'lerini sessizce siler ve kuyruk hiçbir yerde hata vermeden çürür. Compose dosyası politikayı ayarlar; kendi Redis'inizi getiriyorsanız siz ayarlayın.

Üç imaj da Alpine üzerinde Bun'ı root olmayan kullanıcıyla ve PID 1 olarak tini ile çalıştırır; SIGTERM sürece ulaşır — worker'ın boşaltmasını başlatan sinyal budur.

İmaj derlemek ya da çekmek

Compose dosyası imajları hem build eder hem adlandırır (API_IMAGE, WORKER_IMAGE, DASHBOARD_IMAGE). CI üçünü de main'den (latest) ve v* etiketlerinden GHCR'a yayınlar. Geliştirici makinesinde docker compose up kaynaktan derler; sunucuda değişkenleri bir registry etiketine ayarlayıp docker compose pull && docker compose up -d çalıştırın.

docker build -f docker/api.Dockerfile -t ghcr.io/you/opennotification-api:1.0 .
docker build -f docker/worker.Dockerfile -t ghcr.io/you/opennotification-worker:1.0 .
docker build -f docker/dashboard.Dockerfile -t ghcr.io/you/opennotification-dashboard:1.0 .

Build context her zaman depo köküdür, docker/ değil.

Docker'sız çalıştırma

Makinede zaten MongoDB ve Redis çalışıyorsa (brew services start mongodb-community redis), dev script'leri depo kökündeki .env'i okur ve üç terminal bütün döngüdür:

bun install
bun run dev:api # :3000
bun run dev:worker
bun run dev:dashboard # :3001

bun run dev üçünü birden başlatır. Üretimde bir process manager (systemd, pm2) için giriş noktaları aynı ortamla bun packages/api/src/index.ts ve bun packages/worker/src/index.ts'dir.

Portlar ve ağ

PortServisAçıklık
3000APIyalnızca 127.0.0.1 — önüne TLS koyun (Dokploy / Traefik)
3001Panelyalnızca 127.0.0.1 — yönetim yüzeyi, önüne TLS koyun
3002Dokümanlaryalnızca 127.0.0.1
27017Mongoyayınlanmaz
6379Redisyayınlanmaz

SDK'lar ve tarayıcılar API'ye HTTPS üzerinden ulaşmalıdır. API_PUBLIC_URL'i o açık URL'e ayarlayın (panel kurulum ipuçlarında bunu gösterir) ve /v1/subscriptions'ı çağıracak her tarayıcı origin'ini CORS_ORIGINS'e ekleyin.

Yükseltme

git pull
docker compose build # ya da: docker compose pull
docker compose up -d

Index oluşturma idempotenttir ve her API açılışında çalışır. Elle çalıştırılacak migration yoktur.