2026-08-19 10:54:55 +07:00
|
|
|
# Local dev infrastructure — Word Versioning
|
|
|
|
|
# ใช้ร่วมกับ .env (สร้างจาก .env.example) — ทุก credential อยู่ใน env เท่านั้น ห้าม hardcode
|
|
|
|
|
#
|
|
|
|
|
# docker compose up -d # รัน infra: db + minio (+ init buckets) + keycloak
|
|
|
|
|
# docker compose --profile api up -d # เพิ่ม backend API (หลัง Phase 2 มี Dockerfile)
|
|
|
|
|
|
|
|
|
|
name: word-versioning
|
|
|
|
|
|
|
|
|
|
services:
|
|
|
|
|
# --- PostgreSQL (EF Core / Npgsql) ---------------------------------
|
|
|
|
|
db:
|
|
|
|
|
image: postgres:16
|
|
|
|
|
environment:
|
|
|
|
|
POSTGRES_USER: ${POSTGRES_USER}
|
|
|
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
|
|
|
POSTGRES_DB: ${POSTGRES_DB}
|
|
|
|
|
ports:
|
2026-09-01 10:51:14 +07:00
|
|
|
- "35432:5432" # เปิดให้ backend ที่รันด้วย dotnet run บน host เชื่อมได้ (host 35432 → container 5432)
|
2026-08-19 10:54:55 +07:00
|
|
|
volumes:
|
|
|
|
|
- postgres_data:/var/lib/postgresql/data
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 3s
|
|
|
|
|
retries: 12
|
|
|
|
|
|
|
|
|
|
# --- MinIO (S3-compatible สำหรับไฟล์ .docx) -----------------------
|
2026-09-01 10:51:14 +07:00
|
|
|
# container listen 39000/39001 เท่ากับ host ตรงๆ (ไม่ map ข้าม port) — map ข้ามแล้ว
|
|
|
|
|
# console จะ redirect/-เชื่อม server ผิด port (login error / เด้งไป :9001 ตาย)
|
2026-08-19 10:54:55 +07:00
|
|
|
minio:
|
|
|
|
|
image: minio/minio:latest
|
2026-09-01 10:51:14 +07:00
|
|
|
command: server /data --address ":39000" --console-address ":39001"
|
2026-08-19 10:54:55 +07:00
|
|
|
environment:
|
|
|
|
|
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
|
|
|
|
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
|
|
|
|
# ให้ healthcheck (mc ready) เรียกผ่าน alias "local" ได้
|
2026-09-01 10:51:14 +07:00
|
|
|
MC_HOST_local: http://${MINIO_ROOT_USER}:${MINIO_ROOT_PASSWORD}@localhost:39000
|
|
|
|
|
# URL ภายนอกที่ browser เห็น — ตรงกับ port จริงที่ listen จึงใช้ได้ทั้งใน/นอก container
|
|
|
|
|
MINIO_BROWSER_REDIRECT_URL: http://localhost:39001
|
|
|
|
|
MINIO_SERVER_URL: http://localhost:39000
|
2026-08-19 10:54:55 +07:00
|
|
|
ports:
|
2026-09-01 10:51:14 +07:00
|
|
|
- "39000:39000" # S3 API
|
|
|
|
|
- "39001:39001" # MinIO console
|
2026-08-19 10:54:55 +07:00
|
|
|
volumes:
|
|
|
|
|
- minio_data:/data
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD", "mc", "ready", "local"]
|
|
|
|
|
interval: 5s
|
|
|
|
|
timeout: 5s
|
|
|
|
|
retries: 12
|
|
|
|
|
|
|
|
|
|
# สร้าง bucket docx-versions + docx-templates แบบ private (anonymous = none)
|
|
|
|
|
# idempotent — รันซ้ำได้ด้วย --ignore-existing
|
|
|
|
|
minio-init:
|
|
|
|
|
image: minio/mc:latest
|
|
|
|
|
depends_on:
|
|
|
|
|
minio:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
restart: "no"
|
|
|
|
|
environment:
|
|
|
|
|
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
|
|
|
|
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
|
|
|
|
entrypoint: >
|
|
|
|
|
/bin/sh -c "
|
|
|
|
|
set -e;
|
2026-09-01 10:51:14 +07:00
|
|
|
mc alias set local http://minio:39000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD;
|
2026-08-19 10:54:55 +07:00
|
|
|
mc mb --ignore-existing local/docx-versions;
|
|
|
|
|
mc mb --ignore-existing local/docx-templates;
|
|
|
|
|
mc anonymous set none local/docx-versions;
|
|
|
|
|
mc anonymous set none local/docx-templates;
|
|
|
|
|
echo 'MinIO buckets ready: docx-versions, docx-templates (private)';
|
|
|
|
|
"
|
|
|
|
|
|
|
|
|
|
# --- Keycloak (OIDC) -----------------------------------------------
|
|
|
|
|
# realm word-versioning import อัตโนมัติตอน startup จาก /keycloak/realm-export.json
|
|
|
|
|
# ไม่ mount volume เก็บข้อมูล realm โดยตั้งใจ: ตั้งแต่ compose down ขึ้นไป realm จะถูก
|
|
|
|
|
# import ใหม่จาก realm-export.json (ไฟล์นี้คือ source of truth ของ realm config ฝั่ง dev)
|
|
|
|
|
# — แก้อะไรใน realm ให้แก้ใน realm-export.json แล้ว docker compose down && up
|
|
|
|
|
keycloak:
|
|
|
|
|
image: quay.io/keycloak/keycloak:26.2
|
|
|
|
|
command: start-dev --import-realm
|
|
|
|
|
environment:
|
|
|
|
|
KC_BOOTSTRAP_ADMIN_USERNAME: ${KC_BOOTSTRAP_ADMIN_USERNAME}
|
|
|
|
|
KC_BOOTSTRAP_ADMIN_PASSWORD: ${KC_BOOTSTRAP_ADMIN_PASSWORD}
|
2026-08-19 23:06:57 +07:00
|
|
|
# HTTPS ด้วย cert ของ office-addin-dev-certs (CA ถูก trust ใน keychain แล้ว)
|
|
|
|
|
# จำเป็นเพราะ Office Dialog API บังคับ HTTPS สำหรับหน้า login — http:// โดนปฏิเสธ
|
|
|
|
|
KC_HTTPS_CERTIFICATE_FILE: /certs/localhost.crt
|
|
|
|
|
KC_HTTPS_CERTIFICATE_KEY_FILE: /certs/localhost.key
|
2026-08-19 10:54:55 +07:00
|
|
|
ports:
|
2026-08-19 23:06:57 +07:00
|
|
|
- "8443:8443" # OIDC endpoints + admin console (HTTPS — ใช้ตัวนี้)
|
|
|
|
|
# 8080 (http) เปิดไว้เฉพาะใน network ของ compose ให้ service `api` (profile) ใช้ภายใน
|
2026-08-19 10:54:55 +07:00
|
|
|
volumes:
|
|
|
|
|
- ./keycloak/realm-export.json:/opt/keycloak/data/import/realm-export.json:ro
|
2026-08-19 23:06:57 +07:00
|
|
|
- ${HOME}/.office-addin-dev-certs:/certs:ro
|
2026-08-19 10:54:55 +07:00
|
|
|
|
|
|
|
|
# --- Backend API (ยังไม่เปิดใช้ — รอ Phase 2 สร้าง Dockerfile) -----
|
2026-09-01 10:51:14 +07:00
|
|
|
# รันฝั่ง host ด้วย `dotnet run` ได้เลย โดยชี้ config ไปที่ localhost:5432 / localhost:39000
|
2026-08-19 10:54:55 +07:00
|
|
|
# หรือรันใน network นี้: docker compose --profile api up -d --build
|
|
|
|
|
api:
|
|
|
|
|
build:
|
|
|
|
|
context: ./backend
|
|
|
|
|
dockerfile: WordVersioning.Api/Dockerfile
|
|
|
|
|
profiles: ["api"]
|
|
|
|
|
depends_on:
|
|
|
|
|
db:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
minio:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
keycloak:
|
|
|
|
|
condition: service_started
|
|
|
|
|
ports:
|
|
|
|
|
- "8081:8080"
|
|
|
|
|
|
|
|
|
|
volumes:
|
|
|
|
|
postgres_data:
|
|
|
|
|
minio_data:
|