# 운영 배포용 컴포즈 — EC2에서 이 파일 하나로 전체 스택이 뜹니다. # 사용법: cd deploy && cp .env.example .env (비밀번호 수정) && docker compose -f docker-compose.prod.yml up -d --build # 학습 포인트: 개발(로컬)과 운영의 차이 — # - DB 포트를 외부에 안 엽니다(컨테이너끼리 내부 네트워크로만 통신) # - 비밀번호는 .env 파일로 주입 (코드/이미지에 안 넣음) # - 재부팅해도 자동 시작(restart: unless-stopped) services: postgres: image: postgres:17-alpine container_name: mirim-postgres environment: POSTGRES_DB: mirim POSTGRES_USER: mirim POSTGRES_PASSWORD: ${DB_PASSWORD:?deploy/.env에 DB_PASSWORD를 설정하세요} volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U mirim"] interval: 10s timeout: 5s retries: 5 backend: build: ../backend container_name: mirim-backend environment: DB_HOST: postgres # 학습 포인트: 컨테이너끼리는 서비스 이름이 곧 주소예요 DB_PORT: 5432 DB_NAME: mirim DB_USER: mirim DB_PASSWORD: ${DB_PASSWORD} depends_on: postgres: condition: service_healthy restart: unless-stopped # 프론트 빌드 결과물을 공유 볼륨(webroot)에 복사해 주고 종료하는 일회성 컨테이너 frontend-build: build: ../frontend container_name: mirim-frontend-build volumes: - webroot:/out restart: "no" caddy: image: caddy:2-alpine container_name: mirim-caddy ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - webroot:/srv:ro - caddy-data:/data # HTTPS 인증서 보관 (재시작해도 유지) depends_on: - backend - frontend-build restart: unless-stopped # Gitea — 가벼운 사내 Git 서버. 학생들이 clone/commit/push를 연습하는 곳. # 학습 포인트: GitHub 같은 서비스를 우리 서버 안에 직접 띄운 것. 웹 UI는 :3000. gitea: image: gitea/gitea:1.23 container_name: mirim-gitea environment: GITEA__server__ROOT_URL: http://${GIT_HOST:-3.36.160.246}:3000/ GITEA__server__SSH_PORT: "222" GITEA__service__DISABLE_REGISTRATION: "false" # 학생 스스로 가입 가능 GITEA__security__INSTALL_LOCK: "true" # 웹 설치 마법사 건너뛰기(설정은 env로 완료) ports: - "3000:3000" # 웹 UI + HTTP clone/push - "222:22" # SSH clone/push (선택) volumes: - gitea-data:/data restart: unless-stopped volumes: pgdata: webroot: caddy-data: gitea-data: