Skip to content

Instantly share code, notes, and snippets.

@ioistired
Last active February 28, 2024 10:58
Show Gist options
  • Save ioistired/6e7dff27d4430ba31a5a763a96bf5fc7 to your computer and use it in GitHub Desktop.
Save ioistired/6e7dff27d4430ba31a5a763a96bf5fc7 to your computer and use it in GitHub Desktop.
make caddy certs (make sure ports 80 and 443 are open first)
#!/usr/bin/env bash
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit
fi
tmp=$(mktemp --directory)
cd $tmp
wget --content-disposition 'https://caddyserver.com/download/linux/amd64?license=personal'
mkdir caddy
tar xf *.tar.gz -C caddy
cd caddy
install caddy /usr/local/bin/
setcap cap_net_bind_service=+eip /usr/local/bin/caddy
mkdir -p /etc/ssl/caddy
chown -R www-data:www-data /etc/ssl
mkdir -p /etc/caddy
echo -n "$1 " >> /etc/caddy/Caddyfile
chown -R www-data:www-data /etc/caddy
cat > /etc/systemd/system/caddy.service <<'EOF'
[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Restart=on-abnormal
; User and group the process will run as.
User=www-data
Group=www-data
; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy
; Always set "-root" to something safe in case it gets forgotten in the Caddyfile.
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID
; Use graceful shutdown with a reasonable timeout
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s
; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
LimitNOFILE=1048576
; Unmodified caddy is not expected to use more than that.
LimitNPROC=512
; Use private /tmp and /var/tmp, which are discarded after caddy stops.
PrivateTmp=true
; Use a minimal /dev
PrivateDevices=true
; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
ProtectHome=true
; Make /usr, /boot, /etc and possibly some more folders read-only.
ProtectSystem=full
; … except /etc/ssl/caddy, because we want Letsencrypt-certificates there.
; This merely retains r/w access rights, it does not add any new. Must still be writable on the host!
ReadWriteDirectories=/etc/ssl/caddy
; The following additional security directives only work with systemd v229 or later.
; They further retrict privileges that can be gained by caddy. Uncomment if you like.
; Note that you may have to add capabilities required by any plugins in use.
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
service caddy restart \
&& echo "Done. Check /etc/ssl/caddy/acme/acme-v01.api.letsencrypt.org/sites/$1 for your certs" \
|| echo 'Failed! Check journalctl -u caddy.'; exit 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment