120 lines
3.5 KiB
YAML
120 lines
3.5 KiB
YAML
version: "3.8"
|
||
|
||
services:
|
||
|
||
### MongoDB (single-node replica set + oplog)
|
||
mongo:
|
||
image: mongo:6
|
||
command: ["--replSet","rs0","--oplogSize","128"]
|
||
volumes:
|
||
- mongo_data:/data/db
|
||
networks:
|
||
- rocketchat-net
|
||
healthcheck:
|
||
test: ["CMD","mongosh","--quiet","--eval","db.adminCommand('ping').ok"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 10
|
||
deploy:
|
||
placement:
|
||
constraints:
|
||
- node.labels.platform == prod # İstersen kaldırabilirsin
|
||
|
||
### ReplSet init (tek seferlik)
|
||
mongo-init-replica:
|
||
image: mongo:6
|
||
networks:
|
||
- rocketchat-net
|
||
command: >
|
||
bash -lc '
|
||
set -e
|
||
echo "Mongo ping bekleniyor..."
|
||
# Mongo hazır olana kadar ping at
|
||
until mongosh --host mongo:27017 --quiet --eval "db.adminCommand({ ping: 1 }).ok" | grep -q 1; do
|
||
sleep 2
|
||
done
|
||
echo "Mongo ulaşılıyor. ReplSet durumu kontrol ediliyor..."
|
||
# rs.status() initiated değilken hata atar; try/catch ile idempotent yapıyoruz
|
||
mongosh --host mongo:27017 --quiet --eval "
|
||
try {
|
||
if (rs.status().ok === 1) {
|
||
print('ReplSet zaten başlatılmış.');
|
||
} else {
|
||
throw new Error('status ok değil');
|
||
}
|
||
} catch (e) {
|
||
print('ReplSet başlatılıyor...');
|
||
rs.initiate({
|
||
_id: \"rs0\",
|
||
members: [{ _id: 0, host: \"mongo:27017\" }]
|
||
});
|
||
printjson(rs.status());
|
||
}
|
||
"
|
||
'
|
||
deploy:
|
||
restart_policy:
|
||
condition: on-failure
|
||
delay: 5s
|
||
max_attempts: 10
|
||
placement:
|
||
constraints:
|
||
- node.labels.platform == prod
|
||
|
||
### Rocket.Chat
|
||
rocketchat:
|
||
image: registry.rocket.chat/rocketchat/rocket.chat:latest
|
||
environment:
|
||
- PORT=3000
|
||
- ROOT_URL=https://chat.emrekirman.xyz # <- kendi domainini yaz
|
||
- MONGO_URL=mongodb://mongo:27017/rocketchat?replicaSet=rs0
|
||
- MONGO_OPLOG_URL=mongodb://mongo:27017/local?replicaSet=rs0
|
||
- REDIS_URL=redis://:98836@redis:6379
|
||
# İsteğe bağlı: Türkçe varsayılan dil
|
||
- OVERWRITE_SETTING_Language=tr
|
||
volumes:
|
||
- uploads:/app/uploads
|
||
networks:
|
||
- mongodb_backend-net
|
||
- traefik-public
|
||
- redis_redis_net
|
||
- rocketchat-net
|
||
deploy:
|
||
replicas: 2 # Traefik sticky cookie ile çoklayabiliyoruz
|
||
update_config:
|
||
order: start-first
|
||
parallelism: 1
|
||
delay: 5s
|
||
restart_policy:
|
||
condition: on-failure
|
||
placement:
|
||
constraints:
|
||
- node.labels.platform == prod
|
||
labels:
|
||
- traefik.enable=true
|
||
# Router
|
||
- traefik.http.routers.rocketchat.rule=Host(`chat.emrekirman.xyz`)
|
||
- traefik.http.routers.rocketchat.entrypoints=websecure
|
||
- traefik.http.routers.rocketchat.tls.certresolver=myresolver
|
||
- traefik.http.routers.rocketchat.service=rocketchat
|
||
# Service (websocket uyumlu, sticky önerilir)
|
||
- traefik.http.services.rocketchat.loadbalancer.server.port=3000
|
||
- traefik.http.services.rocketchat.loadbalancer.sticky.cookie=true
|
||
- traefik.http.services.rocketchat.loadbalancer.sticky.cookie.name=rc_sticky
|
||
# (İsteğe bağlı) www → çıplak alan ya da tersi için ek router ekleyebilirsin
|
||
|
||
networks:
|
||
traefik-public:
|
||
external: true
|
||
mongodb_backend-net:
|
||
external: true
|
||
redis_redis_net:
|
||
external: true
|
||
rocketchat-net:
|
||
driver: overlay
|
||
|
||
volumes:
|
||
mongo_data:
|
||
redis_data:
|
||
uploads:
|