How is Everyone Managing secrets in a Compose File Repo
I've migrated off of Portainer to standard docker compose recently so that I can script some major tasks like updating all the containers or restarting all of them. I also liked the idea of being able to put the compose files into a git repo and push it up so that they are automatically backed up. I hope to be able to turn this into more of infrastructure as code implementation where I can edit the repo and have it auto push to my server and redeploy. That's a bit further down the line though.
That said, with the compose files living in their remote, they currently still have their secrets on them, either in a corresponding .env file or in the compose file itself. I really don't like this since if someone ever gains access to the repo they have all my services' secrets. What is the best way to use a git repo for compose files while not exposing a bunch of secrets potentially?
I know podman supports secrets, though I guess I'd have to manually ssh into the server to create them in the session. Currently these services are all through docker however.
I usually use a
.env.example
file which contains all non-secret variables filled and all secret variables defined with no value.The secrets are stored in the secret store of GitHub/GitLab (depending on what I'm using). During deploy the
.env.example
file is copied to.env
and all the secret variables are written into the file (which itself is in .gitignore to avoid accidentally committing the local version on my machine).I use Ansible to deploy the docker-compose files around and do the typical operations (pull, restart, up/down). I store the secrets in my Ansible vault and it injects the secrets directly into the compose file when deploying the compose file to the host.
I add .env to my .gitignore, then I can safely put secrets in my .env. If you have a big .env file, make a sample.env with the secrets removed.
Ansible vault
I use
sops
, usually withexec-env
You could have the best of both worlds and then also use GitHub secrets as well. https://github.com/marketplace/actions/deploy-a-portainer-stack
Some random suggestions - it really depends on your deployment strategy and available infrastructure
https://docs.portainer.io/user/docker/secrets
https://docs.docker.com/engine/reference/commandline/buildx_build/#secret
https://docs.github.com/en/actions/security-guides/encrypted-secrets