Skip to content

English {#english}

Deploy iamfork/prego-repo on server (e.g. Hetzner) with Compose; use digest pinning and Blue/Green. Image from prego-docker GitHub Actions. Copy compose from repo (compose/ or bluegreen/), set .env (MARIADB_ROOT_PASSWORD, IMAGE_TAG/IMAGE_DIGEST). Full details: see Korean section below.


한국어 {#korean}

prego-docker 이미지 서버 배포 (Compose · Digest · Blue/Green)

목적: Docker Hub 이미지 iamfork/prego-repo를 서버(Hetzner 등)에서 Compose로 기동하고, digest 고정·Blue/Green 배포로 운영하는 절차를 정리한다.

전제

  • 이미지: prego-docker 레포에서 GitHub Actions로 빌드·푸시된 iamfork/prego-repo (ERPNext v15 + HRMS + prego-saas-app).
  • 레포: Pregoi/prego-docker. Compose 예시는 compose/ 하위에 있음.

1. 이미지 태그와 digest

용도예시
latestiamfork/prego-repo:latest — 최신 빌드.
커밋 고정iamfork/prego-repo:pregoapp-abc1234 — prego-saas-app 특정 커밋 기준.
재현성(권장)iamfork/prego-repo@sha256:... — 빌드 완료 시 Actions 로그에 출력되는 digest.

Production에서는 digest로 고정하면 동일 바이너리로 롤백·재배포가 보장된다.

2. 서버에 Compose 배치

  1. prego-docker 레포의 compose 파일을 서버(예: /opt/prego)에 복사한다.
    • compose/docker-compose.prod.example.yml → 단일 앱 + MariaDB + Redis.
    • compose/bluegreen/ → Blue/Green용 compose·nginx·배포 스크립트.
  2. .env 생성: MARIADB_ROOT_PASSWORD, IMAGE_TAG 또는 IMAGE_DIGEST.
  3. (Blue/Green 사용 시) internal, sites, logs 네트워크/볼륨을 먼저 생성한 뒤 bluegreen compose 사용.

자세한 필수 env·볼륨·네트워크는 prego-docker의 compose/README.md, compose/bluegreen/README.md 참고.

3. 단일 스택 기동 (최초/간단 운영)

Terminal window
cd /opt/prego
# .env에 MARIADB_ROOT_PASSWORD, IMAGE_TAG=latest (또는 IMAGE_DIGEST=sha256:...)
docker compose -f compose/docker-compose.prod.example.yml up -d

사이트 생성·마이그레이션은 admin 컨테이너에서:
docker compose exec admin bashbench new-site ..., bench --site ... install-app erpnext 등.

4. Digest 확인 (빌드 후)

prego-docker의 GitHub Actions build-and-push 워크플로가 끝나면 로그에 다음이 출력된다:

Image digest: sha256:...
Use for production: iamfork/prego-repo@sha256:...

이 값을 복사해 서버 .envIMAGE_DIGEST 또는 compose의 image: iamfork/prego-repo@sha256:...에 사용한다.

5. Blue/Green 배포 (무중단)

  1. prego-docker의 compose/bluegreen/ 내용을 서버에 두고, nginx upstream 설정(nginx/conf.d/upstream.conf)을 준비한다.
  2. 배포 시: ./deploy-bluegreen.sh <digest> 실행.
    • inactive 쪽만 새 digest로 재생성 → healthcheck → nginx upstream 전환 → reload.
  3. 상세: prego-docker compose/bluegreen/README.mddeploy-bluegreen.sh 참고.

6. Staging → Production 승격 (선택)

prego-docker 레포에 .github/workflows/promote.yml.example이 있음.
이름을 promote.yml로 바꾸고, workflow_dispatch 입력으로 Staging에서 검증한 digest를 넣어 Production 환경에서만 배포하도록 설정할 수 있다.
배포 단계는 SSH + deploy-bluegreen.sh 등으로 교체.

7. Ansible에서 최신 이미지 지정 (버전업 대응)

이미지가 계속 버전업될 때 Ansible이 쓰는 이미지 이름을 정하는 방법은 세 가지다.

7.1 항상 같은 이름 + pull 시 최신 사용 (가장 단순)

  • 변수: frappe_bench_image: iamfork/prego-repo:latest
  • 위치: prego-ansible group_vars 또는 inventoryprego_nodes vars.
  • 동작: 배포 시 컨테이너를 만들 때 docker pull iamfork/prego-repo:latest가 되므로, 그 시점에 Docker Hub에 올라가 있는 최신 latest 를 받는다. 이미지 이름을 바꿀 필요 없음.
# inventory 또는 group_vars/prego_nodes.yml
prego_nodes:
vars:
frappe_bench_image: iamfork/prego-repo:latest

7.2 태그/디제스트를 변수로 두고 수동·CI로 갱신

  • 변수: frappe_bench_image: iamfork/prego-repo:pregoapp-abc1234 또는 iamfork/prego-repo@sha256:...
  • 동작: 새 이미지를 배포하고 싶을 때만 이 변수 값을 바꾼 뒤 playbook 실행. “지금 프로덕션에 이 버전”을 명시적으로 관리할 수 있음.
  • 갱신 방법: 빌드 로그에서 digest 복사 → inventory/group_vars 또는 vault에 반영 후 ansible-playbook ... 재실행.

7.3 외부 URL에서 “현재 프로덕션 이미지” 읽기 (자동화)

  • 빌드 워크플로가 성공 시 digest(또는 태그) 를 한 줄로 쓴 파일을 레포/artifact 또는 S3 등에 올려 두고, Ansible이 그 URL을 읽어서 이미지 이름으로 사용.
  • 예: curl -s https://.../prego-repo-production.txtiamfork/prego-repo@sha256:...
    Ansible에서 uri로 그 URL을 가져온 뒤 frappe_bench_image에 넣고 community.docker.docker_container에 전달.

정리하면, “최신 버전” 을 쓰려면 (7.1) latest 한 개만 변수에 두고, 배포할 때마다 pull 하면 된다. 재현성·롤백이 중요하면 (7.2) 로 digest를 변수에 넣고, 완전 자동화가 필요하면 (7.3) 로 URL에서 가져오면 된다.


참고

Help