문서로 돌아가기
배포
전용 서버 설정
Ansible 기반 인프라: 기본 강화, 앱 배포, vault 관리 시크릿.
•
12분 읽기
•PlanToCode는 Ansible 플레이북을 통해 관리되는 전용 서버에서 실행됩니다. 이 문서는 인프라 설정, 보안 강화, 배포 프로세스를 다룹니다.
인프라 레이어
인프라는 각각 전용 플레이북에 의해 관리되는 레이어로 구성됩니다:
- 기본 레이어: OS 강화, SSH 구성, 방화벽 규칙
- 데이터베이스 레이어: 복제와 백업이 있는 PostgreSQL 17
- 캐시 레이어: 세션 상태와 작업 큐를 위한 Redis 7+
- 애플리케이션 레이어: systemd 서비스가 있는 Rust 서버 바이너리
- 프록시 레이어: SSL 종료가 있는 Nginx 리버스 프록시
서버 지역
PlanToCode는 지리적 중복성을 위해 두 지역에서 실행됩니다:
- EU 지역: Hetzner 전용 서버 (api-eu.plantocode.com)
- US 지역: InterServer 전용 서버 (api-us.plantocode.com)
서버 요구사항
- Debian 12 또는 Ubuntu 22.04 LTS
- 4+ CPU 코어, 16GB+ RAM, 200GB+ SSD
- 포트 22, 80, 443에 대한 방화벽 액세스가 있는 공용 IPv4
- Ansible 배포를 위한 SSH 키 액세스
기본 강화
site-base.yml이 보안 강화를 적용합니다:
- 루트 SSH 로그인 비활성화, 키 인증 필요
- 최소 열린 포트로 UFW 방화벽 구성
- 무차별 대입 보호를 위한 fail2ban 설치
- 자동 보안 업데이트 활성화
- 감사 로깅 구성
PostgreSQL 설정
PostgreSQL 17이 프로덕션 용도로 구성됩니다:
- PgBouncer를 통한 연결 풀링
- pg_dump를 통한 자동화된 일일 백업
- 시점 복구를 위한 WAL 아카이빙
- 모든 연결에 SSL 필수
- 멀티 테넌트 데이터를 위한 행 수준 보안
Redis 설정
Redis 7+가 캐싱과 세션 상태를 처리합니다:
- 비밀번호 인증 필수
- 내구성을 위한 AOF 영속
- 퇴거 정책이 있는 메모리 제한
- 연결을 위한 TLS 암호화
무중단 배포
배포는 롤링 업데이트 전략을 사용합니다:
- 실행 중인 버전과 함께 새 바이너리 업로드
- 새 버전이 준비되었는지 헬스 체크 확인
- 정상 종료로 Systemd 재시작
- 전환 중 로드 밸런서가 연결 드레인
- 이전 바이너리 심볼릭 링크를 통한 롤백 가능
빠른 시작
- 인프라 리포지토리 클론
- inventory.example을 inventory로 복사하고 호스트 구성
- .vault_pass에 vault 비밀번호 설정
- 실행: ansible-playbook -i inventory site-base.yml
- 실행: ansible-playbook -i inventory site-app.yml
시크릿 관리
민감한 구성은 Ansible Vault를 사용합니다:
- 데이터베이스 자격 증명
- LLM 프로바이더용 API 키
- SSL 인증서와 개인 키
- Auth0 클라이언트 시크릿
- Stripe 웹훅 시크릿
일반 작업
ansible-playbook -i inventory site-app.yml --tags deployansible-playbook -i inventory site-base.yml --tags backupansible-playbook -i inventory site-app.yml --tags rollbackansible-playbook -i inventory site-base.yml --tags logs
SSL/TLS 구성
Let's Encrypt가 무료 SSL 인증서를 제공합니다:
- Nginx 플러그인으로 Certbot 구성
- cron 작업을 통한 자동 갱신
- HSTS 헤더 활성화
- TLS 1.2+ 전용, 최신 암호 스위트
보안 체크리스트
- 모든 기본 비밀번호 변경됨
- SSH 키 순환 예약됨
- 방화벽 규칙 감사됨
- 보안 업데이트 자동화됨
- 백업 복원 테스트됨
재해 복구
일반적인 실패 시나리오에 대한 복구 절차:
- 데이터베이스 손상: 최신 pg_dump 백업에서 복원
- 서버 장애: 새 서버 프로비저닝하고 플레이북 실행
- SSL 만료: 수동 certbot renew --force-renewal
- 보안 침해: 모든 자격 증명 순환, 로그 감사