은하계 커뮤니티를 실서버에 올리려고 VM에 Docker를 얹었던 과정을 정리해봅니다. "실서버 배포기" 글이 전체 여정이라면, 이건 그 중 인프라 세팅 부분만 떼어낸 기술 메모입니다.
여기까지는 평범한데, VM으로 Oracle Cloud(OCI)의 ARM 무료 인스턴스를 골랐더니 예상 못한 데서 계속 걸렸습니다.
처음에 DEPLOY.md를 Ubuntu 기준으로 써놨는데, 실제 OCI ARM VM 기본 이미지는 Oracle Linux였습니다. 다른 점이 한둘이 아니었습니다.
get.docker.com 스크립트가 아니라 dnf로 CentOS용 docker-ce 레포를 추가해서 설치해야 함 (기본은 podman)ubuntu가 아니라 opcfirewall-cmd --permanent --add-port=80/tcp 로 열어야 함:z 옵션을 안 붙이면 컨테이너가 파일을 못 읽음거기다 OCI는 방화벽이 두 겹입니다. VCN 보안 목록(콘솔에서 0.0.0.0/0 TCP 80 허용)을 열어도 VM 안쪽 firewalld가 막고 있으면 그대로 막힙니다. 이 두 곳을 다 열어야 한다는 걸 모르고 한동안 "왜 접속이 안 되지" 하고 헤맸습니다.
빌드 컨텍스트를 레포 루트로 잡아둔 상태에서, 이미지 크기를 줄이려고 .dockerignore에 server/scripts 전체를 넣어놨습니다. 그런데 나중에 고아 이미지를 주기적으로 청소하는 크론 스크립트(cleanup_orphan_images.py)를 이미지 안에 넣으려고 했더니 COPY가 "not found"로 실패했습니다. dockerignore가 빌드에 필요한 파일까지 통째로 걸러낸 것. server/scripts/seed_demo.py 하나만 콕 집어 제외하는 식으로 바꿔서 해결했습니다.
운영 서버 하나로는 배포 전 검증이 불안해서, QA(스테이징) 환경을 별도 VM 없이 같은 VM 안에 포트만 다르게(:8080) 띄우는 쪽을 택했습니다.
처음엔 Cloudflare SSL 모드가 Flexible이라, 사용자→Cloudflare 구간은 HTTPS였지만 Cloudflare→VM(origin) 구간은 평문 HTTP였습니다. 로그인 토큰이 이 구간에서 암호화 없이 흐르고 있었던 셈이라, origin 서버에도 443을 열어 Cloudflare Full(strict)로 전환할 준비를 했습니다.
VM에 Docker 얹는 것 자체는 튜토리얼대로 하면 되는데, 실제로 시간을 잡아먹은 건 전부 "선택한 VM의 배포판이 튜토리얼과 다를 때" 나오는 디테일이었습니다. Oracle Linux인 걸 미리 알았다면 DEPLOY.md를 처음부터 dnf/firewalld/opc 기준으로 썼을 텐데, Ubuntu 가정하고 시작했다가 하나씩 부딪히면서 고쳤습니다.