Puma, Sidekiq and Active Storage on an ARM instance with no per-dyno pricing. Built for Ampere A1 (arm64), listens on port 3000, and starts with bundle exec puma -C config/puma.rb.
FROM ruby:3.3-alpine
WORKDIR /app
RUN apk add --no-cache build-base postgresql-dev tzdata nodejs yarn
COPY Gemfile Gemfile.lock ./
RUN bundle config set --local without 'development test' && bundle install
COPY . .
ENV RAILS_ENV=production RAILS_SERVE_STATIC_FILES=true RAILS_LOG_TO_STDOUT=true
RUN SECRET_KEY_BASE=dummy bundle exec rails assets:precompile
EXPOSE 3000
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]Native gems (pg, nokogiri, bcrypt) compile cleanly on Ampere but add a minute or two to cold builds; layer caching makes subsequent deploys fast.
Cheaploy builds this image on your own Oracle Always Free VM, opens the ports, issues HTTPS and rolls back if health checks fail.