2026-10-15 · 운영 반영과 실제 화면 검증 완료
보조 서버의 `app` 컨테이너에는 한국어 보완 플러그인 연결 경로만 남아 있었다. 연결된 호스트 디렉터리가 비어 있어 플러그인을 불러오지 못했다. 데이터베이스에 따로 저장된 번역 530개는 남아 있어 일부 화면만 영어로 보였다. 음성 대화방 입장 안내의 한국어 원문은 전용 저장소에 이미 있었다.
전용 저장소 원본을 `/home/syskiller/discourse-korean-localization`에 복구했다. 게임 프로젝트 경로에 새 파일이나 바로가기를 만들지 않았다. 실행 플러그인 이름과 경로는 `itosm-korean-localization`로 맞췄다. 컨테이너 생성 설정의 연결 경로도 새 원본으로 바꿨다. 현재 컨테이너에는 실행 파일을 복사하고 재시작했다. 새 연결 설정은 다음 컨테이너 재생성 때 사용된다.
관리자 메뉴 검수 중 플러그인 내부 이름까지 번역하면 주소가 잘못 만들어지는 문제를 확인했다. 내부 이름은 유지하고 표시 이름만 번역하도록 고쳤다. 보드 메뉴 두 곳에 번역 키가 그대로 표시되는 문제도 기존 한국어 제목으로 복구했다. 보드 자산을 컴파일하고 서버가 새 파일을 제공하는지 확인했다. 컨테이너 재빌드에는 같은 제목 보완을 적용하는 단계도 추가했다.
| 항목 | 결과 |
|---|---|
| Ruby 문법과 한국어 YAML 11개 | 통과 |
| 활성 플러그인 번역 | 고유 키 6,004개 검사. 누락 0개 |
| 음성 대화 번역 | 561개 검사. 누락 0개 |
| 일반 코어 문구 | 사용자 문구 누락 없음. 문자 치환과 서수 처리 등 기반 기능 8개는 번역 대상에서 구분 |
| 실제 제공 자산 | 일반 화면과 관리자 화면 및 보드 자산의 내용 해시 일치 |
| 배포 실패 검출 | 재시작 전 예전 웹 번역을 제공할 때 검사 실패 확인 |
| PC 화면 | 입장 안내의 제목과 본문 및 확인란과 버튼 한국어 표시 확인 |
| 모바일 화면 | 390×844에서 같은 안내 확인. 가로 넘침 없음 |
| 관리자 화면 | 대시보드와 보드 설정 및 한국어 메뉴 확인. 보드 경로 정상 |
원문과 같은 값 중 제품명과 기술 식별자 및 서식 문자열은 유지했다. 음성 통화에 실제 참여하거나 마이크 권한을 요청하지 않았다. 게임 서버는 변경하거나 재시작하지 않았다. 앞서 추가한 원티드 산스와 기존 글꼴 선택지도 유지했다.
`scripts/verify_deployment.sh`는 원본 파일 해시와 Rails에서의 플러그인 로딩 및 주요 안내 문구와 활성 플러그인의 번역 누락을 확인한다. 이후 실제 웹 서버가 제공하는 번역과 보드 자산을 대조한다. 파일 존재와 HTTP 200만으로 완료 처리하지 않는다.
`scripts/deploy.sh`는 지정된 영구 원본 경로에서만 실행한다. 재시작 전에 번역을 검사하고 대상 포럼 컨테이너만 재시작한다. 보드 원본 구조가 달라졌다면 제목 보완 단계에서 중단한다.
- 일반 백업: `/var/discourse/shared/standalone/backups/forum-korean-20261015-1150`
- DB 덤프: `discourse-before.dump` 21,728,860바이트. 복원 목록 3,527줄 확인.
- 원본: `source-before.tar`, 보드 원본 두 파일과 `boards-generated-before`
- 비밀 설정 백업: `/home/syskiller/.local/share/discourse-backups/forum-korean-20261015-1150/app.yml` · 권한 600
- DB 구조 변경과 데이터 이전 없음. 일반 글과 계정 및 설정을 변경하지 않음.
문제 발생 시 변경 전 `app.yml`을 복원하고 새 플러그인 디렉터리를 로딩 대상에서 빼면 변경 전 상태로 돌아간다. 보드 원본과 생성 자산은 위 백업으로 복원한다. 이 절차는 번역이 빠진 이전 상태로 돌아가는 장애 대응용이다. DB 덤프는 별도 복원 시험을 하지 않았다.
검증 범위는 현재 활성 번역과 확인한 화면이다. 비활성 플러그인을 새로 켜거나 제품을 업데이트할 때는 번역 검사를 다시 실행한다.