init
This commit is contained in:
commit
bf1634f44f
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
caddy.container
|
||||
config/*.caddy
|
18
README.md
Normal file
18
README.md
Normal file
@ -0,0 +1,18 @@
|
||||
# Caddy
|
||||
Webserver and reverse proxy for installed services.
|
||||
Detects installed services and proxies them based on given configuration.
|
||||
|
||||
## Configuration
|
||||
Other services can use caddy as proxy.
|
||||
To do so, they need to provide caddy configuration files and give caddy access to their network.
|
||||
The `./configure.sh` script will find the configuration files/networks and add them to the caddy configuration.
|
||||
|
||||
To configure a service to be proxied by caddy:
|
||||
1. Add `*.caddy` file(s) to your service with caddy configuration
|
||||
2. Add the `caddy=true` label to your network(s) that should be accessible by caddy
|
||||
3. Call `./configure.sh` on the server to refresh the caddy configuration
|
||||
|
||||
## Installation
|
||||
1. Clone repository to service directory
|
||||
2. Configure the service by calling `./configure.sh`
|
||||
3. Start the service by calling `systemctl --user start caddy-* caddy`
|
0
caddy-logs.volume
Normal file
0
caddy-logs.volume
Normal file
2
caddy.network
Normal file
2
caddy.network
Normal file
@ -0,0 +1,2 @@
|
||||
[Network]
|
||||
IPv6=true
|
2
caddy.volume
Normal file
2
caddy.volume
Normal file
@ -0,0 +1,2 @@
|
||||
[Volume]
|
||||
Label="backup=true"
|
26
config/Caddyfile
Normal file
26
config/Caddyfile
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
log {
|
||||
exclude http.log.access
|
||||
}
|
||||
|
||||
log access {
|
||||
format json
|
||||
output file /data/logs/access.log {
|
||||
roll_size 1gb
|
||||
roll_keep 5
|
||||
roll_keep_for 720h
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(default-headers) {
|
||||
header {
|
||||
?Cache-Control max-age=3600
|
||||
Strict-Transport-Security max-age=63072000; preload
|
||||
X-Content-Type-Options nosniff
|
||||
X-Frame-Options SAMEORIGIN
|
||||
-Server
|
||||
}
|
||||
}
|
||||
|
||||
import *.caddy
|
84
configure.sh
Executable file
84
configure.sh
Executable file
@ -0,0 +1,84 @@
|
||||
#!/bin/sh
|
||||
# ======================================
|
||||
# configure.sh v1.0; job79
|
||||
# Generate caddy configuration based on
|
||||
# the installed services.
|
||||
# ======================================
|
||||
|
||||
set -eu
|
||||
log() { printf '\e[%sm%s\e[0m %s\n' "${3:-36}" "${2:-○}" "$1"; }
|
||||
ask() { printf '\e[33m?\e[0m %s ' "$1"; read a; [ "${a,,}" = 'y' ]; }
|
||||
|
||||
# gen_quadlet_file generates the caddy container quadlet file
|
||||
gen_quadlet_file() {
|
||||
log 'start generating quadlet file'
|
||||
cat > "$CADDY_QUADLET_FILE" <<- EOF
|
||||
# ============================================================================
|
||||
# This file is generated by caddy/configure.sh, do not edit this file manually
|
||||
# ============================================================================
|
||||
[Container]
|
||||
Image=docker.io/caddy:2.7
|
||||
AutoUpdate=registry
|
||||
|
||||
# storage
|
||||
Volume=caddy.volume:/data/caddy
|
||||
Volume=caddy-logs.volume:/data/logs
|
||||
Volume=%h/services/caddy/config:/etc/caddy:Z,ro
|
||||
|
||||
# networking
|
||||
Network=caddy.network
|
||||
PublishPort=0.0.0.0:80:80
|
||||
PublishPort=0.0.0.0:443:443
|
||||
PublishPort=0.0.0.0:443:443/udp
|
||||
EOF
|
||||
|
||||
log 'search for networks with caddy=true label'
|
||||
podman network ls -f label=caddy=true --format "{{.Name}}" | while read -r network; do
|
||||
log "found $network" '↖' 35
|
||||
echo "Network=$network" >> "$CADDY_QUADLET_FILE"
|
||||
done
|
||||
|
||||
cat >> "$CADDY_QUADLET_FILE" <<- EOF
|
||||
# security
|
||||
ReadOnly=true
|
||||
NoNewPrivileges=true
|
||||
DropCapability=ALL
|
||||
AddCapability=NET_BIND_SERVICE
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target default.target
|
||||
EOF
|
||||
log 'finished generating quadlet file' '✓' 32
|
||||
}
|
||||
|
||||
# gen_config_dir generates the caddy config directory
|
||||
gen_config_dir() {
|
||||
log 'generate caddy config directory with *.caddy files from services'
|
||||
find "$CADDY_CONFIG_DIR" -name '*.caddy' -exec rm {} \;
|
||||
find "$SERVICES_DIR" -name '*.caddy' -not -path "$CADDY_CONFIG_DIR/*" | while read -r in; do
|
||||
log "found $in" '↖' 35
|
||||
cp "$in" "$CADDY_CONFIG_DIR"
|
||||
done
|
||||
log 'finished generating caddy config directory' '✓' 32
|
||||
}
|
||||
|
||||
## MAIN ##
|
||||
SERVICES_DIR="$(dirname "$(dirname "$(realpath "$0")")")"
|
||||
CADDY_QUADLET_FILE="$SERVICES_DIR/caddy/caddy.container"
|
||||
CADDY_CONFIG_DIR="$SERVICES_DIR/caddy/config"
|
||||
|
||||
gen_quadlet_file
|
||||
gen_config_dir
|
||||
|
||||
ask "apply config changes by reloading config (y/N)?" && \
|
||||
podman exec -w /etc/caddy systemd-caddy caddy reload && \
|
||||
log 'successfully applied config changes' '✓' 32
|
||||
|
||||
ask "restart caddy? required to join new networks (y/N)?" && \
|
||||
systemctl --user daemon-reload && \
|
||||
systemctl --user restart caddy && \
|
||||
log 'successfully restarted caddy' '✓' 32
|
Loading…
Reference in New Issue
Block a user