runlot
시작하기

프로젝트 구조

runlot.json 하나와 진입점 하나, 그리고 자산 디렉토리. 배포 계약은 이 셋입니다.

create-runlot 이 만드는 것은 이것뿐입니다.

my-app/
  runlot.json      배포 계약
  src/index.ts     워커 진입점
  public/          정적 자산
    hello.txt
  .gitignore

runlot.json

runlot.json
{
  "name": "my-app",
  "org": "me",
  "main": "src/index.ts",
  "assets": "public"
}

name 은 반드시 있어야 하고, mainassets 중 적어도 하나는 있어야 합니다 — 둘 다 없으면 서빙할 것이 없습니다. 전체 필드는 runlot.json 참조 에 있습니다.

runlot pg create · runlot storage create · runlot auth create 는 여기에 "database": true 같은 줄을 적습니다. 그것은 기록이지 선언이 아닙니다. runlot deploy 는 그 값을 보고 데이터베이스를 만들지 않습니다 — 배포가 프로비저닝 경로이면 오타 하나가 조용히 데이터베이스를 만들고, 만들어진 것을 지우는 길은 배포에 없기 때문입니다. 기록과 실제가 어긋나면 배포가 경고합니다.

진입점

기본 export 에 fetch 가 있으면 됩니다. Cloudflare Workers 를 써 보셨다면 같은 모양입니다.

src/index.ts
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    return new Response("hello runlot");
  },
};

env 로 들어오는 것은 켠 것들입니다 — env.assets, 그리고 켰다면 env.db · env.storage · env.auth, 그리고 시크릿. 시크릿은 대문자 이름이라 소문자 바인딩과 절대 부딪히지 않습니다.

정적 자산

assets 가 가리키는 디렉토리는 통째로 번들에 들어가고, 워커에서는 env.assets 로 꺼냅니다.

if (url.pathname.startsWith("/static/")) {
  return env.assets.fetch(
    new Request(new URL(url.pathname.slice("/static".length), url), request),
  );
}

main 없이 assets 만 있으면 정적 사이트입니다. 그때는 모든 요청을 자산으로 넘기는 진입점이 자동으로 들어갑니다.

번들에는 실제 파일만 담깁니다. 심볼릭 링크와 프로젝트 루트 밖을 가리키는 경로는 거절됩니다 — 번들 안의 심링크 하나로 노드의 아무 파일이나 서빙 대상이 되기 때문입니다.

마이그레이션 디렉토리

runlot pg migrate 는 기본적으로 migrations/ 를 봅니다.

my-app/
  migrations/
    0001_init.sql
    0002_posts.sql

자세한 것은 마이그레이션 에 있습니다.

이 페이지에서