루비 온 레일즈를 배포하는 방법은 보통 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 |
---|