Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions db/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,20 @@ 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
```

## 확인

```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"'
```
Expand All @@ -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
```
9 changes: 7 additions & 2 deletions docs/CI-CD.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 구성을 검사하고 변경 서비스의 이미지만 빌드합니다.
Expand Down Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions pi/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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:-}"

Expand Down Expand Up @@ -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"
Expand All @@ -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
Expand Down