109 lines
3.0 KiB
YAML
109 lines
3.0 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:
|
||
- sh
|
||
- -lc
|
||
- |
|
||
set -e
|
||
echo "Waiting for Mongo to be ready..."
|
||
until mongosh --host mongo:27017 --quiet --eval 'db.adminCommand({ ping: 1 }).ok' | grep -q 1; do
|
||
sleep 2
|
||
done
|
||
echo "Checking replica set..."
|
||
mongosh --host mongo:27017 --quiet --eval '
|
||
try {
|
||
if (rs.status().ok === 1) {
|
||
print("Replica set already initiated.");
|
||
} else { throw new Error("status not ok"); }
|
||
} catch (e) {
|
||
print("Initiating replica set...");
|
||
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "mongo:27017" } ] });
|
||
}
|
||
'
|
||
echo "Waiting for PRIMARY..."
|
||
until mongosh --host mongo:27017 --quiet --eval 'db.isMaster().ismaster' | grep -q true; do
|
||
sleep 2
|
||
done
|
||
echo "PRIMARY is ready."
|
||
deploy:
|
||
restart_policy:
|
||
condition: on-failure
|
||
delay: 5s
|
||
placement:
|
||
constraints:
|
||
- node.labels.platform == prod
|
||
|
||
### Rocket.Chat
|
||
rocketchat:
|
||
image: registry.rocket.chat/rocketchat/rocket.chat:latest
|
||
ports:
|
||
- "3001:3000"
|
||
environment:
|
||
- PORT=3000
|
||
- ROOT_URL=https://chat.emrekirman.xyz # <- kendi domainini yaz
|
||
- MONGO_URL=mongodb://mongo:27017/rocketchat?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:
|
||
- traefik-public
|
||
- redis_redis_net
|
||
- rocketchat-net
|
||
deploy:
|
||
replicas: 1 # 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
|
||
- traefik.docker.network=traefik-public
|
||
- traefik.http.routers.rocketchat.rule=Host(`chat.emrekirman.xyz`)
|
||
- traefik.http.routers.rocketchat.entrypoints=websecure
|
||
- traefik.http.routers.rocketchat.tls.certresolver=myresolver
|
||
- traefik.http.services.rocketchat.loadbalancer.server.port=3000
|
||
- traefik.http.routers.rocketchat.service=rocketchat
|
||
|
||
networks:
|
||
traefik-public:
|
||
external: true
|
||
redis_redis_net:
|
||
external: true
|
||
rocketchat-net:
|
||
|
||
volumes:
|
||
mongo_data:
|
||
uploads:
|