문서로 돌아가기
배포

전용 서버 설정

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 재시작
  • 전환 중 로드 밸런서가 연결 드레인
  • 이전 바이너리 심볼릭 링크를 통한 롤백 가능

빠른 시작

  1. 인프라 리포지토리 클론
  2. inventory.example을 inventory로 복사하고 호스트 구성
  3. .vault_pass에 vault 비밀번호 설정
  4. 실행: ansible-playbook -i inventory site-base.yml
  5. 실행: ansible-playbook -i inventory site-app.yml

시크릿 관리

민감한 구성은 Ansible Vault를 사용합니다:

  • 데이터베이스 자격 증명
  • LLM 프로바이더용 API 키
  • SSL 인증서와 개인 키
  • Auth0 클라이언트 시크릿
  • Stripe 웹훅 시크릿

일반 작업

  • ansible-playbook -i inventory site-app.yml --tags deploy
  • ansible-playbook -i inventory site-base.yml --tags backup
  • ansible-playbook -i inventory site-app.yml --tags rollback
  • ansible-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
  • 보안 침해: 모든 자격 증명 순환, 로그 감사