English {#english}
Docker Hub Stack (DB · Redis · App) and Ansible Deploy Plan
Purpose: Define strategy to install a MariaDB, Redis, Application stack (optimized for Frappe/ERPNext v16) from Docker Hub and deploy with Ansible.
No code generation — plan, strategy, and alignment with current system only.
References: saas-db-separation-and-scaling-plan; redis-separation-pulumi-ansible-plan; ansible-implementation-plan; frappe-v15-to-v16-upgrade-plan.
1. Frappe v16 recommended stack
MariaDB 10.11, Redis 7-alpine, Node 24, Python 3.12+. Images chosen from Docker Hub to match.
2–8. Image sources, deployment patterns, IaC, alignment, run, next steps, summary
- §2 Images: MariaDB
mariadb:10.11; Redisredis:7-alpine; Appfrappe/bench:latestor customiamfork/prego-repo:latest. Custom image may require Docker Hub login (PAT). - §3 Pattern A (current Prego): Separate hosts — prego_db_servers (mariadb:10.11), prego_redis_servers (redis:7-alpine), prego_nodes (bench or prego-repo); firewall 3306/6379 from App only. Pattern B: Single host, one bridge network; DB/Redis no external ports; for dev/small single-tenant.
- §4 IaC: docker_login (if custom image), image pull, network (B only), mariadb/redis/app containers (env, volumes, restart). Principles: network isolation, idempotency, persistence (volumes).
- §5 Prego Ansible: mariadb_server → mariadb:10.11; redis_server → redis:7-alpine; frappe_bench → variable (e.g. iamfork/prego-repo:latest). Keep structure; variable image versions, Docker Hub login when needed, optional Pattern B playbook.
- §6 Run: Docker Hub PAT; vars via Vault or -e; inventory per pattern; ansible-playbook.
- §7 Next: Edge routing (cloudflare-orchestration-and-gtape-backup-plan); MariaDB my.cnf (mariadb-mycnf-optimization-plan); Ansible Vault for secrets.
- §8 Summary: Pull DB/Redis/App from Docker Hub; Ansible IaC; Prego already Pattern A — align with image versions and custom app image.
Full tables (§1–§8) and exact wording are in the Korean section below.
한국어 {#korean}
Docker Hub 기반 DB·Redis·Application 서버 설치 기획서
목적: Frappe/ERPNext v16 환경에 최적화된 MariaDB·Redis·Application 스택을 Docker Hub에서 이미지를 받아 설치하고, Ansible으로 프로덕션급 자동 배포하는 전략을 정의한다.
코드 생성 없음 — 기획·전략·현재 시스템과의 정합성만 정리.
참조:
- saas-db-separation-and-scaling-plan.md (DB·App 서버 분리)
- redis-separation-pulumi-ansible-plan.md (Redis 전용 서버)
- ansible-implementation-plan.md (Ansible 역할·playbook)
- frappe-v15-to-v16-upgrade-plan.md (v16 업그레이드)
1. Frappe v16 추천 기술 스택 (Standard Stack)
Frappe v16은 공식적으로 아래 버전과의 호환·테스트를 권장한다.
| 컴포넌트 | 추천 버전 | 역할 |
|---|---|---|
| MariaDB | 10.11 | v16 공식 예시 기준. 10.6+ 멀티테넌트 성능 최적화. |
| Redis | 7-alpine | 캐시·메시지 브로커. v16은 Redis 6+ 요구. |
| Node.js | 24 | 에셋 빌드(Vite)·서버 사이드 렌더링. |
| Python | 3.12+ | Frappe v16 필수 요구사항. |
— Docker Hub에서 사용할 이미지는 위 버전을 기준으로 선택한다.
2. Docker Hub 이미지 소스 전략
| 컴포넌트 | 이미지 소스 | 비고 |
|---|---|---|
| MariaDB | mariadb:10.11 (공식) | Docker Hub 공식 이미지. v16 공식 예시 기준. |
| Redis | redis:7-alpine (공식) | v16 권장. 경량·안정. |
| Application | (1) frappe/bench:latest (공식) 또는 (2) 커스텀 iamfork/prego-repo:latest | (1) bench CLI·Frappe 프레임워크. (2) ERPNext·HRMS·CRM·prego-saas-app 포함 v16 프로덕션용 커스텀 이미지. |
- 커스텀 앱 이미지 사용 시: Docker Hub 로그인(PAT)이 필요할 수 있음. Ansible에서
community.docker.docker_login으로 인증 후image풀. - 공식 이미지만 사용 시: 로그인 없이 pull 가능.
3. 배포 패턴 두 가지
3.1 패턴 A: 서버 분리형 (현행 Prego)
DB·Redis·App을 물리적으로 다른 호스트에 배치. 확장·장애 격리에 유리.
| 역할 | 호스트 그룹 | Docker 이미지 | 비고 |
|---|---|---|---|
| DB | prego_db_servers | mariadb:10.11 | 방화벽으로 3306은 App만 허용. |
| Redis | prego_redis_servers | redis:7-alpine | 방화벽으로 6379는 App만 허용. DB 1/2/3 역할 분리. |
| App | prego_nodes | frappe/bench:latest 또는 iamfork/prego-repo:latest | 원격 DB·Redis URL로 연결. v16 이미지에 ERPNext·HRMS·CRM·prego-saas-app 포함. |
- Ansible: 현재 playbook이 이미 이 패턴(역할별 play, docker + mariadb_server, docker + redis_server, docker + frappe_bench + frappe_site).
- 이미지 버전만 변수로 통일하면 됨(MariaDB 10.11, Redis 7-alpine, 앱 이미지 태그).
3.2 패턴 B: 단일 호스트 통합 스택
한 대의 서버에 DB·Redis·App을 전용 브릿지 네트워크로 묶어 구성. 소규모·단일 테넌트에 적합.
| 항목 | 내용 |
|---|---|
| 네트워크 | erp-network 등 하나의 Docker 네트워크 생성. DB·Redis는 외부 포트 노출 없이 컨테이너명으로만 통신. |
| 보안 | Security by Design — DB·Redis는 앱 컨테이너 내부에서만 접근. |
| Playbook | 단일 hosts: all_servers play에서 docker_network → mariadb → redis → app 컨테이너 순서로 배포. |
- Prego가 멀티테넌트·서버 분리를 전제로 하므로, 패턴 A를 기본으로 하고 패턴 B는 개발·스테이징 또는 소규모 단일 테넌트용 옵션으로 둘 수 있음.
4. Ansible을 이용한 인프라 배포 전략 (IaC)
구글 SRE의 Infrastructure as Code 원칙에 따라 Ansible으로 환경을 표준화한다.
4.1 Playbook 구성 요소 (개념)
| 요소 | 내용 |
|---|---|
| Docker 로그인 | 커스텀 이미지(예: iamfork/prego-frappe) 사용 시 community.docker.docker_login으로 Docker Hub 인증. docker_hub_token은 환경 변수 또는 Ansible Vault로 전달. |
| 이미지 풀 | 명시적 docker_image: pull 또는 컨테이너 기동 시 자동 pull. |
| 네트워크 | 패턴 B 시 community.docker.docker_network로 erp-network 생성 후 컨테이너에 연결. 패턴 A는 호스트 간 통신이므로 네트워크는 호스트 로컬만 필요 시 사용. |
| MariaDB 컨테이너 | mariadb:10.11, 환경변수 MYSQL_ROOT_PASSWORD, 볼륨 db_data:/var/lib/mysql, restart_policy, (패턴 B 시) networks. |
| Redis 컨테이너 | redis:7-alpine, restart_policy, (패턴 B 시) networks. 필요 시 redis.conf·비밀번호·메모리 정책. |
| App 컨테이너 | 이미지 변수(app_image), 환경변수 DB_HOST, REDIS_CACHE 등, ports 노출(예: 8000), volumes·networks. |
4.2 Principal Engineer 인사이트
| 원칙 | 내용 |
|---|---|
| 네트워크 격리 | 전용 브릿지 네트워크 사용 시 DB·Redis는 외부 포트를 열지 않고 앱 컨테이너 내부에서만 통신. Security by Design. |
| 멱등성(Idempotency) | 동일 playbook을 여러 번 실행해도 이미 올바른 상태면 변경 없음. 서버 증설·재배포 시 재현성(Reproducibility) 보장. |
| 데이터 보존(Persistence) | MariaDB·Redis 데이터는 Docker 볼륨 또는 호스트 바인드 마운트에 두어, 컨테이너 삭제 후에도 유지. |
5. 현재 Prego Ansible과의 정합성
| 현행 prego-ansible | 본 기획과의 관계 |
|---|---|
| mariadb_server | mariadb:10.11 사용. Docker Hub 공식 이미지. v16 공식 예시 기준. |
| redis_server | 전용 서버에 Redis 컨테이너. redis:7-alpine (redis_version 변수). |
| frappe_bench | frappe/bench:latest 사용. 커스텀 이미지 도입 시 변수 frappe_bench_image: "iamfork/prego-repo:latest" 등으로 교체. v16 이미지에 ERPNext·HRMS·CRM·prego-saas-app 포함. |
| 서버 분리 | DB·Redis·App 역할별 호스트 그룹·play — 패턴 A와 동일. |
— 정리: 현재 구조를 유지한 채 (1) 이미지 버전 변수화(MariaDB 10.11, Redis 7-alpine, 앱 태그), (2) Docker Hub 로그인(커스텀 앱 이미지 사용 시), (3) 선택적으로 패턴 B용 playbook을 별도로 두는 방안이 기획과 부합한다.
6. 실행 방법 (기획 수준)
| 단계 | 내용 |
|---|---|
| 1. Docker Hub 토큰 | Docker Hub PAT(Personal Access Token) 발급. Private 이미지 또는 rate limit 완화용. |
| 2. 변수 전달 | docker_hub_token, db_root_password, redis_requirepass 등은 Ansible Vault 또는 -e로 전달. 평문 저장 금지. |
| 3. 인벤토리 | 패턴 A: prego_db_servers, prego_redis_servers, prego_nodes 각각 호스트·변수 설정. 패턴 B: all_servers 등 단일 그룹. |
| 4. Playbook 실행 | ansible-playbook -i inventory.yml deploy.yml --extra-vars "docker_hub_token=..." 또는 Vault 암호화 파일 로드. |
7. 다음 단계 제안
| 순서 | 제안 | 비고 |
|---|---|---|
| 1 | Cloudflare Workers Edge Routing | 테넌트 요청을 이 스택이 올라간 서버들로 분산. 기획서: cloudflare-orchestration-and-gtape-backup-plan.md. |
| 2 | MariaDB my.cnf 최적화 | 10.11 기준 8GB~16GB RAM 환경·Frappe 특화 파라미터. 상세: mariadb-mycnf-optimization-plan.md — buffer_pool·flush·연결·utf8mb4, R2 백업 병행 권장. |
| 3 | Ansible Vault | 비밀번호·Docker Hub 토큰을 Vault로 암호화하고, playbook 실행 시 --ask-vault-pass 또는 vault password 파일 사용. |
8. 요약
- Docker Hub에서 DB(mariadb:10.11)·Redis(7-alpine)·Application(frappe/bench 또는 iamfork/prego-repo) 이미지를 받아 설치.
- Ansible으로 IaC화: 역할별 play·변수·Docker 로그인(필요 시)·네트워크·볼륨·재시작 정책.
- 현재 Prego는 서버 분리형(패턴 A)으로 이미 구성되어 있으므로, 이미지 버전·커스텀 앱 이미지·Vault만 보강하면 Frappe v16 추천 스택 및 Principal Engineer 가이드와 정합된다.