env: LETSENCRYPT_DIR: "/shared/letsencrypt" hooks: after_ssl: - exec: cmd: - if [ -z "$LETSENCRYPT_ACCOUNT_EMAIL" ]; then echo "LETSENCRYPT_ACCOUNT_EMAIL ENV variable is required and has not been set."; exit 1; fi - /bin/bash -c "if [[ ! \"$LETSENCRYPT_ACCOUNT_EMAIL\" =~ ([^@]+)@([^\.]+) ]]; then echo \"LETSENCRYPT_ACCOUNT_EMAIL is not a valid email address\"; exit 1; fi" - exec: cmd: - cd /root && git clone https://github.com/Neilpang/acme.sh.git && cd /root/acme.sh && git reset --hard 1e6b68f5d187fa3d64c889d04a77ee1c79726282 - touch /var/spool/cron/crontabs/root - install -d -m 0755 -g root -o root $LETSENCRYPT_DIR - cd /root/acme.sh && LE_WORKING_DIR="${LETSENCRYPT_DIR}" ./acme.sh --install - file: path: "/etc/nginx/letsencrypt.conf" contents: | user www-data; worker_processes auto; daemon on; events { worker_connections 768; # multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; access_log /var/log/nginx/access.letsencrypt.log; error_log /var/log/nginx/error.letsencrypt.log; server { listen 80; listen [::]:80; location ~ /.well-known { root /var/www/discourse/public; allow all; } } } - file: path: /etc/runit/1.d/letsencrypt chmod: "+x" contents: | #!/bin/bash /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf LE_WORKING_DIR="${LETSENCRYPT_DIR}" $$ENV_LETSENCRYPT_DIR/acme.sh --issue -d $$ENV_DISCOURSE_HOSTNAME -k 4096 -w /var/www/discourse/public --staging --force if [ ! "$(cd $$ENV_LETSENCRYPT_DIR/$$ENV_DISCOURSE_HOSTNAME && openssl verify -CAfile ca.cer fullchain.cer | grep "OK")" ]; then # Try to issue the cert again if something goes wrong LE_WORKING_DIR="${LETSENCRYPT_DIR}" $$ENV_LETSENCRYPT_DIR/acme.sh --issue -d $$ENV_DISCOURSE_HOSTNAME -k 4096 --force --staging -w /var/www/discourse/public fi LE_WORKING_DIR="${LETSENCRYPT_DIR}" $$ENV_LETSENCRYPT_DIR/acme.sh --installcert -d $$ENV_DISCOURSE_HOSTNAME --fullchainpath /shared/ssl/$$ENV_DISCOURSE_HOSTNAME.cer --keypath /shared/ssl/$$ENV_DISCOURSE_HOSTNAME.key --reloadcmd "sv reload nginx" /usr/sbin/nginx -c /etc/nginx/letsencrypt.conf -s stop - replace: filename: "/etc/nginx/conf.d/discourse.conf" from: /ssl_certificate.+/ to: | ssl_certificate /shared/ssl/$$ENV_DISCOURSE_HOSTNAME.cer; - replace: filename: /shared/letsencrypt/account.conf from: /#ACCOUNT_EMAIL=.+/ to: | ACCOUNT_EMAIL=$$ENV_LETSENCRYPT_ACCOUNT_EMAIL - replace: filename: "/etc/nginx/conf.d/discourse.conf" from: /ssl_certificate_key.+/ to: | ssl_certificate_key /shared/ssl/$$ENV_DISCOURSE_HOSTNAME.key; - replace: filename: "/etc/nginx/conf.d/discourse.conf" from: /add_header.+/ to: | # remember the certificate for 80 days and automatically connect to HTTPS for this domain add_header Strict-Transport-Security 'max-age=6912000';