사이드프로젝트 slecs

포트폴리오 서버에 FastAPI 블로그를 얹은 과정

이미 있는 다크 포폴 옆에 /blog 서브패스로 같이 살리기.

목차

포트폴리오는 정적 1-page (Caddy + 다크 테마) 로 띄워뒀는데, 글 쓸 공간이 따로 없어서 같은 박스에 블로그를 얹기로 했다. 새 서버 띄우기는 과하고, 메모리 968Mi 안에서 MariaDB / Redis / Caddy 가 이미 살아있으니 정적 + 동적 같이 굴리면 끝.

스택

  • 백엔드: FastAPI (단일 파일, ~50MB)
  • DB: 기존 MariaDB 11.4 안에 새 DB blog 1개 + 전용 user
  • 세션: Starlette SessionMiddleware (itsdangerous, 7일)
  • 마크다운: markdown + Pygments + python-slugify
  • 프록시: Caddy handle @blog { reverse_proxy 127.0.0.1:8001 }
  • 데몬: systemd blog.service, KeepAlive=true

핵심 한 줄

Caddy 한 사이트 블록 안에 named matcher 만 추가하면 끝.

내부 호스트 {
    @blog path /blog /blog/*
    handle @blog {
        reverse_proxy 127.0.0.1:8001
    }

    # 이하 기존 portfolio 정적 서빙 그대로
    root * /var/www/portfolio
    file_server
}

/ 는 그대로 정적 포폴, /blog/* 만 FastAPI 로 흘러간다. 보안 헤더(CSP/HSTS/COOP) 도 outer scope 라 두 사이트 모두에 적용.

스키마

처음엔 9개 테이블로 잡았다가 1인 운영이라 댓글/조회로그를 빼고 7개로 슬림.

테이블 역할
tb_blog_admin 작성자 (bcrypt)
tb_blog_post 본문 (md + html 둘 다 저장, FULLTEXT 검색)
tb_blog_category 계층형 카테고리
tb_blog_tag + tb_blog_post_tag 태그 N:M
tb_blog_attach 본문 이미지 업로드
tb_blog_setting 사이트 전역 설정 (key-value)

한 시간 안에 있던 일

  1. 스키마 SQL 짜고 cafe24 MariaDB 에 적용
  2. FastAPI 단일 파일 + Jinja2 템플릿 6개 + 미니 CSS
  3. rsync 로 코드 업로드 → venv 만들어서 deps 설치
  4. systemd unit 등록, 8001 포트 LISTEN 확인
  5. Caddyfile 에 5줄 추가, caddy validate → reload
  6. 외부 https 접속 200 확인

이 글 자체가 그 결과물의 첫 글.

다음

  • 포폴 톤(다크 + Pretendard + #ff5b1f 오렌지)에 맞춰 디자인 통일 (← 다음 커밋에서)
  • 마크다운 안 코드 하이라이트 더 다듬기
  • 일기 톤 빠른 글쓰기 폼 별도로

댓글 0

첫 댓글 달아줘.