관리자 통계 대시보드 개선 및 v1.9.6 반영
통계 추이 차트 공통화, 유입 스택 막대, 집계 시작일 고정, traffic API 오류 수정, deploy 문서 정리를 포함한다. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
462
docs/deploy.md
462
docs/deploy.md
@@ -1,6 +1,6 @@
|
||||
# 배포 가이드
|
||||
|
||||
> 로컬 기준 v1.8.7에서 `npm run verify` 검증을 통과했다. NAS 실제 컨테이너 기동과 도메인/프록시 접속 검증은 운영 배포 단계에서 진행한다.
|
||||
> 로컬 기준 v1.9.4에서 `npm run verify` 검증을 통과했다. NAS 실제 컨테이너 기동과 도메인/프록시 접속 검증은 운영 배포 단계에서 진행한다.
|
||||
|
||||
## 빌드 유형
|
||||
|
||||
@@ -16,298 +16,6 @@
|
||||
|
||||
## 로컬 개발
|
||||
|
||||
### v1.8.7 참고
|
||||
|
||||
- DB 마이그레이션 `058_tag_header_cover.sql`이 추가되었다.
|
||||
- 배포 전 운영 DB에 `npm run db:migrate:prod`를 실행한다.
|
||||
- 관리자 태그 생성·수정 화면에서 태그 헤더 이미지를 업로드하고 저장한 뒤 `/tag/:slug`에서 기본 제목/설명 대신 이미지가 표시되는지 확인한다.
|
||||
- 오버레이 제목·본문을 비워두면 태그 헤더 이미지 단독으로 표시되는지 확인한다.
|
||||
|
||||
### v1.8.6 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- `/tag/xenoblade3-hero`처럼 일반 태그 상세 URL에 접속했을 때 헤더에 등록된 태그명과 설명이 표시되는지 확인한다.
|
||||
- 홈·게시물 목록·게시물 상세 태그 배지에서 일반 태그도 등록된 이름과 색상을 사용하는지 확인한다.
|
||||
|
||||
### v1.8.5 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 요약이 비어 있는 게시물 본문 첫머리에 인라인 색상 문법이나 HTML 태그가 있어도 공개 목록 설명에는 일반 텍스트만 표시되는지 확인한다.
|
||||
|
||||
### v1.8.4 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 글쓰기에서 새 태그 `Xenoblade 3`를 입력해 Enter를 누르면 배지에 입력한 대소문자와 공백이 유지되는지 확인한다.
|
||||
- 새 태그 `Xenoblade3/Hero`를 저장하면 태그명은 그대로 유지되고 슬러그는 `xenoblade3-hero`로 저장되는지 확인한다.
|
||||
|
||||
### v1.8.3 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 코드 블록 설정 패널에서 줄번호 표시를 켜면 선언 줄에 `line-numbers`가 저장되고 공개 본문에서 줄번호가 표시되는지 확인한다.
|
||||
- 기존 `linenos`, `nolinenos`, `no-line-numbers` 선언 줄도 공개 본문에서 기존 의미대로 해석되는지 확인한다.
|
||||
|
||||
### v1.8.2 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 글쓰기에서 `/code` 또는 ``` Enter로 새 코드 블록을 만들 때 줄번호가 기본으로 꺼져 있는지 확인한다.
|
||||
|
||||
### v1.8.1 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 글쓰기에서 `/html`은 `:::html`, `/link`는 `:::link`, `/iframe`은 `:::iframe` 블록을 삽입하는지 확인한다.
|
||||
- 표 HTML은 `:::html` 블록에 넣고, iframe 코드는 `:::iframe` 블록에 넣는다.
|
||||
- 기존에 HTML 기능으로 작성한 단독 URL은 `:::link` 블록으로, iframe HTML은 `:::iframe` 블록으로 수동 정리한다.
|
||||
- `:::html` 블록에 붙여넣은 표의 `rowspan`, `colspan`, 셀 폭·정렬이 공개 본문에서 유지되는지 확인한다.
|
||||
|
||||
### v1.8.0 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 수정 라이브 모드에서 긴 본문을 위·아래 방향키로 계속 이동할 때 편집 스크롤이 커서를 따라가고 현재 커서가 화면 안에 유지되는지 확인한다.
|
||||
|
||||
### v1.7.9 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 대표 이미지 미디어 라이브러리에 원본 이미지만 보이고 `thumbs/*-card.webp` 파생 파일이 숨겨지는지 확인한다.
|
||||
- 본문 `/이미지`·`/갤러리` 미디어 라이브러리에서도 카드 썸네일이 숨겨지는지 확인한다.
|
||||
- 카드 썸네일 URL을 대표 이미지로 직접 저장하려는 요청이 거부되는지 확인한다.
|
||||
|
||||
### v1.7.8 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 글쓰기에서 `/이미지`·`/갤러리` 모달이 업로드 탭으로 열리고, 업로드 완료 파일이 라이브러리에서 자동 선택되는지 확인한다.
|
||||
- 공개 게시글 수정 아이콘이 비로그인·관리자 세션만 있는 상태에서는 숨겨지고, 로그인 회원 본인의 글에서만 표시되는지 확인한다.
|
||||
- 주소·HTML 임베드 블록이 위 문단과 과도하게 벌어지지 않고 하단 여백만 유지되는지 확인한다.
|
||||
|
||||
### v1.7.7 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- `/api/homepage-widget`의 `visitorsLast30Days`, `visitorsLast180Days`, `visitorsLast365Days`가 숫자로 반환되는지 확인한다.
|
||||
- Homepage 개인용 설정은 `refreshInterval: 300000`(5분)을 권장한다.
|
||||
|
||||
### v1.7.6 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 배포 후 `/api/homepage-widget`에서 당일·누적 방문, 페이지뷰, 공개 콘텐츠 수가 반환되는지 확인한다.
|
||||
- Homepage 설정 예시는 `docs/homepage-widget.md`를 사용한다.
|
||||
- Homepage가 Docker에서 실행되면 `localhost:43080` 대신 공개 도메인, NAS 내부 IP 또는 같은 Docker 네트워크의 `http://sori-studio:3000`을 사용한다.
|
||||
|
||||
### v1.6.2 참고
|
||||
|
||||
- DB 마이그레이션 `057_navigation_recommended_favicon_cache.sql` 적용이 필요하다.
|
||||
- 관리자 메뉴 > 추천 사이트 탭에서 적용 아이콘 미리보기 열과 파비콘 새로고침 버튼이 보이는지 확인한다.
|
||||
- 추천 사이트 저장 후 캐시가 없는 외부 URL 항목이 `/uploads/system/recommended-favicon-*.png`로 생성되는지 확인한다.
|
||||
- 공개 홈 Recommended 카드가 서버 캐시 파비콘을 우선 표시하는지 확인한다.
|
||||
- 운영 수동 일괄 갱신: `npm run navigation:refresh-recommended-favicons`
|
||||
|
||||
### v1.6.0 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 미디어 카드 썸네일 탭에서 사용 중인 썸네일 카드 오른쪽 위에 사용 개수 숫자 배지가 표시되는지 확인한다.
|
||||
- 관리자 미디어 프로필 이미지 탭에서 회원 프로필에 연결된 이미지 오른쪽 위에 사용 개수 숫자 배지가 표시되는지 확인한다.
|
||||
- 미사용 필터 상태에서 비슷한 이미지 중 사용 개수 배지가 없는 항목만 남는지 확인한다.
|
||||
|
||||
### v1.5.109 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 공개 메인 화면에서 추천 사이트 Recommended 목록이 왼쪽 사이드바의 Categories 아래에 표시되는지 확인한다.
|
||||
- 공개 일반 화면의 오른쪽 사이드바에서 Recommended 영역이 사라지고 오른쪽 사이드 광고 슬롯이 바로 이어지는지 확인한다.
|
||||
|
||||
### v1.5.108 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 미디어 미디어 라이브러리·카드 썸네일·프로필 이미지 탭에서 전체/미사용 배지형 필터가 모두 표시되는지 확인한다.
|
||||
- 카드 썸네일·프로필 이미지 탭에서 미사용 필터를 누른 뒤 전체 선택·선택 삭제가 가능한지 확인한다.
|
||||
- 게시물 글쓰기 라이브 모드에서 이미지와 갤러리 이미지 hover 시 삭제 버튼만 보이고, 이미지 설정은 해당 블록 포커스 시 오른쪽 패널에서 열리는지 확인한다.
|
||||
|
||||
### v1.5.107 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 글쓰기에서 줄 중간 텍스트를 선택해 굵게·색상 등 인라인 변경 후 `Cmd/Ctrl+Z`를 눌렀을 때 커서가 줄 앞으로 이동하지 않고 변경 위치 근처에 복원되는지 확인한다.
|
||||
- 관리자 미디어 카드 썸네일 탭에서 미사용 필터를 켠 뒤 전체 선택·선택 삭제가 가능한지 확인한다.
|
||||
- 카드 썸네일 탭의 썸네일 카드에 `카드` 배지가 반복 표시되지 않는지 확인한다.
|
||||
- 일본어 파일명 이미지를 업로드했을 때 `image.jpg` fallback이 아니라 원본 일본어 파일명 기반 URL로 저장되는지 확인한다.
|
||||
|
||||
### v1.5.106 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 글쓰기 소스 모드에서 텍스트 중간 범위를 선택하고 색상 적용 후 화면 스크롤이 유지되는지 확인한다.
|
||||
- `/html` 또는 `/iframe` 슬래시 명령으로 HTML 블록을 찾을 수 있는지 확인한다.
|
||||
- `<iframe src="https://..."></iframe>` 코드가 공개 본문과 라이브 모드에서 iframe으로 렌더링되는지 확인한다.
|
||||
|
||||
### v1.5.105 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 글쓰기에서 일반 텍스트를 선택하면 오른쪽 텍스트 색상 패널이 열리는지 확인한다.
|
||||
- 색상 선택 후 공개 본문과 라이브 모드에서 `::red[텍스트]`, `::red[**굵은 텍스트**]` 등 인라인 색상과 기존 인라인 마크다운 조합이 표시되는지 확인한다.
|
||||
|
||||
### v1.5.104 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 목차에서 2줄 이상 제목의 활성 표시선이 항목 높이에 맞춰 표시되는지 확인한다.
|
||||
|
||||
### v1.5.103 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 목차 활성 항목의 왼쪽 브랜드 컬러 막대가 실제 화면에서 표시되는지 확인한다.
|
||||
|
||||
### v1.5.102 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 목차 항목이 24px 높이에서 세로 중앙 정렬되는지 확인한다.
|
||||
- 활성 목차 항목의 왼쪽 표시선이 브랜드 컬러로 정상 표시되는지 확인한다.
|
||||
|
||||
### v1.5.101 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 목차 활성 항목이 바뀌어도 항목 텍스트 시작점이 좌우로 흔들리지 않는지 확인한다.
|
||||
|
||||
### v1.5.100 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 목차에서 각 항목 왼쪽 라인이 이어져 보이고, 활성 항목 라인이 브랜드 컬러와 더 두꺼운 보더로 표시되는지 확인한다.
|
||||
|
||||
### v1.5.99 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 오른쪽 사이드바 목차 라벨이 `목차`로 표시되는지 확인한다.
|
||||
- 활성 목차 항목의 텍스트와 왼쪽 표시선에 브랜드 컬러가 적용되는지 확인한다.
|
||||
|
||||
### v1.5.98 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 오른쪽 사이드바에서 긴 TOC가 별도 내부 스크롤 없이 전체 목록으로 펼쳐지는지 확인한다.
|
||||
- 게시물 사이드 광고가 긴 TOC 아래에 이어서 표시되는지 확인한다.
|
||||
- 본문 스크롤 중 활성 TOC 항목이 오른쪽 사이드바 전체 스크롤 기준으로 따라오는지 확인한다.
|
||||
|
||||
### v1.5.97 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 데스크톱 오른쪽 사이드바에서 블로그 소개·Follow가 숨겨지고 TOC가 최상단에 표시되는지 확인한다.
|
||||
- 게시물 사이드 광고 코드가 있으면 왼쪽 사이드바가 아니라 오른쪽 TOC 아래에 표시되는지 확인한다.
|
||||
- 긴 목차에서 세로 기준선과 활성 항목 표시선이 정상 표시되는지 확인한다.
|
||||
|
||||
### v1.5.93 참고
|
||||
|
||||
- DB 마이그레이션 `056_site_settings_post_tag_limit.sql` 적용이 필요하다.
|
||||
- 관리자 사이트 설정의 POST 설정에서 태그 최대 개수를 1~10개 사이로 저장할 수 있는지 확인한다.
|
||||
- 게시물 작성에서 설정된 개수 이상 태그를 추가할 수 없고, 저장 API도 초과 태그를 거부하는지 확인한다.
|
||||
- 게시물 작성 본문에서 `/표` 또는 `/table`로 기본 표가 삽입되고 공개/미리보기 본문에서 표로 렌더링되는지 확인한다.
|
||||
|
||||
### v1.5.92 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 새 태그 저장 후 `/admin/tags` 목록으로 이동하고 저장 완료 토스트가 표시되는지 확인한다.
|
||||
- 태그 수정 화면에서 변경 전에는 `변경 저장` 버튼이 비활성화되고, 변경·저장 후 다시 비활성화되는지 확인한다.
|
||||
- 게시물 작성에서 `/이미지` 미디어 모달 업로드 후 본문에 자동 삽입되지 않고 라이브러리 목록에서 직접 선택해 삽입할 수 있는지 확인한다.
|
||||
- 미디어 모달 업로드 중 닫기·추가 업로드가 막히는지 확인한다.
|
||||
|
||||
### v1.5.91 참고
|
||||
|
||||
- DB 마이그레이션 `055_add_post_tag_sort_order.sql` 적용이 필요하다.
|
||||
- 게시물 작성 본문에서 `/이미지`로 미디어 선택 모달을 열었을 때 `thumbs/*-card.webp` 카드 썸네일이 보이지 않는지 확인한다.
|
||||
- 미디어 모달 업로드 탭에 파일을 드롭한 뒤 업로드 중 표시가 나오고 추가 드롭·파일 선택이 막히는지 확인한다.
|
||||
- 태그를 여러 개 가진 공개 게시물 목록에서 첫 번째 태그가 고정 표시되고, 관리자 게시물 목록에서는 모든 태그가 표시되는지 확인한다.
|
||||
|
||||
### v1.5.90 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 작성 라이브 모드에서 코드 블록 아래 일반 문단으로 커서를 이동하면 오른쪽 코드 블록 설정 패널이 닫히는지 확인한다.
|
||||
- 문서 마지막 코드 블록 본문 끝에서 아래 방향키를 눌렀을 때 코드 블록 밖 일반 문단이 생성되고 커서가 이동하는지 확인한다.
|
||||
|
||||
### v1.5.89 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 작성 소스 모드에서 코드 블록 본문에 `/volume1/...` 같은 경로를 입력해도 슬래시 명령 메뉴가 열리지 않는지 확인한다.
|
||||
- 소스·라이브 모드에서 줄 삭제나 블록 변환 후 `Cmd/Ctrl+Z`로 되돌리고 `Cmd/Ctrl+Shift+Z`로 다시 실행되는지 확인한다.
|
||||
|
||||
### v1.5.88 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 작성 라이브 모드에서 문서 마지막 인용문 끝에 커서를 두고 아래 방향키를 누르면 인용 밖 일반 문단이 생성되고 커서가 이동하는지 확인한다.
|
||||
|
||||
### v1.5.87 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 작성 라이브 모드에서 코드 블록에 커서를 두면 코드 설정 패널이 열리고, 일반 문단으로 커서를 옮기면 패널이 닫히는지 확인한다.
|
||||
|
||||
### v1.5.86 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 다크 모드 게시물 본문에서 기본 인용문 텍스트가 밝은 사이트 텍스트 색상으로 표시되는지 확인한다.
|
||||
|
||||
### v1.5.85 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 상세 HTML `<title>`이 `게시물 제목`만 출력하는지 확인한다. 구글 검색 결과 반영은 재크롤링 이후 시간이 걸릴 수 있다.
|
||||
|
||||
### v1.5.84 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 모바일 회원가입 2단계에서 이메일 인증번호 입력창이 다른 입력창과 같은 높이로 표시되는지 확인한다.
|
||||
|
||||
### v1.5.83 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 공개 오른쪽 사이드바에서 사이트 로고가 48px 정사각형으로 유지되는지 확인한다.
|
||||
|
||||
### v1.5.82 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 배포 후 `/sitemap.xml`이 `application/xml`로 응답하고 공개 발행글·고정 페이지·태그 URL을 포함하는지 확인한다.
|
||||
- `noindex` 글, 멤버십·비공개·초안·예약 대기 글이 `/sitemap.xml`에 포함되지 않는지 확인한다.
|
||||
- `/robots.txt`가 `Sitemap: https://.../sitemap.xml` 절대 URL을 포함하는지 확인한다.
|
||||
- Google Search Console에는 `https://도메인/sitemap.xml`을 제출한다. 이후 새 게시물 발행 시 sitemap 파일을 수동 갱신할 필요는 없다.
|
||||
|
||||
### v1.5.81 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 작성·수정 오른쪽 사이드에 `대표 이미지 표시` 토글이 항상 보이는지 확인한다.
|
||||
- 대표 이미지가 없어도 해당 토글을 켜고 저장할 수 있으며, 이후 대표 이미지를 추가하면 상세 제목 아래 표시 설정이 유지되는지 확인한다.
|
||||
|
||||
### v1.5.80 참고
|
||||
|
||||
- DB 마이그레이션 `054_add_post_show_featured_image.sql` 적용 필요.
|
||||
- 새 게시물 본문 이미지를 업로드해도 `/public/uploads/posts/YYYY/MM/thumbs/*-card.webp`가 바로 생성되지 않는지 확인한다.
|
||||
- 게시물 대표 이미지를 설정하고 저장하면 해당 원본의 카드 썸네일이 생성되는지 확인한다.
|
||||
- 대표 이미지 원본에 카드 썸네일이 없으면 관리자 미디어 상세에서 `카드 썸네일 생성` 버튼으로 다시 만들 수 있는지 확인한다.
|
||||
- 게시물 상세 제목 아래 대표 이미지는 글쓰기 화면의 `본문 상단 대표 이미지` 옵션이 켜진 글에서만 표시되는지 확인한다.
|
||||
- 운영 기존 업로드 중 대표 이미지 fallback 상태가 보이면 `npm run images:backfill-post-thumbnails`를 실행한다. 이 명령은 게시물 대표 이미지 URL만 대상으로 한다.
|
||||
|
||||
### v1.5.79 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 미디어 화면에서 일반 미디어 라이브러리에 `thumbs/*-card.webp` 파일이 섞이지 않고, 카드 썸네일 탭에만 표시되는지 확인한다.
|
||||
- 대표 이미지로 사용 중인 원본에 카드 썸네일이 있으면 카드 썸네일 탭에서 사용 중으로 표시되고 삭제가 차단되는지 확인한다.
|
||||
- 대표 이미지로 사용 중인 원본에 카드 썸네일이 없으면 원본 항목에 `원본` 배지와 fallback 상태가 표시되는지 확인한다.
|
||||
- 운영 기존 업로드 중 fallback 상태가 보이면 `npm run images:backfill-post-thumbnails`를 실행한다.
|
||||
|
||||
### v1.5.78 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 새 게시물 이미지 업로드 시 `/public/uploads/posts/YYYY/MM/thumbs/*-card.webp` 카드 썸네일이 함께 생성되는지 확인한다.
|
||||
- 기존 업로드 이미지가 많은 운영 환경에서는 배포 후 `npm run images:backfill-post-thumbnails`를 한 번 실행해 누락된 카드 썸네일을 생성한다.
|
||||
- 메인 Featured·Latest, 게시물 목록, 태그 목록에서 생성된 썸네일 URL을 우선 요청하고, 썸네일이 없는 외부/기존 이미지는 원본으로 대체되는지 확인한다.
|
||||
|
||||
### v1.5.77 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 메인 화면 Latest compact/list 목록에서 긴 요약이 최대 2줄로 표시되고 발행일·댓글 메타가 잘리지 않는지 확인한다.
|
||||
- 모바일 메인 화면 Latest compact 목록에서 썸네일이 80px 정사각형으로 표시되고, `sm` 이상에서는 기존 비율형 썸네일이 유지되는지 확인한다.
|
||||
- 대표 이미지 없는 placeholder 썸네일의 긴 제목이 모바일에서 썸네일 밖으로 넘치지 않는지 확인한다.
|
||||
|
||||
### v1.5.75 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 게시물 작성·수정 화면 오른쪽 설정 패널 하단에 본문 통계가 표시되는지 확인한다.
|
||||
- 본문 입력 시 단어 수, 공백 제외 문자 수, 공백 수, 읽기 시간, 블록 수, 이미지 수가 갱신되는지 확인한다.
|
||||
|
||||
### v1.5.74 참고
|
||||
|
||||
- DB 마이그레이션 `053_site_settings_post_sidebar_ad.sql` 적용 필요.
|
||||
- 사이트 설정 Ads에서 게시물 사이드 광고 코드를 저장한 뒤 게시물 상세 데스크톱 오른쪽 사이드바 TOC 아래에 표시되는지 확인한다.
|
||||
- 게시물 상세 오른쪽 사이드바에서는 일반 오른쪽 사이드 광고가 아니라 게시물 사이드 광고가 표시되는지 확인한다.
|
||||
- 긴 게시물에서 인아티클 광고가 본문 길이에 따라 0~2회로 제한되는지 확인한다.
|
||||
|
||||
### 필수 조건
|
||||
|
||||
- Node.js 22 LTS 권장
|
||||
@@ -337,28 +45,6 @@ openssl rand -hex 32
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### v1.5.55 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 소스 모드 textarea에서 `Cmd+Shift+K`로 현재 줄이 삭제되는지 확인한다.
|
||||
- 소스 모드 textarea에서 여러 줄 선택 후 `Cmd+Shift+K`로 선택 범위 줄들이 삭제되는지 확인한다.
|
||||
- 라이브 모드에서 preview 루트 또는 카드형 블록에 포커스된 상태에서도 `Cmd+Shift+K`로 현재 줄 또는 블록이 삭제되는지 확인한다.
|
||||
|
||||
### v1.5.54 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- `/콜아웃` 삽입 시 기본 선언부가 `emoji=none`으로 들어가고 아이콘이 표시되지 않는지 확인한다.
|
||||
- 오른쪽 블록 설정 패널에서 콜아웃 제목을 입력하면 선언부 `title` 옵션과 라이브·공개 렌더링에 반영되는지 확인한다.
|
||||
- 콜아웃 아이콘 또는 제목이 있을 때 헤더가 왼쪽 상단에 표시되고 본문은 아래 줄에서 시작하는지 확인한다.
|
||||
|
||||
### v1.5.53 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 라이브 콜아웃 본문 5줄 이상에서 `Shift+방향키` 범위 선택이 여러 줄에 걸쳐 유지되는지 확인한다.
|
||||
- 라이브 콜아웃 선택 범위를 삭제하거나 붙여넣을 때 콜아웃 본문 줄만 갱신되는지 확인한다.
|
||||
- 콜아웃 아이콘 사용 시 라이브·사용자 화면 모두 왼쪽 상단에 아이콘이 붙는지 확인한다.
|
||||
- 콜아웃 아이콘 미사용 시 라이브 편집 화면과 사용자 화면 모두 아이콘 자리 표시자가 남지 않는지 확인한다.
|
||||
|
||||
### 로컬 개발 DB
|
||||
|
||||
로컬 개발 DB는 Docker Compose의 `sori-studio-db` 서비스만 실행한다.
|
||||
@@ -382,111 +68,6 @@ docker exec sori-studio-db pg_isready -U sori_studio -d sori_studio
|
||||
docker exec sori-studio-db psql -U sori_studio -d sori_studio -c 'SELECT count(*) AS posts_count FROM posts;'
|
||||
```
|
||||
|
||||
### v1.5.52 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 연속 콜아웃을 만들고 위 콜아웃에서 한글 입력 후 Enter 시 아래 콜아웃 선언 줄이 유지되는지 확인한다.
|
||||
- 라이브 콜아웃 안에서 한글 입력 후 Enter 시 본문 줄이 1줄만 추가되는지 확인한다.
|
||||
- 갤러리·토글·임베드 등 다른 `:::` fenced 블록 편집 시 다음 블록 첫 줄이 교체 범위에 포함되지 않는지 확인한다.
|
||||
|
||||
### v1.5.51 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 라이브 인용 안에서 한글 입력 후 Enter 시 인용 줄이 1줄만 추가되는지 확인한다.
|
||||
- 라이브 콜아웃 안에서 한글 입력 후 Enter 시 콜아웃 본문 줄이 1줄만 추가되는지 확인한다.
|
||||
- 라이브 콜아웃 마지막 줄에서 아래 방향키 입력 시 새 본문 줄이 생성되지 않는지 확인한다.
|
||||
- 라이브 인용 마지막 줄에서 아래 방향키 입력 시 외부 빈 문단이 생성되고 커서가 이동하는지 확인한다.
|
||||
|
||||
### v1.5.50 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 라이브 모드에서 한글 `> 텍스트` 입력 후 Enter 시 다음 인용 줄이 생성되고 커서가 내부에 있는지 확인한다.
|
||||
- 라이브 인용 마지막 줄에서 아래 방향키 입력 시 외부 빈 문단이 생성되고 커서가 이동하는지 확인한다.
|
||||
- 라이브 콜아웃 본문 여러 줄에서 2번째·3번째 줄 `Cmd+Shift+K`가 해당 줄만 삭제하는지 확인한다.
|
||||
- 라이브 콜아웃에서 한글 입력 후 Enter 시 본문 줄이 1줄만 추가되는지 확인한다.
|
||||
- `/콜아웃` Enter 생성 후 콜아웃 본문에 마지막 한글 조합 글자가 남지 않는지 확인한다.
|
||||
|
||||
### v1.5.49 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 글쓰기 라이브 모드에서 코드·콜아웃·토글 내부 커서 위치별 `Cmd+Shift+K` 줄 삭제를 확인한다.
|
||||
- 코드·콜아웃·토글 본문 마지막 1줄에서 `Cmd+Shift+K` 입력 시 블록 전체가 삭제되는지 확인한다.
|
||||
- 라이브 콜아웃 마지막 줄에서 아래 방향키로 다음 블록으로 빠져나가는지 확인한다.
|
||||
- `/콜아웃` Enter 생성 후 콜아웃 본문에 마지막 조합 글자가 남지 않는지 확인한다.
|
||||
|
||||
### v1.5.48 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 게시물 작성 상단 왼쪽 상태 표시가 텍스트만 표시하고, 외부 이동 아이콘이나 링크 동작이 없는지 확인한다.
|
||||
- 공개 게시물 이동은 오른쪽 설정 패널의 `View Post` 링크에서 확인한다.
|
||||
|
||||
### v1.5.47 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 대표 이미지가 있는 공개 게시물이 RSS item에 `media:thumbnail`과 `media:content`를 포함하는지 확인한다.
|
||||
- 상대 이미지 URL이 RSS에서 절대 URL로 변환되는지 확인한다.
|
||||
|
||||
### v1.5.46 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 글쓰기 라이브 모드에서 위에서 아래 방향키로 콜아웃·인용 블록에 진입되는지 확인한다.
|
||||
- 콜아웃·인용 배경 프리셋에 분홍이 보이지 않고 같은 6색 팔레트를 쓰는지 확인한다.
|
||||
- 작은 화면에서 게시물 설정 패널을 열어도 본문 폭이 압축되지 않는지 확인한다.
|
||||
|
||||
### v1.5.45 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 글쓰기에서 라이브 모드 콜아웃·인용 블록 포커스 시 오른쪽 블록 설정 패널이 열리는지 확인한다.
|
||||
- 인용 블록 기본 배경이 회색이고 분홍 옵션이 노출되지 않는지 확인한다.
|
||||
|
||||
### v1.5.44 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 사이트 설정의 블로그 제목·설명, 사이트 정보, 사이트 코드 읽기 화면만 레이아웃 변경되었다.
|
||||
|
||||
### v1.5.43 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 배포 후 `/rss.xml`, `/feed.xml`, `/rss`가 `application/rss+xml`로 응답하고 최근 공개 발행글을 포함하는지 확인한다.
|
||||
- 관리자 SNS 정보에서 RSS 프리셋을 사용할 경우 주소는 `/rss.xml`을 권장한다.
|
||||
|
||||
### v1.5.42 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 공개 오른쪽 사이드바 FOLLOW 영역의 직접 SVG 아이콘 정렬만 수정한다.
|
||||
|
||||
### v1.5.41 마이그레이션
|
||||
|
||||
- `049_fix_social_links_jsonb_string.sql`: 기존에 JSONB 문자열로 잘못 저장된 `site_settings.social_links` 값을 JSONB 배열로 복구한다.
|
||||
- 적용 후 관리자 사이트 설정의 SNS 정보 저장값이 읽기 모드에서 유지되는지 확인한다.
|
||||
|
||||
### v1.5.40 참고
|
||||
|
||||
- 추가 DB 마이그레이션은 없다.
|
||||
- 관리자 사이트 설정의 SNS 정보에서 프리셋이 없는 서비스는 `직접 SVG`를 선택해 SVG 아이콘과 주소를 함께 저장한다.
|
||||
- `https://`를 생략한 SNS 주소는 저장 시 자동 보정된다.
|
||||
|
||||
### v1.5.39 마이그레이션
|
||||
|
||||
- `048_site_settings_social_links.sql`: `site_settings`에 `social_links` JSONB 컬럼을 추가한다.
|
||||
- 적용 후 관리자 사이트 설정의 SNS 정보와 공개 오른쪽 사이드바 FOLLOW 노출이 정상 동작하는지 확인한다.
|
||||
|
||||
### v1.5.38 마이그레이션
|
||||
|
||||
- `047_site_settings_announcement_alignment.sql`: `site_settings`에 `announcement_alignment` 컬럼을 추가한다.
|
||||
- 적용 후 관리자 사이트 설정의 어나운스 바 정렬(중앙/왼쪽)이 공개 화면에 반영되는지 확인한다.
|
||||
|
||||
### v1.5.35 마이그레이션
|
||||
|
||||
- `045_analytics_traffic_sources.sql`: 방문자 유입원·디바이스·검색 키워드 일별 축약 집계 테이블과 중복 방문 제거용 컬럼을 추가한다.
|
||||
- 적용 이후부터 수집되는 페이지뷰에 대해서만 유입 정보가 쌓인다. 과거 방문 데이터는 소급 집계하지 않는다.
|
||||
- 검색 키워드는 검색엔진이 referrer query를 전달한 경우에만 표시된다.
|
||||
|
||||
### v1.5.34 마이그레이션
|
||||
|
||||
- `044_site_settings_custom_code.sql`: `site_settings`에 `ads_txt`, `custom_head_code`, `custom_footer_code` 컬럼을 추가한다.
|
||||
- 배포 후 `/ads.txt`와 공개 페이지 HTML head/body 하단 코드 삽입이 정상 동작하는지 확인한다.
|
||||
|
||||
### 확인 주소
|
||||
|
||||
- 개발 서버: http://127.0.0.1:43080
|
||||
@@ -508,13 +89,8 @@ docker exec sori-studio-db psql -U sori_studio -d sori_studio -c 'SELECT count(*
|
||||
터미널에서 바로 확인할 때는 컨테이너 내부 `psql`을 사용한다.
|
||||
|
||||
```bash
|
||||
# DB 준비 상태 확인
|
||||
docker exec sori-studio-db pg_isready -U sori_studio -d sori_studio
|
||||
|
||||
# 게시물 개수 확인
|
||||
docker exec sori-studio-db psql -U sori_studio -d sori_studio -c 'SELECT count(*) AS posts_count FROM posts;'
|
||||
|
||||
# psql 콘솔 접속
|
||||
docker exec -it sori-studio-db psql -U sori_studio -d sori_studio
|
||||
```
|
||||
|
||||
@@ -623,6 +199,13 @@ docker compose --env-file .env.production up -d --build
|
||||
- Docker 내부 네트워크 기본값: `10.250.50.0/24`
|
||||
- HTTPS: 3001 (SSL 설정 시)
|
||||
|
||||
### 배포 후 확인
|
||||
|
||||
- `docker ps`에서 `sori-studio`, `sori-studio-db`가 `Up` 상태인지 확인한다.
|
||||
- 공개 사이트와 `/admin` 로그인이 정상 동작하는지 확인한다.
|
||||
- 스키마 변경 배포였다면 `sh scripts/migrate-production-db.sh status`로 미적용 마이그레이션이 없는지 확인한다.
|
||||
- `/sitemap.xml`, `/robots.txt`, `/rss.xml`이 정상 응답하는지 확인한다. Google Search Console에는 `https://도메인/sitemap.xml`을 제출한다.
|
||||
|
||||
---
|
||||
|
||||
## 데이터베이스
|
||||
@@ -640,6 +223,13 @@ docker compose --env-file .env.production up -d --build
|
||||
- 운영 환경에서 `DATABASE_URL`이 없으면 샘플 콘텐츠로 대체하지 않고 서버 오류로 실패
|
||||
- Docker 운영 컨테이너는 `.env.production`의 서버 환경 변수를 런타임 `process.env`에서 우선 읽는다.
|
||||
|
||||
### 마이그레이션
|
||||
|
||||
- 스키마 변경은 `db/migrations/`의 SQL 파일로 관리한다. 버전별 변경 내역은 `docs/update.md`를 참고한다.
|
||||
- 로컬: `npm run db:migrate:dev`
|
||||
- NAS 운영: `sh scripts/migrate-production-db.sh status` → `migrate`
|
||||
- `schema_migrations`가 없는 기존 운영 DB에서 `posts` 테이블이 감지되면 `migrate`는 001부터 자동 실행하지 않는다. 현재 코드 기준 최신 DB라면 최초 1회 `sh scripts/migrate-production-db.sh baseline`으로 기존 파일을 적용 완료로 기록한다. 특정 번호까지만 기록하려면 예: `sh scripts/migrate-production-db.sh baseline 031`.
|
||||
|
||||
### 이메일 인증(Resend, 선택)
|
||||
|
||||
회원가입(일반)·비밀번호 찾기에 이메일 OTP를 쓰려면 `npm run db:migrate:dev`로 `018_email_otp_challenges.sql`을 적용하고, `.env`에 다음을 설정한다.
|
||||
@@ -664,13 +254,7 @@ docker compose --env-file .env.production up -d --build
|
||||
- 관리 도구: CloudBeaver 등으로 추후 연결 가능하게 설계
|
||||
- NAS Docker 배포 시 PostgreSQL 초기 스키마는 `db/migrations/`의 SQL로 생성
|
||||
- 로컬 개발 Docker Compose 실행 시 `ENV_FILE=.env.development`와 `--env-file .env.development`를 함께 사용
|
||||
- 로컬 개발 DB 마이그레이션은 `npm run db:migrate:dev`로 실행
|
||||
- NAS 운영 DB 마이그레이션은 NAS 호스트에 npm이 없어도 실행할 수 있도록 `sh scripts/migrate-production-db.sh status`로 적용 상태를 확인하고, `sh scripts/migrate-production-db.sh migrate`로 미적용 파일만 실행한다.
|
||||
- 운영 환경 파일은 프로젝트 루트의 `.env.production`을 우선 사용한다. 없으면 `.env`를 읽고, 둘 다 없으면 실행 중인 `sori-studio-db` 컨테이너의 `POSTGRES_DB`·`POSTGRES_USER`를 사용한다.
|
||||
- `schema_migrations`가 없는 기존 운영 DB에서 `posts` 테이블이 감지되면 `migrate`는 001부터 자동 실행하지 않는다. 현재 코드 기준 최신 DB라면 최초 1회 `sh scripts/migrate-production-db.sh baseline`으로 기존 파일을 적용 완료로 기록한다. 특정 번호까지만 기록하려면 예: `sh scripts/migrate-production-db.sh baseline 031`.
|
||||
- 네비게이션 계층(`parent_id`, `is_folder`)은 `017_navigation_hierarchy.sql` 적용 후 저장 API가 정상 동작한다(미적용 시 `INSERT` 컬럼 불일치).
|
||||
- 회원 마지막 로그인 표시(`previous_last_seen_at`, `previous_last_seen_ip`)는 `021_add_member_previous_login.sql` 적용 후 정상 동작한다.
|
||||
- 사이트 로고와 파비콘 저장(`logo_url`, `favicon_url`)은 `022_add_site_logo_urls.sql` 적용 후 정상 동작한다.
|
||||
|
||||
### 통계 데이터 보관 정책
|
||||
|
||||
@@ -679,6 +263,7 @@ docker compose --env-file .env.production up -d --build
|
||||
- `analytics_daily_visitors`: 일별 중복 방문 제거용 해시만 담으므로 32일 초과 행은 통계 수집·관리자 조회 흐름에서 주기적으로 삭제한다.
|
||||
- `analytics_active_sessions`: 현재 접속자 목록용 임시 데이터이며 90초 초과 행은 조회·수집 시 삭제한다.
|
||||
- 관리자 대시보드 차트는 최대 365일 범위를 조회하며, 차트 범위를 넘는 집계도 누적 통계 원본으로 보관한다.
|
||||
- 관리자 통계 집계 시작일은 `ANALYTICS_COLLECTED_SINCE` 환경 변수로 설정한다. 기본값은 `2026-06-01`이다.
|
||||
|
||||
### 개발/운영 DB 분리 검증 절차
|
||||
|
||||
@@ -806,6 +391,21 @@ docker compose --env-file .env.production restart sori-studio-db
|
||||
|
||||
여전히 동일하면 프로젝트가 **SMB 공유 폴더 위**에만 있지 않은지 확인한다. Docker 데몬이 네이티브 경로(ext4 등)의 디렉터리를 마운트할 때 권한이 더 예측 가능하다.
|
||||
|
||||
---
|
||||
|
||||
## 운영 보조 명령
|
||||
|
||||
배포와 직접 관련 없지만 운영 DB·업로드 볼륨에 대해 **필요할 때만** 실행하는 명령이다.
|
||||
|
||||
| 명령 | 용도 |
|
||||
|------|------|
|
||||
| `npm run images:backfill-post-thumbnails` | 게시물 대표 이미지용 카드 썸네일(`thumbs/*-card.webp`)이 누락된 기존 업로드를 일괄 생성 |
|
||||
| `npm run navigation:refresh-recommended-favicons` | 추천 사이트 파비콘 캐시를 수동으로 전체 갱신 |
|
||||
|
||||
Homepage 위젯 연동은 `docs/homepage-widget.md`를 참고한다. Docker에서 Homepage가 같은 네트워크에 있으면 `http://sori-studio:3000/api/homepage-widget`을 사용한다.
|
||||
|
||||
---
|
||||
|
||||
## 업로드 파일
|
||||
|
||||
- 관리자 글쓰기에서 업로드한 이미지는 `/uploads/posts/YYYY/MM/` URL로 제공한다.
|
||||
|
||||
Reference in New Issue
Block a user