From 8584f9ec7b0a8df5faaef9d07e6de0dfb96cf92a Mon Sep 17 00:00:00 2001 From: junmin Date: Mon, 7 Sep 2026 01:30:57 +0900 Subject: [PATCH] fix: preserve existing Pi compose volumes --- .github/workflows/ci-cd.yml | 4 ++++ db/README.md | 8 ++++---- docs/CI-CD.md | 9 +++++++-- pi/deploy.sh | 5 +++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 1a2f821..d8d2721 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -35,6 +35,10 @@ jobs: - uses: actions/checkout@v6 - name: Validate shell syntax run: bash -n pi/deploy.sh ml-server/deploy-ai.sh + - name: Validate production Compose identity + run: | + grep -Fq 'COMPOSE_PROJECT="${RALLYTRACK_COMPOSE_PROJECT:-devops}"' pi/deploy.sh + test "$(grep -Fc -- '-p "$COMPOSE_PROJECT"' pi/deploy.sh)" = "2" - name: Validate local Compose model run: docker compose -f docker-compose.yml config --quiet - name: Validate Pi Compose model diff --git a/db/README.md b/db/README.md index cb6e45c..5695567 100644 --- a/db/README.md +++ b/db/README.md @@ -12,12 +12,12 @@ RallyTrack는 아직 Flyway를 사용하지 않습니다. Pi 배포 스크립트 cd /home/junmin/RallyTrack/devops # 먼저 백업 -docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env \ +docker compose -p devops -f docker-compose.pi.yml --env-file .env \ exec -T db sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE" videos' \ > videos-before-analysis-mode.sql # forward migration -docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env \ +docker compose -p devops -f docker-compose.pi.yml --env-file .env \ exec -T db sh -c 'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE"' \ < db/migrations/20260906_add_video_analysis_mode.sql ``` @@ -25,7 +25,7 @@ docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env \ ## 확인 ```bash -docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env \ +docker compose -p devops -f docker-compose.pi.yml --env-file .env \ exec -T db sh -c 'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE" -e \ "SELECT video_id, title, analysis_mode, video_status, upload_date FROM videos ORDER BY video_id DESC LIMIT 20"' ``` @@ -39,7 +39,7 @@ docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env \ 앱 롤백 시 새 nullable 컬럼을 남겨둬도 구버전과 호환되므로 자동 롤백은 컬럼을 삭제하지 않습니다. ```bash -docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env \ +docker compose -p devops -f docker-compose.pi.yml --env-file .env \ exec -T db sh -c 'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD" "$MARIADB_DATABASE"' \ < db/rollback/20260906_drop_video_analysis_mode.sql ``` diff --git a/docs/CI-CD.md b/docs/CI-CD.md index 045372e..554c4ab 100644 --- a/docs/CI-CD.md +++ b/docs/CI-CD.md @@ -66,6 +66,11 @@ runner 사용자는 Pi에서 GitHub 저장소를 fetch하고 Docker를 실행할 Pi 스크립트는 다음 순서로 동작합니다. +운영 데이터 볼륨은 최초 수동 배포 때 만들어진 Compose 프로젝트명 `devops`에 속합니다. +배포 스크립트도 기본적으로 이 이름을 재사용해 `devops_db_data`와 `devops_minio_data`를 +그대로 연결합니다. 다른 기존 프로젝트명을 사용하는 서버만 +`RALLYTRACK_COMPOSE_PROJECT`로 명시적으로 재정의합니다. + 1. 중복 배포를 파일 잠금으로 차단하고, 대상 저장소에 로컬 변경이 있으면 중단합니다. 2. 기본 브랜치에 포함된 workflow의 검증 SHA인지 확인하고 fast-forward합니다. 3. Compose 구성을 검사하고 변경 서비스의 이미지만 빌드합니다. @@ -122,8 +127,8 @@ cloudflared 128 MB입니다. Java heap은 768 MB로 제한됩니다. 이 구성 ```bash # Pi cd /home/junmin/RallyTrack/devops -docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env ps -docker compose -p rallytrack -f docker-compose.pi.yml --env-file .env logs --tail=200 backend frontend +docker compose -p devops -f docker-compose.pi.yml --env-file .env ps +docker compose -p devops -f docker-compose.pi.yml --env-file .env logs --tail=200 backend frontend # ML 서버 systemctl status rallytrack-ai diff --git a/pi/deploy.sh b/pi/deploy.sh index 76ba05b..9b10fbd 100755 --- a/pi/deploy.sh +++ b/pi/deploy.sh @@ -24,6 +24,7 @@ DEFAULT_ROOT="$(cd -- "$SCRIPT_DIR/../.." && pwd)" DEPLOY_ROOT="${RALLYTRACK_ROOT:-$DEFAULT_ROOT}" DEVOPS_DIR="$DEPLOY_ROOT/devops" ENV_FILE="${RALLYTRACK_ENV_FILE:-$DEVOPS_DIR/.env}" +COMPOSE_PROJECT="${RALLYTRACK_COMPOSE_PROJECT:-devops}" COMPONENT="${1:-all}" EXPECTED_SHA="${2:-}" @@ -184,7 +185,7 @@ rollback() { fi done - local compose=(docker compose -p rallytrack -f "$DEVOPS_DIR/docker-compose.pi.yml" --env-file "$ENV_FILE") + local compose=(docker compose -p "$COMPOSE_PROJECT" -f "$DEVOPS_DIR/docker-compose.pi.yml" --env-file "$ENV_FILE") if [[ "$rebuild_previous" == true ]]; then for service in "${BUILT_SERVICES[@]}"; do "${compose[@]}" build "$service" @@ -207,7 +208,7 @@ else fi ROLLBACK_REQUIRED=true -COMPOSE=(docker compose -p rallytrack -f "$DEVOPS_DIR/docker-compose.pi.yml" --env-file "$ENV_FILE") +COMPOSE=(docker compose -p "$COMPOSE_PROJECT" -f "$DEVOPS_DIR/docker-compose.pi.yml" --env-file "$ENV_FILE") "${COMPOSE[@]}" config --quiet if [[ "$COMPONENT" != "frontend" ]]; then