Skip to content

Commit 4f7ed00

Browse files
authored
Add Kamal deployment configuration (#310)
2 parents 5d3c506 + ee372ab commit 4f7ed00

File tree

12 files changed

+260
-126
lines changed

12 files changed

+260
-126
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Deploy to Production
2+
3+
on:
4+
workflow_dispatch:
5+
6+
jobs:
7+
deploy-production:
8+
runs-on: ubuntu-latest
9+
10+
steps:
11+
- name: Checkout code
12+
uses: actions/checkout@v4
13+
14+
- name: Set up Ruby
15+
uses: ruby/setup-ruby@v1
16+
with:
17+
ruby-version: '3.4.1'
18+
bundler-cache: true
19+
20+
- name: Install Kamal
21+
run: gem install kamal
22+
23+
- name: Set up SSH key
24+
run: |
25+
mkdir -p ~/.ssh
26+
echo "${{ secrets.PRODUCTION_SSH_PRIVATE_KEY }}" > ~/.ssh/skillrx_web_production.pem
27+
chmod 600 ~/.ssh/skillrx_web_production.pem
28+
29+
- name: Deploy to production with Kamal
30+
env:
31+
KAMAL_REGISTRY_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
32+
KAMAL_REGISTRY_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
33+
PRODUCTION_DATABASE_URL: ${{ secrets.PRODUCTION_DATABASE_URL }}
34+
PRODUCTION_SECRET_KEY_BASE: ${{ secrets.PRODUCTION_SECRET_KEY_BASE }}
35+
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
36+
PRODUCTION_AWS_ACCESS_KEY_ID: ${{ secrets.PRODUCTION_AWS_ACCESS_KEY_ID }}
37+
PRODUCTION_AWS_SECRET_ACCESS_KEY: ${{ secrets.PRODUCTION_AWS_SECRET_ACCESS_KEY }}
38+
PRODUCTION_AZURE_STORAGE_ACCOUNT_NAME: ${{ secrets.PRODUCTION_AZURE_STORAGE_ACCOUNT_NAME }}
39+
PRODUCTION_AZURE_STORAGE_ACCOUNT_KEY: ${{ secrets.PRODUCTION_AZURE_STORAGE_ACCOUNT_KEY }}
40+
run: |
41+
KAMAL_DESTINATION=production bin/kamal deploy --skip-push
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
name: Deploy to Staging
2+
3+
on:
4+
push:
5+
branches: [ main ]
6+
workflow_dispatch:
7+
8+
jobs:
9+
deploy-staging:
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- name: Checkout code
14+
uses: actions/checkout@v4
15+
16+
- name: Set up Docker Buildx
17+
uses: docker/setup-buildx-action@v3
18+
19+
- name: Login to Docker Hub
20+
uses: docker/login-action@v3
21+
with:
22+
username: ${{ secrets.DOCKERHUB_USERNAME }}
23+
password: ${{ secrets.DOCKERHUB_PASSWORD }}
24+
25+
- name: Build and push Docker image
26+
uses: docker/build-push-action@v5
27+
with:
28+
context: .
29+
push: true
30+
tags: |
31+
skillrx/skillrx:${{ github.sha }}
32+
skillrx/skillrx:latest
33+
34+
- name: Set up Ruby
35+
uses: ruby/setup-ruby@v1
36+
with:
37+
ruby-version: '3.4.1'
38+
bundler-cache: true
39+
40+
- name: Install Kamal
41+
run: gem install kamal
42+
43+
- name: Set up SSH key
44+
run: |
45+
mkdir -p ~/.ssh
46+
echo "${{ secrets.STAGING_SSH_PRIVATE_KEY }}" > ~/.ssh/skillrx_web_staging.pem
47+
chmod 600 ~/.ssh/skillrx_web_staging.pem
48+
49+
- name: Deploy to staging with Kamal
50+
env:
51+
KAMAL_REGISTRY_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
52+
KAMAL_REGISTRY_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
53+
STAGING_DATABASE_URL: ${{ secrets.STAGING_DATABASE_URL }}
54+
STAGING_SECRET_KEY_BASE: ${{ secrets.STAGING_SECRET_KEY_BASE }}
55+
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
56+
STAGING_AWS_ACCESS_KEY_ID: ${{ secrets.STAGING_AWS_ACCESS_KEY_ID }}
57+
STAGING_AWS_SECRET_ACCESS_KEY: ${{ secrets.STAGING_AWS_SECRET_ACCESS_KEY }}
58+
STAGING_AZURE_STORAGE_ACCOUNT_NAME: ${{ secrets.STAGING_AZURE_STORAGE_ACCOUNT_NAME }}
59+
STAGING_AZURE_STORAGE_ACCOUNT_KEY: ${{ secrets.STAGING_AZURE_STORAGE_ACCOUNT_KEY }}
60+
run: |
61+
KAMAL_DESTINATION=staging bin/kamal deploy --skip-push

.kamal/secrets

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,3 @@
1010
# Use a GITHUB_TOKEN if private repositories are needed for the image
1111
# GITHUB_TOKEN=$(gh config get -h github.com oauth_token)
1212

13-
# Grab the registry password from ENV
14-
KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
15-
16-
# Improve security by using a password manager. Never check config/master.key into git!
17-
RAILS_MASTER_KEY=$(cat config/master.key)

.kamal/secrets.production

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Production secrets - these will be set as GitHub secrets
2+
KAMAL_REGISTRY_USERNAME=$KAMAL_REGISTRY_USERNAME
3+
KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
4+
DATABASE_URL=$PRODUCTION_DATABASE_URL
5+
SECRET_KEY_BASE=$PRODUCTION_SECRET_KEY_BASE
6+
RAILS_MASTER_KEY=$RAILS_MASTER_KEY
7+
AWS_ACCESS_KEY_ID=$PRODUCTION_AWS_ACCESS_KEY_ID
8+
AWS_SECRET_ACCESS_KEY=$PRODUCTION_AWS_SECRET_ACCESS_KEY
9+
AZURE_STORAGE_ACCOUNT_NAME=$PRODUCTION_AZURE_STORAGE_ACCOUNT_NAME
10+
AZURE_STORAGE_ACCOUNT_KEY=$PRODUCTION_AZURE_STORAGE_ACCOUNT_KEY

.kamal/secrets.staging

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Staging secrets - these will be set as GitHub secrets
2+
KAMAL_REGISTRY_USERNAME=$KAMAL_REGISTRY_USERNAME
3+
KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD
4+
DATABASE_URL=$STAGING_DATABASE_URL
5+
SECRET_KEY_BASE=$STAGING_SECRET_KEY_BASE
6+
RAILS_MASTER_KEY=$RAILS_MASTER_KEY
7+
AWS_ACCESS_KEY_ID=$STAGING_AWS_ACCESS_KEY_ID
8+
AWS_SECRET_ACCESS_KEY=$STAGING_AWS_SECRET_ACCESS_KEY
9+
AZURE_STORAGE_ACCOUNT_NAME=$STAGING_AZURE_STORAGE_ACCOUNT_NAME
10+
AZURE_STORAGE_ACCOUNT_KEY=$STAGING_AZURE_STORAGE_ACCOUNT_KEY

Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
1414
# Rails app lives here
1515
WORKDIR /rails
1616

17+
# Add service label for Kamal
18+
LABEL service="skillrx"
19+
1720
# Install base packages
1821
RUN apt-get update -qq && \
1922
apt-get install --no-install-recommends -y curl libjemalloc2 libvips postgresql-client && \

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,4 @@ If you encounter issues:
171171
- Verify that your .env file contains all necessary variables
172172
- Try rebuilding the environment with make rebuild
173173
- Check container logs for specific error messages
174+
# Test staging deployment

config/credentials.yml.enc

Lines changed: 0 additions & 1 deletion
This file was deleted.

config/database.yml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,32 +99,40 @@ production:
9999
primary:
100100
<<: *default
101101
database: skillrx_production
102-
urL: <%= ENV['DATABASE_URL'] %>
102+
url: <%= ENV['DATABASE_URL'] %>
103103
cache:
104104
<<: *default
105-
database: sklillrx_production_cache
105+
database: skillrx_production_cache
106+
url: <%= ENV['DATABASE_URL'] %>
106107
migrations_paths: db/cache_migrate
107108
queue:
108109
<<: *default
109110
database: skillrx_production_queue
111+
url: <%= ENV['DATABASE_URL'] %>
110112
migrations_paths: db/queue_migrate
111113
cable:
112114
<<: *default
113115
database: skillrx_production_cable
116+
url: <%= ENV['DATABASE_URL'] %>
114117
migrations_paths: db/cable_migrate
115118

116119
staging:
117120
primary:
118121
<<: *default
122+
database: skillrx_staging
119123
url: <%= ENV['DATABASE_URL'] %>
120124
cache:
121125
<<: *default
126+
database: skillrx_staging_cache
127+
url: <%= ENV['DATABASE_URL'] %>
122128
migrations_paths: db/cache_migrate
123129
queue:
124130
<<: *default
125-
url: <%= ENV['HEROKU_POSTGRESQL_QUEUE_URL'] || ENV['QUEUE_DATABASE_URL'] %>
131+
database: skillrx_staging_queue
132+
url: <%= ENV['DATABASE_URL'] %>
126133
migrations_paths: db/queue_migrate
127134
cable:
128135
<<: *default
129-
url: <%= ENV['HEROKU_POSTGRESQL_CABLE_URL'] || ENV['CABLE_DATABASE_URL'] %>
136+
database: skillrx_staging_cable
137+
url: <%= ENV['DATABASE_URL'] %>
130138
migrations_paths: db/cable_migrate

config/deploy.production.yml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Production deployment configuration
2+
service: skillrx-production
3+
4+
# Name of the container image.
5+
image: skillrx/skillrx
6+
7+
# Deploy to production server (update with your production server IP)
8+
servers:
9+
web:
10+
- 3.233.202.191
11+
12+
proxy:
13+
ssl: true
14+
host:
15+
- skillrx.org
16+
- www.skillrx.org
17+
18+
registry:
19+
username: KAMAL_REGISTRY_USERNAME
20+
password:
21+
- KAMAL_REGISTRY_PASSWORD
22+
23+
# Production environment variables
24+
env:
25+
secret:
26+
- RAILS_MASTER_KEY
27+
- DATABASE_URL
28+
- SECRET_KEY_BASE
29+
- AWS_ACCESS_KEY_ID
30+
- AWS_SECRET_ACCESS_KEY
31+
- AZURE_STORAGE_ACCOUNT_NAME
32+
- AZURE_STORAGE_ACCOUNT_KEY
33+
clear:
34+
RAILS_ENV: production
35+
AWS_DEFAULT_REGION: us-east-1
36+
AWS_BUCKET_NAME: skillrx-production
37+
AWS_ENDPOINT_URL: "" # Empty for real AWS
38+
AZURE_STORAGE_SHARE_NAME: contentshare
39+
LOCALSTACK_DEBUG: "0"
40+
S3_SKIP_SIGNATURE_VALIDATION: "0"
41+
SOLID_QUEUE_IN_PUMA: true
42+
43+
aliases:
44+
console: app exec --interactive --reuse "bin/rails console"
45+
shell: app exec --interactive --reuse "bash"
46+
logs: app logs -f
47+
dbc: app exec --interactive --reuse "bin/rails dbconsole"
48+
49+
volumes:
50+
- "skillrx_production_storage:/rails/storage"
51+
52+
asset_path: /rails/public/assets
53+
54+
builder:
55+
arch: amd64
56+
57+
ssh:
58+
user: ubuntu
59+
keys_only: true
60+
keys:
61+
- ~/.ssh/skillrx_web_production.pem

0 commit comments

Comments
 (0)