with one click
add-caddy-route
Add a reverse proxy route to an encrypted Caddyfile
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Add a reverse proxy route to an encrypted Caddyfile
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | add-caddy-route |
| description | Add a reverse proxy route to an encrypted Caddyfile |
| compatibility | Requires agenix, agenix-helper |
| metadata | {"author":"ruinous.ai","version":"1.1","domain":"networking"} |
| parameters | {"hostname":{"type":"select","description":"Host where Caddy runs","required":true,"options":[{"label":"pilaster (Recommended)","description":"Main web services host"},{"label":"monolith","description":"Infrastructure services host"},{"label":"zenith","description":"AI/GPU workloads host"},{"label":"obelisk","description":"GPU compute host"}]},"domain":{"type":"string","description":"Domain for the route (e.g., myservice.meskill.farm)","required":true,"placeholder":"myservice.meskill.farm"},"backend":{"type":"string","description":"Backend service address (container:port)","required":true,"placeholder":"myservice:8080"}} |
Add a reverse proxy route to an encrypted Caddyfile.
If parameters are missing from $ARGUMENTS, use mcp_question to gather them:
mcp_question({
questions: [
{
question: "Which host's Caddyfile should be updated?",
header: "Host",
options: [
{ label: "pilaster (Recommended)", description: "Main web services host" },
{ label: "monolith", description: "Infrastructure services" },
{ label: "zenith", description: "AI/GPU workloads" },
{ label: "obelisk", description: "GPU compute host" }
]
},
{
question: "What domain should this route serve?",
header: "Domain",
options: [
{ label: "Enter domain...", description: "e.g., myservice.meskill.farm" }
]
},
{
question: "What is the backend service address?",
header: "Backend",
options: [
{ label: "Enter backend...", description: "e.g., myservice:8080 (container:port)" }
]
}
]
})
Expected $ARGUMENTS format: <hostname> <domain> <backend>
pilaster myservice.meskill.farm myservice:8080agenix-helper unlock
agenix view hosts/<hostname>/files/caddy/Caddyfile.age > /tmp/Caddyfile
Append to /tmp/Caddyfile:
<domain> {
reverse_proxy <backend>
}
rm hosts/<hostname>/files/caddy/Caddyfile.age
agenix edit -i /tmp/Caddyfile hosts/<hostname>/files/caddy/Caddyfile.age
rm /tmp/Caddyfile
agenix rekey -a
agenix-helper lock
service.meskill.farm {
reverse_proxy container:8080
}
ollama.meskill.farm {
reverse_proxy ollama:11434 {
header_up Host localhost
}
}
service-int.meskill.farm service.meskill.farm {
reverse_proxy container:8080
}
service.meskill.farm www.service.meskill.farm {
reverse_proxy container:8080
}
{
acme_dns cloudflare {env.CF_API_TOKEN}
email admin@meskill.network
}
The Caddy container is configured to restart on Caddyfile changes:
systemd.services.docker-caddy = {
restartTriggers = [config.age.secrets.<hostname>_caddy_caddyfile.path];
};
/add-caddy-route pilaster myservice.meskill.farm myservice:8080
After deployment:
# Check Caddy config is valid
docker exec caddy caddy validate --config /etc/caddy/Caddyfile
# Reload Caddy
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
Add an AeroSpace window rule to assign an app/window to a workspace (macOS only)
Create or update secrets using Infisical (preferred) or legacy agenix files
Re-encrypt all secrets after modifying .age files or changing host keys
Decrypt and view the contents of an .age secret file
Deploy NixOS/Darwin configuration to local or remote host using justfile commands
Analyze project from URL/path and auto-detect build system to create Nix package