-
-
Save sbounmy/75b35b569f45321e4f7b7287130912f7 to your computer and use it in GitHub Desktop.
| KAMAL_REGISTRY_PASSWORD=xxx | |
| RAILS_MASTER_KEY=xxxxxxxxxxxxxxx | |
| POSTGRES_PASSWORD=xxxxxxxxxxxxx | |
| REDIS_PASSWORD=my-redis-password | |
| REDIS_URL=redis://:my-redis-password@n28-redis:6379/1 |
| # Deploy to these servers. | |
| servers: | |
| web: | |
| hosts: | |
| - 123.123.123.123 | |
| options: | |
| network: "private" | |
| job: | |
| hosts: | |
| - 123.123.123.123 | |
| # Or something like bin/job | |
| cmd: bin/bundle exec sidekiq | |
| # Limit workers resources | |
| options: | |
| cpus: 1 | |
| network: "private" | |
| # Inject ENV variables into containers (secrets come from .env). | |
| # Remember to run `kamal env push` after making changes! | |
| env: | |
| clear: | |
| DB_HOST: 123.123.123.123 | |
| POSTGRES_DB: xxx_production | |
| POSTGRES_USER: xxx | |
| RAILS_LOG_TO_STDOUT: 1 | |
| RAILS_SERVE_STATIC_FILES: 1 | |
| secret: | |
| - RAILS_MASTER_KEY | |
| - POSTGRES_PASSWORD | |
| # Use a different ssh user than root | |
| # ssh: | |
| # user: app | |
| builder: | |
| dockerfile: production.Dockerfile | |
| accessories: | |
| db: | |
| host: 123.123.123.123 | |
| image: postgres:15 | |
| port: 5432 | |
| env: | |
| clear: | |
| POSTGRES_DB: xxx_production | |
| POSTGRES_USER: xxx | |
| secret: | |
| - POSTGRES_PASSWORD | |
| directories: | |
| - data:/var/lib/postgresql/data | |
| files: | |
| # - config/postgres/production.cnf:/etc/postgresql/my.conf | |
| - db/production.sql:/docker-entrypoint-initdb.d/setup.sql | |
| redis: | |
| image: "redis:7" | |
| cmd: "/bin/sh -c 'redis-server --requirepass $REDIS_PASSWORD'" | |
| env: | |
| secret: | |
| - REDIS_PASSWORD | |
| roles: | |
| - web | |
| - job | |
| port: 6379 | |
| volumes: | |
| - /var/lib/redis:/data | |
| options: | |
| network: "private" | |
| traefik: | |
| options: | |
| network: "private" | |
| publish: | |
| - "443:443" | |
| volume: | |
| - "/letsencrypt/acme.json:/letsencrypt/acme.json" | |
| args: | |
| entryPoints.web.address: ":80" | |
| entryPoints.websecure.address: ":443" | |
| entryPoints.web.http.redirections.entryPoint.to: websecure | |
| entryPoints.web.http.redirections.entryPoint.scheme: https | |
| entryPoints.web.http.redirections.entrypoint.permanent: true | |
| # Rails file storage | |
| volumes: | |
| - storage:/rails/storage |
| # Name of your application. Used to uniquely configure containers. | |
| service: n28 | |
| # Name of the container image. | |
| image: hackerhouse/n28 | |
| # Credentials for your image host. | |
| registry: | |
| # Specify the registry server, if you're not using Docker Hub | |
| # server: registry.digitalocean.com / ghcr.io / ... | |
| username: [email protected] | |
| # Always use an access token rather than real password when possible. | |
| password: | |
| - KAMAL_REGISTRY_PASSWORD | |
| # Use a different ssh user than root | |
| # ssh: | |
| # user: app | |
| builder: | |
| dockerfile: production.Dockerfile | |
| accessories: | |
| db: | |
| image: postgres:15 | |
| port: 5432 | |
| env: | |
| clear: | |
| POSTGRES_USER: n28 | |
| directories: | |
| - data:/var/lib/postgresql/data | |
| files: | |
| - config/postgres/production.cnf:/etc/postgresql/my.conf | |
| - db/production.sql:/docker-entrypoint-initdb.d/setup.sql | |
| healthcheck: | |
| path: /up | |
| port: 3000 | |
| max_attempts: 10 | |
| interval: 3s | |
| log_lines: 10_000 |
| # in ./rails/bin/docker-entrypoint | |
| #!/bin/bash -e | |
| # If running the rails server then create or migrate existing database | |
| if [ "${1}" == "./bin/rails" ] && [ "${2}" == "server" ]; then | |
| ./bin/rails db:prepare | |
| fi | |
| exec "${@}" |
| # syntax = docker/dockerfile:1 | |
| # Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile | |
| ARG RUBY_VERSION=3.2.2 | |
| FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base | |
| # Rails app lives here | |
| WORKDIR /rails | |
| # Set production environment | |
| ENV RAILS_ENV="production" \ | |
| BUNDLE_DEPLOYMENT="1" \ | |
| BUNDLE_PATH="/usr/local/bundle" \ | |
| BUNDLE_WITHOUT="development" | |
| # Throw-away build stage to reduce size of final image | |
| FROM base as build | |
| # Install packages needed to build gems | |
| RUN apt-get update -qq && \ | |
| apt-get install --no-install-recommends -y build-essential git libvips pkg-config libpq-dev | |
| # Install application gems | |
| COPY Gemfile Gemfile.lock ./ | |
| RUN bundle install && \ | |
| rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ | |
| bundle exec bootsnap precompile --gemfile | |
| # Copy application code | |
| COPY . . | |
| # Precompile bootsnap code for faster boot times | |
| RUN bundle exec bootsnap precompile app/ lib/ | |
| # Precompiling assets for production without requiring secret RAILS_MASTER_KEY | |
| RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile | |
| # Final stage for app image | |
| FROM base | |
| # Install packages needed for deployment | |
| RUN apt-get update -qq && \ | |
| apt-get install --no-install-recommends -y curl postgresql-client libvips && \ | |
| rm -rf /var/lib/apt/lists /var/cache/apt/archives | |
| # Copy built artifacts: gems, application | |
| COPY --from=build /usr/local/bundle /usr/local/bundle | |
| COPY --from=build /rails /rails | |
| # Run and own only the runtime files as a non-root user for security | |
| RUN useradd rails --create-home --shell /bin/bash && \ | |
| chown -R rails:rails db log storage tmp | |
| USER rails:rails | |
| # Entrypoint prepares the database. | |
| ENTRYPOINT ["/rails/bin/docker-entrypoint"] | |
| # Start the server by default, this can be overwritten at runtime | |
| EXPOSE 3000 | |
| CMD ["./bin/rails", "server"] |
| CREATE DATABASE xxx_production; |
sbounmy
commented
Oct 26, 2023
content for config/postgres/production.cnf?
you have it enabled on https://gist.github.com/sbounmy/75b35b569f45321e4f7b7287130912f7#file-deploy-yml-L34
content for
config/postgres/production.cnf? you have it enabled on https://gist.github.com/sbounmy/75b35b569f45321e4f7b7287130912f7#file-deploy-yml-L34
I actually dont have any content it was part of the configuration. but I do have a production.sql file
CREATE DATABASE {{replace_by_database_name}};
updated with sidekid / redis
make sure to create the private network with docker network create -d bridge private on the host (via ssh)
inspired from https://nts.strzibny.name/deploying-rails-single-server-kamal/
added missing file docker-entry-point. you might want to not add it as it will automatically run migration on kamal deploy
I would suggest to run manually migration with kamal app exec "rake db:prepare"