I am working on an open source web application that I will be hosting on my own server and I estimate most users will use that but I also want to easily allow users to run the application themself. The problem seems to be that the more I attempt to make my system performant and scaleable the harder I make it to host for someone else.

The simplest self hosting version would be to just use rails which creates its own SQLite database and that would work just fine for self hosting users but for my main instance I have it set up with rails, nginx, postgres, sidekiq and redis. Thats non trivial to set up and would be more work than necessary for self hosting users.

My attempt to fix this was dockerizing everything and using docker-compose to start it all up but I have run in to issues coming up with ideas on how to manage the configuration files. Each one of these services needs its own configs which currently I have stored on the host server and they get volume mounted to the right spot. This has left me with about 5 different config files which has gotten very complicated when for most people all they want to configure is the domain name and api keys.

I'm having a hard time thinking of a way to make this simple. The only idea I have currently is coming up with my own config file format that takes only the options needed and writing a script to automatically build all of the other configs with default values that most people would want.

1 Answer 1


One approach might be to consider what exactly “configuration” is supposed to mean in your system.

E.g. The 12-Factor App defines config as “everything that is likely to vary between deploys”. For you, this might be the database connection strings and “the domain name and api keys”.

This definition of config excludes other application configuration, for example filenames within the same container or tunable options of a DB. Those kind of options are effectively part of the definition of that container, and should not be supplied externally at runtime.

With respect to Docker, the easiest way to resolve this is probably to copy config files with some placeholders into the image. The container entrypoint would then be a script that fills in those placeholders with some environment variables, and execs the actual process.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.