Setting up rails with litestream on fly.io
Assume we have a vanilla Rails setup that has Dockerfile available and is running without issues at the moment.
To change default Rails setup
Updating Dockerfile
# Install Litestream RUN apt-get update && apt-get install -y wget && \ wget https://github.com/benbjohnson/litestream/releases/download/v0.3.13/litestream-v0.3.13-linux-amd64.tar.gz && \ ` tar -C /usr/local/bin -xzf litestream-v0.3.13-linux-amd64.tar.gz && \ ` rm litestream-v0.3.13-linux-amd64.tar.gz && \ ` apt-get remove -y wget && apt-get autoremove -y && apt-get clean `
....
# Copy built artifacts: gems, applicationCOPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}"COPY --from=build /rails /rails
COPY --from=build /usr/local/bin/litestream /usr/local/bin/litestream ` Copy Litestream config ` COPY litestream.yml /etc/litestream.yml `
...
# Start the server by default, this can be overwritten at runtimeEXPOSE 3000
CMD ["./bin/rails", "server"] ` CMD ["sh", "-c", "litestream replicate -exec '/rails/bin/rails server'"] `
Update docker-entrypoint
# If running the rails server then create or migrate existing database if [ "${1}" == "./bin/rails" ] && [ "${2}" == "server" ]; then ./bin/rails db:prepare fi
if [[ "$@" == *"litestream replicate -exec '/rails/bin/rails server'"* ]]; then /rails/bin/rails db:prepare fi
A litestream.yml
config file at root
dbs: - path: /data/production.sqlite3 replicas: - url: ${S3_BUCKET_URL} sync-interval: 10s
Here we assume that the database is stored at /data/production.sqlite3
This is coming from the fly.toml config.
[[mounts]]source = 'data'destination = '/data'
[env]DATABASE_URL = 'sqlite3:///data/production.sqlite3'
We already have a volume defined for the app, so just mounting it to the path in config
Have ENV values setup
AWS_ACCESS_KEY_IDAWS_DEFAULT_REGIONAWS_SECRET_ACCESS_KEY
That should do it.
Updated on