Game database migration
game.prisma의 운영·검증 database는 이 디렉터리의 migration chain으로
준비합니다. prisma db push는 정식 migration을 대신하지 않습니다.
적용
Git에서 제외된 환경 파일 또는 secret 주입으로 DATABASE_URL을 설정합니다.
pnpm --filter @sammo-ts/infra prisma:migrate:deploy:game
pnpm --filter @sammo-ts/infra prisma:migrate:status:game
20250101000000_init_game_schema가 game schema의 baseline입니다. Baseline과
적용된 migration 파일·checksum은 수정하지 않고 새 timestamp migration을
추가합니다.
빈 DB 검증
전용 임시 PostgreSQL database에 deploy를 두 번 실행합니다. 첫 실행은 전체
chain을 적용하고 두 번째 실행은 No pending migrations to apply여야 합니다.
최소 확인 항목은 다음과 같습니다.
_prisma_migrations의 모든 행이 완료 상태world_state,nation,city,general,message,troopgeneral_turn,nation_turn과 revision·lease fieldinput_event,turn_daemon_leasediplomacy,event,log_entry,error_log- auction, board, vote, yearbook, archive와 inheritance table
nation.chief_general_idcity.tradenullable,city.trustREALauction_bid.metaJSONB NOT NULLtraffic_period,traffic_period_general과 unique keyselect_npc_token,select_npc_token_valid_until_idxgeneral_user_id_key
검증이 끝나면 이름을 직접 확인한 임시 database와 role만 제거합니다. 공유 database나 Compose volume을 삭제하지 않습니다.
NPC selection 중복 owner preflight
20260731000000_add_npc_selection_token은 general.user_id 중복을 발견하면
token table과 unique index를 만들기 전에 실패합니다. 실제 Prisma 실패
metadata와 운영자 정리 뒤 recovery를 전용 tmpfs PostgreSQL에서 검증합니다.
pnpm --filter @sammo-ts/infra verify:migration:npc-selection
검증기는 target 직전 migration 상태에 synthetic 중복 owner를 넣고 다음 순서를 확인합니다.
migrate deploy가 실패합니다. Prisma 7.2 CLI의 최상위 오류는 내부 owner 진단 대신current transaction is aborted로 표시됩니다.- migration transaction의 table/index DDL이 남지 않습니다.
- target
_prisma_migrations에는finished_at,rolled_back_at,logs가 모두 NULL이고applied_steps_count=0인 미완료 행이 하나 남습니다. - 재실행은 이 미완료 이력 때문에 P3009로 차단됩니다.
- 중복을 정리하고 target을
--rolled-back으로 resolve한 뒤 deploy가 성공합니다. - 두 번째 deploy는 no-op이고 migration status가 clean입니다.
검증기는 postgres:18.4-bookworm container의 데이터 경로를 tmpfs로
mount하며 Docker volume을 만들지 않습니다. 임의 포트와 실행 고유 schema를
사용하고 EXIT/HUP/INT/TERM에서 소유 label을 확인한 정확한 container만
제거합니다.
운영 복구에서는 중복 owner를 임의 삭제하지 말고 진단된 계정과 장수를 확인해 주세요. CLI 오류가 일반 transaction 오류만 표시하면 다음 read-only query로 대상을 확인합니다.
SELECT
user_id,
count(*) AS owner_count,
string_agg(id::TEXT, ',' ORDER BY id) AS general_ids
FROM general
WHERE user_id IS NOT NULL
GROUP BY user_id
HAVING count(*) > 1
ORDER BY user_id;
중복 원인을 정리한 뒤 다음처럼 실패한 target만 rolled-back으로 표시하고 deploy를 다시 실행합니다.
pnpm --filter @sammo-ts/infra exec prisma migrate resolve \
--rolled-back 20260731000000_add_npc_selection_token \
--schema prisma/game.prisma
pnpm --filter @sammo-ts/infra prisma:migrate:deploy:game
다른 migration을 resolve하거나 중복을 정리하기 전에 resolve하지 말아 주세요. 이 migration에는 성공 적용을 되돌리는 down migration이 없습니다. 성공 뒤 복구가 필요하면 사전 DB backup을 복원하거나 별도 forward migration을 작성해 주세요.