skip to content

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, application
COPY --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 runtime
EXPOSE 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

Terminal window
AWS_ACCESS_KEY_ID
AWS_DEFAULT_REGION
AWS_SECRET_ACCESS_KEY

That should do it.


Updated on