세션 요약
어제 구축한 가비아 자체서버의 뒷정리와 2단계를 진행했다. 망남 활력사이트 서버형 본편이 https://vitality.sakyowon.co.kr 로 정식 가동됐고(Node.js, 관리자·DB 기능 포함), 테스트 신청 삭제·커널 재부팅·위키 내부링크 404 버그 수정·지미 알림 편지까지 끝냈다. 이사장님이 서버 명령을 한 단계씩 직접 실행하는 방식으로 진행했다.
오늘 한 일
1. 뒷정리 (어제 미완 처리)
- root 비밀번호 재발급: 이사장님이 새 비번 기억이 어긋나 접속 실패 → 가비아 콘솔 서버 상세의 “비밀번호 발급하기” 버튼으로 재발급(서버 자동 재시작 동반). 이 재시작으로 새 커널(5.15.0-190) 적용도 함께 해결. 서비스는 전부 자동 복구됨(systemd enable 덕).
- 테스트 신청 삭제:
sqlite3로APP-260819-192036-434삭제, 신청 테이블 0건 확인. - 지미 편지 (sakyowon-site/JIMMY-DECA.md): DNS 가비아 전환 통보, CF 네임서버 이전(요청⑩) 취소 가능, vitality·bid의
data/app.db스냅샷과 본진 Supabase 문의 DB export 인계 요청, hometown 크론 본부 등록 취소 안내.
2. 위키 내부링크 404 수정 (버그)
- 증상: 위키 문서가
.html붙이면 열리는데 Quartz 내부링크(확장자 없는 주소)로는 404. - 원인: GitHub Pages는
.html을 자동 매핑해 주지만 Caddytry_files에 그 규칙이 없었음. - 수정:
try_files {path} {path}.html {path}/ {path}/index.html(setup-caddy.sh와 Caddyfile 양쪽, sakyowon-site·sakyowon-server 레포 모두 반영, 서버 적용 완료).
3. 정적 배치 확장
deploy-www.sh에 mangnam-vitality(gh-pages, 정적 홍보판) 추가 —sakyowon.co.kr/mangnam-vitality/가 어제부터 404였던 것(서버형이라 제외했었음)을 복구. 어제 핸드오버 위키 반영도 이 재실행으로 완료.
4. vitality 서버형 가동 (2단계 핵심)
setup-apps.sh신규 작성: Node.js 20(nodesource) + build-essential(중요) 설치 → deka2026/mangnam-vitality clone →npm ci+npm run build→ systemdmangnam-vitality(포트 3100, sakyowon 계정) → Caddyfile에 vitality 블록 append + reload.- 1차 실행은
npm ci에서 실패 — better-sqlite3 네이티브 컴파일에 gcc가 없어서. build-essential 추가 후 성공. - 가비아 DNS에
vitalityA레코드(1.201.116.225) 추가 → 인증서 자동 발급 → https://vitality.sakyowon.co.kr 200 확인. - DB는 빈 상태로 시작(
data/빈 폴더). 지미 스냅샷(app.db+uploads) 도착하면 교체하고systemctl restart mangnam-vitality.
최종 상태 (2026-08-20 저녁 검증)
sakyowon.co.kr 허브·마을학교 3교실·위키(내부링크 포함)·활력 홍보판·vitality 서브도메인·신청 API 전부 200.
레슨
- npm ci가 이유 없이 죽으면 build-essential부터: better-sqlite3 같은 네이티브 모듈은 gcc/make가 필요하다. 새 우분투 서버엔 기본으로 없다.
- Caddy 정적 서빙에서 Quartz류 사이트는
{path}.htmltry_files가 필수 — GitHub Pages와 동작을 맞추려면 이 규칙을 넣어야 내부링크가 산다. - 가비아 “비밀번호 발급하기”는 서버를 재시작시킨다 — 비번 분실 복구와 커널 적용을 겸할 수 있다. systemd enable 해 둔 서비스는 전부 자동 복구되므로 안심.
- 스크립트에서
tail -1로 출력을 줄이면 실패 원인이 안 보인다 — 에러 가능성 있는 단계는tail -20정도로. - 진행 안내는 “한 단계 = 한 메시지 = 어디서/무엇을”이 이사장님과 가장 잘 맞았다. 파일명이 비슷한 스크립트(setup-caddy vs setup-apps)는 혼동 주의 — 명령 끝부분을 짚어 드릴 것.
미완료 (다음 세션)
- vitality 실데이터 이관 (지미 대기 → 데카): 지미가 app.db+uploads 스냅샷을 비공개 레포로 주면, 서버
/opt/sakyowon/apps/mangnam-vitality/data/에 넣고systemctl restart mangnam-vitality. - bid-helper → bid.sakyowon.co.kr (데카 준비 + 이사장님 실행): 비공개 레포라 공개 미러 또는 서버용 배포 토큰 전략 필요. G2B 공공데이터 키 신청(이사장님, 공공데이터포털) + 지미 app.db 인계. setup-apps.sh를 bid 지원하도록 확장 예정.
- 본진 → home.sakyowon.co.kr (함께): sakyowon-site 정적을 www-home에 배치(Caddyfile 블록 준비됨), DNS
homeA레코드 추가. AI 활성화 = 사교원 Anthropic 키를/etc/sakyowon-api.env의SAKYOWON_ANTHROPIC_KEY에 넣고systemctl restart sakyowon-api(키 발급은 이사장님). - 크론 2건 (데카 명령 안내): hometown-love 2주 정기갱신을 가비아 crontab으로,
/opt/sakyowon/data/sakyowon.db일일 백업. - 허브 링크 정리 (데카): 허브의 mangnam-vitality 카드가 정적 홍보판(/mangnam-coop 하위)을 가리키는데, 서버형 본편(vitality.sakyowon.co.kr) 링크로 바꿀지 이사장님 확인 후 반영.