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 | İmaj | Notlar |
|---|---|---|
api | docker/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). |
worker | docker/worker.Dockerfile | campaign-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. |
dashboard | docker/dashboard.Dockerfile | Next.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. |
docs | docker/docs.Dockerfile | Dokümantasyon sitesi, nginx arkasında statik dosyalar. Yerelde 127.0.0.1:3002; Traefik altında DOCS_DOMAIN. |
backup | mongo:7 (profil backup) | İsteğe bağlı mongodump sidecar'ı: docker compose --profile backup up -d. Bkz. Operasyon › Yedekler. |
mongo | mongo:7 | --wiredTigerCacheSizeGB ${MONGO_CACHE_GB:-1}. Veri mongo_data volume'unda. |
redis | redis:7-alpine | --maxmemory-policy noeviction --appendonly yes. Veri redis_data'da. |
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ğ
| Port | Servis | Açıklık |
|---|---|---|
| 3000 | API | yalnızca 127.0.0.1 — önüne TLS koyun (Dokploy / Traefik) |
| 3001 | Panel | yalnızca 127.0.0.1 — yönetim yüzeyi, önüne TLS koyun |
| 3002 | Dokümanlar | yalnızca 127.0.0.1 |
| 27017 | Mongo | yayınlanmaz |
| 6379 | Redis | yayı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.