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
| 용도 | 예시 |
|---|---|
| latest | iamfork/prego-repo:latest — 최신 빌드. |
| 커밋 고정 | iamfork/prego-repo:pregoapp-abc1234 — prego-saas-app 특정 커밋 기준. |
| 재현성(권장) | iamfork/prego-repo@sha256:... — 빌드 완료 시 Actions 로그에 출력되는 digest. |
Production에서는 digest로 고정하면 동일 바이너리로 롤백·재배포가 보장된다.
2. 서버에 Compose 배치
- prego-docker 레포의 compose 파일을 서버(예:
/opt/prego)에 복사한다.compose/docker-compose.prod.example.yml→ 단일 앱 + MariaDB + Redis.compose/bluegreen/→ Blue/Green용 compose·nginx·배포 스크립트.
- .env 생성:
MARIADB_ROOT_PASSWORD,IMAGE_TAG또는IMAGE_DIGEST. - (Blue/Green 사용 시)
internal,sites,logs네트워크/볼륨을 먼저 생성한 뒤 bluegreen compose 사용.
자세한 필수 env·볼륨·네트워크는 prego-docker의 compose/README.md, compose/bluegreen/README.md 참고.
3. 단일 스택 기동 (최초/간단 운영)
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 bash 후 bench 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:...이 값을 복사해 서버 .env의 IMAGE_DIGEST 또는 compose의 image: iamfork/prego-repo@sha256:...에 사용한다.
5. Blue/Green 배포 (무중단)
- prego-docker의 compose/bluegreen/ 내용을 서버에 두고, nginx upstream 설정(
nginx/conf.d/upstream.conf)을 준비한다. - 배포 시:
./deploy-bluegreen.sh <digest>실행.- inactive 쪽만 새 digest로 재생성 → healthcheck → nginx upstream 전환 → reload.
- 상세: prego-docker compose/bluegreen/README.md 및 deploy-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또는inventory의prego_nodesvars. - 동작: 배포 시 컨테이너를 만들 때
docker pull iamfork/prego-repo:latest가 되므로, 그 시점에 Docker Hub에 올라가 있는 최신latest를 받는다. 이미지 이름을 바꿀 필요 없음.
# inventory 또는 group_vars/prego_nodes.ymlprego_nodes: vars: frappe_bench_image: iamfork/prego-repo:latest7.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.txt→iamfork/prego-repo@sha256:...
Ansible에서uri로 그 URL을 가져온 뒤frappe_bench_image에 넣고community.docker.docker_container에 전달.
정리하면, “최신 버전” 을 쓰려면 (7.1) latest 한 개만 변수에 두고, 배포할 때마다 pull 하면 된다. 재현성·롤백이 중요하면 (7.2) 로 digest를 변수에 넣고, 완전 자동화가 필요하면 (7.3) 로 URL에서 가져오면 된다.
참고
- prego-docker README: Compose and deployment, compose/·bluegreen/·promote 예시.
- 기획서: prego-docker-implementation-plan.md §9 (Production compose, digest 승격, Blue/Green).
- Ansible 연계: prego-ansible에서 앱 이미지를
iamfork/prego-repo태그/digest로 지정해 사용할 수 있음. docker-hub-stack-ansible-deploy-plan.md.