Skip to content

Secrets

MySQL Password

The MySQL password has to get into the MySQL and MediaWiki containers. To do this, we hard-code the MySQL password as an environment variable in docker-compose.yml.

The file docker-compose.fixme.yml contains the placeholder REPLACEME where the MySQL password goes.

To create a docker-compose.yml from docker-compose.fixme.yml:

$ sed "s/REPLACEME/YoFooThisIsYourNewPassword/" docker-compose.fixme.yml > docker-compose.yml

Great if you hard-code the password, but - wasn't that the whole thing we were trying to avoid?

Put the password into a file istead, then grab the password from that file and do a find/replace on the docker compose file:

$ cat root.password
mysecretpassword

$ sed "s/REPLACEME/`cat root.password`/" docker-compose.fixme.yml > docker-compose.yml

The docker-compose.yml file and root.password files are both ignored by version control.

Nginx SSL Certificates

The other secrets we need to get into the container are the SSL certificates for the nginx container.

To generate the SSL certificates using Let's Encrypt, use the script in the certbot directory. These will be stored on the host machine at /etc/letsencrypt/live/example.com/*.

To mount the certificates in the directory, we bind-mount the entire /etc/letsencrypt/ directory into the container with the following line in the docker-compose file:

services:
  ...
  stormy_nginx:
    ...
    volumes:
      - "/etc/letsencrypt:/etc/letsencrypt"
    ...

Meanwhile, in the nginx configuration file that's mounted into the container, we have the following in the SSL server blocks (see docker/d-nginx-charlesreid1):

server {
    # https://charlesreid1.com
    listen 443;
    listen [::]:443;
    server_name charlesreid1.com;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/charlesreid1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/charlesreid1.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;

    ...
}