GNX Courage Text™ / hoKssi.com · Runbooks
배포·백업·복구·장애대응
1. 기본 점검
운영자는 SSH 접속 후 hokssicheck 또는 hokssiready를 실행한다. 정상 기준은 docker stack Up, /health ok, root 200, nginx syntax ok, outbound queued_not_sent, attempts 0, sent_at null, worker outbound_dispatch_blocked다.
bash cd /opt/hokssi hokssicheck
2. 배포 절차
- 변경 전 DB 백업 실행
- 변경 대상 파일 백업
- host source syntax check
- docker compose build api worker
- docker compose up -d api worker
- health wait loop
- hokssicheck
- 기능 smoke test
bash /usr/local/bin/hokssi-db-backup.sh docker run --rm -v /opt/hokssi/api:/app -w /app node:20-alpine node --check src/server.js docker run --rm -v /opt/hokssi/api:/app -w /app node:20-alpine node --check src/public.js docker compose -f /opt/hokssi/docker-compose.yml --project-directory /opt/hokssi build api worker docker compose -f /opt/hokssi/docker-compose.yml --project-directory /opt/hokssi up -d api worker hokssicheck
3. 백업
DB 백업은 /opt/hokssi/backups 아래 custom dump로 저장한다. Release snapshot은 secret 파일을 제외하고 /opt/hokssi/backups/release에 저장한다.
bash /usr/local/bin/hokssi-db-backup.sh sudo tar -czf /opt/hokssi/backups/release/hokssi_release_$(date +%Y%m%d_%H%M%S).tar.gz -C /opt --exclude='hokssi/backups' --exclude='hokssi/.env' --exclude='hokssi/.env.*' hokssi
4. 복구
API 502는 먼저 docker ps와 api logs를 확인한다. SyntaxError인 경우 host source를 고치고 반드시 host-mounted node --check를 실행한다. stale image check는 금지한다.
bash docker compose -f /opt/hokssi/docker-compose.yml --project-directory /opt/hokssi ps docker logs --tail=120 hokssi-api curl -i https://hokssi.com/health | sed -n '1,40p'
5. Nginx
Nginx는 80/443을 받고 /docs/는 /var/www/hokssi-docs/docs에서 제공한다. 443 block은 listen 443 ssl, http2 on 구문을 사용한다. Admin/system paths는 allowlist로 보호된다.
bash sudo nginx -t sudo systemctl reload nginx sudo tail -30 /var/log/nginx/hokssi.error.log
6. 현장 AirDrop V1
요청자는 hoKssi?! Card Create를 눌러 card ready 상태를 만든다. Safari 공유 버튼을 눌러 AirDrop을 선택하고 관심 대상 기기를 직접 선택한다. 수신자 iPhone은 /c/<hidden_code> 확인 화면을 열어야 하며 hokssi.com root가 열리면 실패다.
수신자가 1 또는 2를 선택하면 iPhone Messages가 requester phone + body digit으로 열려야 한다. 실제 전송은 수신자가 직접 수행한다.
7. 장애 대응
| Symptom | First Check | Action |
|---|---|---|
| 502 /health | api logs | JS syntax/source rebuild |
| root UI 깨짐 | root-ui backup | restore latest root backup |
| AirDrop opens root | share.url | ensure /c/<code> in handoff-card |
| SMS app no phone | requester_contact_secret | consent + phone ciphertext 확인 |
| provider sent unexpectedly | env safety | set false/device_handoff/unconfigured |
| worker silent | docker logs | restart worker and check gate |