# 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: - "35432:5432" # เปิดให้ backend ที่รันด้วย dotnet run บน host เชื่อมได้ (host 35432 → container 5432) 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) ----------------------- # container listen 39000/39001 เท่ากับ host ตรงๆ (ไม่ map ข้าม port) — map ข้ามแล้ว # console จะ redirect/-เชื่อม server ผิด port (login error / เด้งไป :9001 ตาย) minio: # quay.io mirror — Docker Hub ทำ minio/minio เป็น private แล้ว (pull access denied) image: quay.io/minio/minio:latest command: server /data --address ":39000" --console-address ":39001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} # ให้ healthcheck (mc ready) เรียกผ่าน alias "local" ได้ 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 ports: - "39000:39000" # S3 API - "39001:39001" # MinIO console 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: # quay.io mirror — Docker Hub ทำ minio/mc เป็น private แล้ว (pull access denied) image: quay.io/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; mc alias set local http://minio:39000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD; 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} # 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 ports: - "8443:8443" # OIDC endpoints + admin console (HTTPS — ใช้ตัวนี้) # 8080 (http) เปิดไว้เฉพาะใน network ของ compose ให้ service `api` (profile) ใช้ภายใน volumes: - ./keycloak/realm-export.json:/opt/keycloak/data/import/realm-export.json:ro # HOME unset ใน PowerShell — fallback ไป USERPROFILE (Windows); Mac/Git Bash ใช้ HOME ตามปกติ - ${HOME:-${USERPROFILE}}/.office-addin-dev-certs:/certs:ro # --- Backend API (ยังไม่เปิดใช้ — รอ Phase 2 สร้าง Dockerfile) ----- # รันฝั่ง host ด้วย `dotnet run` ได้เลย โดยชี้ config ไปที่ localhost:5432 / localhost:39000 # หรือรันใน 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: