블로그를 열었습니다
pyrimidine.dev를 Astro와 Cloudflare Workers로 만들었습니다. 왜 이렇게 만들었고 글은 어떻게 올리는지 적어 둡니다.
포트폴리오 사이트는 따로 있습니다. 이력서에 붙일 숫자와 프로젝트 설명이 필요해서 Next.js로 만들었고 그건 그 역할을 하면 됩니다. 이 사이트는 다른 용도입니다. 운영하다가 겪은 일을 글로 남기는 곳이라, 글 한 편 올리는 데 드는 손이 가장 적어야 했습니다.
무엇으로 만들었나
Astro로 정적 HTML을 뽑고 Cloudflare Workers의 static assets로 올립니다. 브라우저에 내려가는 자바스크립트는 없습니다. 글은 src/content/blog/ 안의 마크다운 파일 하나이고, 빌드하면 목록과 RSS, 사이트맵이 같이 나옵니다.
Next.js를 또 쓰지 않은 이유는 단순합니다. 마크다운 몇 장을 HTML로 바꾸는 데 서버 런타임이 필요하지 않았습니다. 포트폴리오는 OpenNext로 Workers 위에서 돌리는데, 여기에 그 구성은 과했습니다.
Cloudflare Pages 대신 Workers를 고른 건 도메인 때문입니다. wrangler.jsonc에 custom_domain: true 한 줄을 넣으면 DNS 레코드와 인증서를 알아서 만들어 줍니다. Pages도 되지만 Cloudflare가 새 프로젝트에는 Workers를 권하고 있어서 그쪽을 따랐습니다.
글은 어떻게 올리나
npm run new -- grpc-js-compression "grpc-js 응답 압축이 안 되는 이유"
이러면 src/content/blog/grpc-js-compression.md가 생깁니다. 본문을 쓰고 draft: false로 바꾼 뒤 main에 푸시하면 Cloudflare가 저장소를 받아 빌드하고 배포합니다. 쓰는 동안은 npm run dev로 봅니다.
빌드 전에 npm run lint:prose가 한 번 돕니다. “결론적으로”, “시사하는 바가 크다”, 이중 피동 같은 표현을 잡는 정규식 몇 줄입니다. 초안을 AI에게 잡게 할 때가 있는데 그 흔적을 손으로 지우기 전에 기계가 먼저 걸러 주면 편합니다. 규칙은 im-not-ai의 분류를 줄여서 가져왔습니다.
옮겨 올 것들
RailNetwork를 3년 운영하면서 ADR과 테스트로만 남겨 둔 이야기가 꽤 있습니다. 2호선 열번이 지연 때 바뀌는 문제, grpc-js가 응답 압축을 지원하지 않아 헤더로 우회한 일, 코레일 GIS 좌표를 선로 거리로 바꿔 통과 시각을 구한 일 같은 것들입니다. 하나씩 옮겨 올 생각입니다.