Deploy astro with kamal

จะว่าไป Kamal ถูกพัฒนาขึ้นมาเพื่อใช้สำหรับ deploy เว็บแอพไปยัง VPS ก็ได้ แน่นอนว่ามันใช้กับ Rails ได้อยู่แล้วแหละ ดังนั้นในตัวอย่างนี้เราจะลองนำมาใช้ deploy เจ้า Astro กันหน่อย

  1. เตรียมความพร้อมของ VPS ซึ่งก็ต้องมั่นใจว่าได้ติดตั้ง ssh และ Docker ให้เรียบร้อย

  2. สร้างโปรเจ็ค Astro และติดตั้ง adaptor สำหรับ deploy ก็ขึ้นอยู่ว่าโปรเจ็คที่รันเป็น Static หรือ SSR

  3. สร้าง Dockerfile ของโปรเจ็ค

       FROM node:21-alpine AS base
       RUN apk add curl
       RUN corepack enable pnpm
       WORKDIR /app
       COPY package.json pnpm-lock.yaml ./
           
       FROM base as prod-deps
       RUN pnpm install --production
           
       FROM base as build-deps
       RUN pnpm install --production=false
           
       FROM build-deps as build
       COPY . .
       RUN pnpm run build
           
       FROM base as runtime
       COPY --from=prod-deps /app/node_modules ./node_modules
       COPY --from=build /app/dist ./dist
           
       ENV HOST=0.0.0.0
       ENV PORT=3000
       EXPOSE 3000
       CMD ["node", "./dist/server/entry.mjs"]
    
  4. ติดตั้ง Kamal และกำหนด config เพื่อใช้ในการติดตั้ง Astro

    $ gem install kamal
    $ kamal init
    
  5. กำหนดค่าต่างๆ ใน config/deploy.yml

    service: astro-kamal
    image: karn18/web
    servers:
       - 45.32.50.132
    registry:
       username: karn18
       password:
          - KAMAL_REGISTRY_PASSWORD
    traefik:
       args:
          entrypoints.web.address: ':80'
    healthcheck:
       path: /health
       port: 3000
    builder:
       multiarch: false
    
  6. จากนั้นก็รันคำสั่ง kamal setup รออีกสักแป้บเว็บของเราก็จะอัพขึ้นไปบน VPS และสามารถเข้าผ่านไอพีได้

References