Docker Compose와 GitHub Actions(appleboy/ssh-action)를 사용한 배포 구성입니다.
GitHub (main 브랜치 push 또는 수동 실행)
↓
GitHub Actions (ubuntu-latest)
↓ SSH (appleboy/ssh-action)
홈서버 (Ubuntu 24.04)
↓
git pull → .env 재생성 → docker compose down → docker compose up --build -d
↓
[db: PostgreSQL] ← [fastapi: FastAPI :8000] ← [colyseus: Colyseus :2567]
Self-hosted Runner 없이 GitHub Actions 무료 플랜에서 동작합니다.
docker-compose.yml 기준:
| 서비스 | 빌드 | 포트 | 의존성 |
|---|---|---|---|
db |
postgres:15-alpine |
5432 | - |
fastapi |
./fastapi-backend |
8000 | db |
colyseus |
./colyseus-server |
2567 | fastapi |
세 서비스는 metaverse-network (bridge)로 연결됩니다.
- Colyseus → FastAPI:
http://fastapi:8000 - FastAPI → DB:
postgresql://team_admin:<DB_PASSWORD>@db:5432/metaverse_db
PostgreSQL 데이터는 ./postgres_data 볼륨에 저장됩니다. 컨테이너를 재시작해도 데이터는 유지됩니다.
| 변수명 | 용도 | 로컬 | 배포(GitHub Secrets) |
|---|---|---|---|
DB_PASSWORD |
PostgreSQL 비밀번호 | ✅ | ✅ |
JWT_SECRET |
JWT 서명 대칭키 | ✅ | ✅ |
SECRET_KEY |
Starlette 세션 시크릿 | ✅ | ✅ |
GOOGLE_CLIENT_ID |
Google OAuth 클라이언트 ID | ✅ | ✅ |
GOOGLE_CLIENT_SECRET |
Google OAuth 클라이언트 Secret | ✅ | ✅ |
BACKEND_URL |
FastAPI 공개 URL (OAuth 콜백) | ✅ | ✅ |
FRONTEND_URL |
Unity WebGL 호스팅 URL | ✅ | ✅ |
SSH_HOST |
홈서버 도메인/IP | - | ✅ |
SSH_PORT |
SSH 포트 | - | ✅ |
SSH_USER |
SSH 접속 유저명 | - | ✅ |
SSH_PRIVATE_KEY |
SSH 개인 키 (PEM 전체) | - | ✅ |
로컬: 루트 .env → docker-compose.yml이 읽어 각 컨테이너 environment:로 주입
배포: GitHub Secrets → Actions에서 SSH로 서버에 전달 → 서버 루트 .env 재생성 → docker-compose.yml이 읽어 주입
FastAPI 컨테이너는
environment:블록을 통해 env var를 받으며, 컨테이너 내부.env파일에 의존하지 않습니다.
- Docker Desktop (또는 Docker Engine + docker-compose-plugin)
- Git
git clone https://github.com/Computer-Research-Association/Metamong_back.git
cd Metamong_back루트의 .env.example을 복사해 .env를 만들고 값을 채웁니다.
cp .env.example .env# .env (루트)
DB_PASSWORD=local_db_password
JWT_SECRET=local_jwt_secret
SECRET_KEY=local_secret_key
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
BACKEND_URL=http://localhost:8000
FRONTEND_URL=http://localhost:3000
NODE_ENV=developmentGoogle OAuth 테스트가 불필요하면
GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET은 임의 문자열로 채워도 서버 기동에는 문제 없습니다.
docker compose up --build -ddocker exec fastapi-app uv run alembic upgrade head| 서비스 | 확인 방법 |
|---|---|
| FastAPI | http://localhost:8000/docs (Swagger UI) |
| Colyseus | http://localhost:2567 |
| PostgreSQL | localhost:5432 (DB 클라이언트로 접속) |
docker compose down데이터까지 초기화하려면:
docker compose down -v
sudo rm -rf ./postgres_data.github/workflows/deploy.yml
main브랜치에 push 시 자동 실행- GitHub Actions 탭에서 수동 실행 가능 (
workflow_dispatch)
1. SSH로 홈서버 접속 (appleboy/ssh-action)
2. git pull origin main — 최신 코드 반영
3. .env 재생성 — GitHub Secrets에서 값을 받아 덮어씀
4. docker compose down — 기존 컨테이너 종료
5. docker compose up --build -d — 새 이미지 빌드 및 재기동
6. docker image prune -f — 미사용 구 이미지 삭제
리포지토리 → Settings → Secrets and variables → Actions → New repository secret
등록해야 할 항목: 위 환경변수 목록의 "배포(GitHub Secrets)" 열 참고
- GitHub Secrets에 새 Secret 추가
deploy.yml의envs:,script내cat > .env,env:블록 세 곳에 추가docker-compose.ymlfastapienvironment:에 추가
서버를 새로 세팅하거나 포맷 후 1회 수행합니다.
sudo apt update && sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker # 재로그인 없이 즉시 적용로컬 머신에서 키 쌍 생성:
ssh-keygen -t ed25519 -C "github-actions-deploy"공개 키(id_ed25519.pub)를 서버의 ~/.ssh/authorized_keys에 추가하고,
개인 키(id_ed25519) 전체 내용을 GitHub Secrets의 SSH_PRIVATE_KEY에 등록합니다.
git clone https://github.com/Computer-Research-Association/Metamong_back.git /home/metamong/Metamong_backGitHub Actions를 수동 실행하거나(workflow_dispatch), main 브랜치에 push하면 자동 배포됩니다.
수동으로 직접 실행하려면 수동 배포 항목을 참고하세요.
cd /home/metamong/Metamong_back
docker exec fastapi-app uv run alembic upgrade head서버에 SSH 접속 후:
cd /home/metamong/Metamong_back
git pull origin main
# 환경변수 변경이 있으면 .env도 수동으로 수정
nano .env
docker compose down
docker compose up --build -d
# 로그로 정상 기동 확인
docker compose logs -f# 전체 서비스 실시간 로그
docker compose logs -f
# 특정 서비스
docker compose logs -f fastapi
docker compose logs -f colyseus
docker compose logs -f db
# 최근 100줄만
docker compose logs --tail=100 fastapidocker compose ps # 컨테이너 상태 확인
docker compose logs fastapi # 오류 메시지 확인컨테이너 내부에서 env var 확인:
docker exec fastapi-app env | grep JWT_SECRET루트 .env 파일이 존재하고 올바른 값이 들어 있는지 확인합니다.
FastAPI가 DB보다 먼저 시작되면 연결에 실패할 수 있습니다.
docker compose restart fastapisudo lsof -i :8000
sudo lsof -i :2567
sudo lsof -i :5432# 캐시 없이 재빌드
docker compose build --no-cache
# 사용하지 않는 이미지/컨테이너 전체 정리 (주의: 모든 이미지 삭제)
docker system prune -a모델 변경 후 배포 시:
docker exec fastapi-app uv run alembic upgrade headsudo chown -R 999:999 ./postgres_data