Ruby on Rails - Github, Ubuntu 서버 자동배포

루비 온 레일즈를 배포하는 방법은 보통 Heroku, Fly.io, Railway 등 SaaS 서비스를 권장하고 있습니다.

저는 한 서버에 MVP 개발을 많이 하고 있어 해당 서비스를 이용하면 요금이 많이 부과가 되어 Ubuntu 서버에 docker 형태로 배포하고 있습니다.

Rails 8 부터 Kamal이라는 배포 도구가 포함이 되어있지만 한서버에 여러 서비스를 돌리기엔 무리가 있었습니다.

Kamal-proxy 가 80, 443 포트를 점유하고 있기때문에 proxy 를 삭제해야하는 문제가 있었습니다.

 

Docker Compose를 프로젝트 Dockerfile 있는곳에 생성합니다.

 

docker-compose.yml

services:
  web:
    # build: .
    image: ghcr.io/toollab/test:latest
    ports:
      - "3000:3000"
    environment:
      - RAILS_ENV=production
    env_file:
      - .env
    restart: always
    volumes:
      - ./public:/rails/public
      - ./storage:/rails/storage
      - ./log:/rails/log

 

GitHub Container registry 를 사용합니다.

Docker Hub 를 사용해도 되나 버전관리와 소스관리를 동시에 할 수 있다는 점에서 Github 를 선호합니다.

Token을 먼저 발급받아야합니다.

 

서버에서 아래 명령어를 입력하여 로그인 합니다.

docker login ghcr.io -u USERNAME -p $GITHUB_TOKEN

 

.github/workflows/deploy.yml

name: Deploy to Production

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Log in to GitHub container registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ghcr.io/toollab/test-checkwhos-com:latest

      - name: Deploy to server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          password: ${{ secrets.PASSWORD }}
          # key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd ~/apps/project
            docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }}
            docker compose pull
            docker compose down
            docker compose up -d
            docker compose exec -T web bundle exec rails db:migrate

 

'Programming > Ruby' 카테고리의 다른 글

Ruby on Rails - SQLite I/O 에러 처리  (0) 2025.01.26