- jsonnet — https://github.com/google/jsonnet or https://github.com/google/go-jsonnet
- crossplane — https://github.com/nginxinc/crossplane
Clone this to a directory and cd
to that directory, then:
sudo ./fix
Clone this to a directory and cd
to that directory, then:
sudo ./fix
#!/bin/bash | |
set -e | |
echo "1. Update nginx config" | |
nginx="/etc/nginx/app.d/server.ReverseProxy.conf" | |
output=$(./patch-nginx "${nginx}") | |
cp "${output}" "${nginx}" | |
echo "2. Reload nginx" | |
synoservicecfg --reload nginx | |
echo "3. Renew certificates" | |
syno-letsencrypt renew-all |
#!/bin/bash | |
set -e | |
if [ $# -lt 1 ]; then | |
echo "Usage: $0 PATH_TO_SERVER_CONFIG" >&2 | |
exit 1 | |
fi | |
server_config="$1" | |
if [ ! -f "${server_config}" ]; then | |
echo "Config file doesn't exist" >&2 | |
exit 1 | |
fi | |
mkdir -p work out | |
cp "${server_config}" work/servers.conf | |
cd work | |
cat <<CONF > nginx.conf | |
http { | |
include servers.conf; | |
} | |
CONF | |
crossplane parse -o nginx.libsonnet -i 2 nginx.conf | |
jsonnet -o nginx_fixed.json ../patch.jsonnet | |
crossplane build -d ../out -f --no-headers -i 4 nginx_fixed.json | |
cd .. | |
echo "out/servers.conf" |
local nginx = import 'work/nginx.libsonnet'; | |
local isServerName(server, name) = std.member([ | |
d.args[0] | |
for d in server.block | |
if d.directive == 'server_name' | |
], name); | |
local addWebSocketDirectives(list) = [ | |
if d.directive == 'location' && d.args == ['/'] then | |
d { | |
block+: [ | |
{ | |
directive: 'proxy_set_header', | |
args: ['Upgrade', '$http_upgrade'], | |
}, | |
{ | |
directive: 'proxy_set_header', | |
args: ['Connection', '$connection_upgrade'], | |
}, | |
], | |
} | |
else d | |
for d in list | |
]; | |
local processServer(server) = server { | |
block: ( | |
if isServerName(server, 'box.hirsz.co') then | |
addWebSocketDirectives(server.block) | |
else | |
server.block | |
) + [ | |
// Add the Let's Encrypt override to each server | |
{ | |
directive: 'location', | |
args: ['^~', '/.well-known/acme-challenge'], | |
block: [ | |
{ | |
directive: 'root', | |
args: ['/var/lib/letsencrypt'], | |
}, | |
{ | |
directive: 'default_type', | |
args: ['text/plain'], | |
}, | |
], | |
}, | |
], | |
}; | |
local processFile(file) = | |
file + ( | |
if file.file == 'nginx.conf' then {} else { | |
parsed: [ | |
// Add a map for WebSocket stuff | |
{ | |
directive: 'map', | |
args: ['$http_upgrade', '$connection_upgrade'], | |
block: [ | |
{ | |
directive: 'default', | |
args: ['upgrade'], | |
}, | |
{ | |
directive: '', | |
args: ['close'], | |
}, | |
], | |
}, | |
] + [ | |
if d.directive == 'server' then processServer(d) else d | |
for d in file.parsed | |
], | |
} | |
); | |
nginx { | |
config: [processFile(file) for file in nginx.config], | |
} |