181 lines
5.4 KiB
YAML
181 lines
5.4 KiB
YAML
# File: /share/np-dms/rocketchat/docker-compose.yml
|
|
# DMS Container v1.8.6 — RocketChat + MongoDB
|
|
# ============================================================
|
|
# 🔒 SECURITY (M8):
|
|
# MongoDB รันแบบ replica set + auth
|
|
# Prerequisite (ทำครั้งเดียวก่อน deploy):
|
|
# openssl rand -base64 756 > /share/np-dms/rocketchat/mongo-keyfile
|
|
# chmod 400 /share/np-dms/rocketchat/mongo-keyfile
|
|
# chown 999:999 /share/np-dms/rocketchat/mongo-keyfile
|
|
# Env (.env):
|
|
# MONGO_ROOT_USERNAME, MONGO_ROOT_PASSWORD,
|
|
# MONGO_RC_USERNAME, MONGO_RC_PASSWORD
|
|
# ============================================================
|
|
|
|
x-restart: &restart_policy
|
|
restart: unless-stopped
|
|
|
|
x-logging: &default_logging
|
|
logging:
|
|
driver: 'json-file'
|
|
options:
|
|
max-size: '10m'
|
|
max-file: '5'
|
|
|
|
services:
|
|
mongodb:
|
|
<<: [*restart_policy, *default_logging]
|
|
image: docker.io/library/mongo:7.0.14
|
|
container_name: mongodb
|
|
# M8: เปิด --auth + keyFile สำหรับ replica set internal auth
|
|
command:
|
|
- 'mongod'
|
|
- '--oplogSize=128'
|
|
- '--replSet=rs0'
|
|
- '--bind_ip_all'
|
|
- '--auth'
|
|
- '--keyFile=/etc/mongo/keyfile'
|
|
env_file:
|
|
- .env
|
|
environment:
|
|
TZ: 'Asia/Bangkok'
|
|
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ROOT_USERNAME:?MONGO_ROOT_USERNAME required}
|
|
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ROOT_PASSWORD:?MONGO_ROOT_PASSWORD required}
|
|
volumes:
|
|
- /share/np-dms/rocketchat/data/db:/data/db
|
|
- /share/np-dms/rocketchat/data/dump:/dump
|
|
- /share/np-dms/rocketchat/mongo-keyfile:/etc/mongo/keyfile:ro
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1.0'
|
|
memory: 1G
|
|
reservations:
|
|
cpus: '0.25'
|
|
memory: 256M
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
networks:
|
|
- lcbp3
|
|
expose:
|
|
- '27017'
|
|
# M2: healthcheck via mongosh (authenticated)
|
|
healthcheck:
|
|
test:
|
|
[
|
|
'CMD-SHELL',
|
|
'mongosh --quiet -u "$$MONGO_INITDB_ROOT_USERNAME" -p "$$MONGO_INITDB_ROOT_PASSWORD" --authenticationDatabase admin --eval "db.adminCommand(\"ping\").ok" | grep -q 1',
|
|
]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 5
|
|
start_period: 40s
|
|
|
|
# Service สำหรับ Init Replica Set + สร้าง RocketChat user (รันแล้วจบ)
|
|
mongo-init-replica:
|
|
image: docker.io/library/mongo:7.0.14
|
|
container_name: mongo-init-replica
|
|
restart: 'no'
|
|
<<: *default_logging
|
|
env_file:
|
|
- .env
|
|
environment:
|
|
TZ: 'Asia/Bangkok'
|
|
depends_on:
|
|
mongodb:
|
|
condition: service_healthy
|
|
entrypoint:
|
|
- bash
|
|
- -c
|
|
- |
|
|
set -e
|
|
echo "Waiting for mongodb..."
|
|
until mongosh --host mongodb \
|
|
-u "$$MONGO_ROOT_USERNAME" -p "$$MONGO_ROOT_PASSWORD" \
|
|
--authenticationDatabase admin --quiet \
|
|
--eval "db.adminCommand('ping')"; do
|
|
sleep 2
|
|
done
|
|
|
|
mongosh --host mongodb \
|
|
-u "$$MONGO_ROOT_USERNAME" -p "$$MONGO_ROOT_PASSWORD" \
|
|
--authenticationDatabase admin --quiet --eval '
|
|
try { rs.status() } catch (e) {
|
|
rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "mongodb:27017" }] });
|
|
}'
|
|
|
|
# สร้าง user rocketchat ถ้ายังไม่มี
|
|
mongosh --host mongodb \
|
|
-u "$$MONGO_ROOT_USERNAME" -p "$$MONGO_ROOT_PASSWORD" \
|
|
--authenticationDatabase admin --quiet --eval '
|
|
const u = db.getSiblingDB("rocketchat").getUser("'"$$MONGO_RC_USERNAME"'");
|
|
if (!u) {
|
|
db.getSiblingDB("rocketchat").createUser({
|
|
user: "'"$$MONGO_RC_USERNAME"'",
|
|
pwd: "'"$$MONGO_RC_PASSWORD"'",
|
|
roles: [
|
|
{ role: "readWrite", db: "rocketchat" },
|
|
{ role: "read", db: "local" }
|
|
]
|
|
});
|
|
}'
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '0.25'
|
|
memory: 128M
|
|
networks:
|
|
- lcbp3
|
|
|
|
rocketchat:
|
|
<<: [*restart_policy, *default_logging]
|
|
image: registry.rocket.chat/rocketchat/rocket.chat:6.10.5
|
|
container_name: rocketchat
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
cap_drop:
|
|
- ALL
|
|
env_file:
|
|
- .env
|
|
environment:
|
|
- TZ=Asia/Bangkok
|
|
- PORT=3000
|
|
- ROOT_URL=https://chat.np-dms.work
|
|
# M8: ใช้ authenticated URL
|
|
- MONGO_URL=mongodb://${MONGO_RC_USERNAME}:${MONGO_RC_PASSWORD}@mongodb:27017/rocketchat?replicaSet=rs0&authSource=rocketchat
|
|
- MONGO_OPLOG_URL=mongodb://${MONGO_ROOT_USERNAME}:${MONGO_ROOT_PASSWORD}@mongodb:27017/local?replicaSet=rs0&authSource=admin
|
|
- DEPLOY_METHOD=docker
|
|
- ACCOUNTS_AVATAR_STORE_PATH=/app/uploads
|
|
volumes:
|
|
- /share/np-dms/rocketchat/uploads:/app/uploads
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '1.0'
|
|
memory: 1G
|
|
reservations:
|
|
cpus: '0.25'
|
|
memory: 256M
|
|
depends_on:
|
|
mongo-init-replica:
|
|
condition: service_completed_successfully
|
|
networks:
|
|
- lcbp3
|
|
expose:
|
|
- '3000'
|
|
# M2: healthcheck
|
|
healthcheck:
|
|
test:
|
|
[
|
|
'CMD-SHELL',
|
|
'curl -sf http://localhost:3000/api/info | grep -q ''"success":true'' || exit 1',
|
|
]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 5
|
|
start_period: 120s
|
|
|
|
networks:
|
|
lcbp3:
|
|
external: true
|