From a2de24657156c1e74d220b2756321c29ad3281f1 Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Wed, 26 Nov 2025 16:02:11 -0600 Subject: [PATCH 1/7] add crm.rperce.net to caddy --- vm-homelab.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vm-homelab.nix b/vm-homelab.nix index d2d900b..8d93367 100644 --- a/vm-homelab.nix +++ b/vm-homelab.nix @@ -35,6 +35,9 @@ in "barkeep.rperce.net".extraConfig = '' reverse_proxy http://192.168.0.2:8000 ''; + "crm.rperce.net".extraConfig = '' + reverse_proxy http://192.168.0.2:3000 + ''; "minecraft.dukeceph.xyz".extraConfig = '' reverse_proxy http://192.168.0.4:8080 ''; From 0fbf1d0cb5f1253546a8f97ca3dba0ec8304b6ba Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Wed, 7 Jan 2026 16:37:18 -0600 Subject: [PATCH 2/7] forge runner --- Taskfile | 7 +++++- flake.nix | 2 ++ lxc-forge-runner.nix | 58 ++++++++++++++++++++++++++++++++++++++++++++ lxc-metrics.nix | 1 + 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 lxc-forge-runner.nix diff --git a/Taskfile b/Taskfile index cef244f..8fde074 100755 --- a/Taskfile +++ b/Taskfile @@ -15,7 +15,7 @@ dump() { if [ -e "vm-$1.nix" ]; then sudo cp -f result/vzdump* /mnt/share/proxmox/dump/ elif [ -e "lxc-$1.nix" ]; then - sudo cp -f result/tarball/nixos-system-x86_64-linux.tar.xz "/mnt/share/proxmox/dump/$1.tar.xz" + sudo cp -f result/tarball/nixos-image-lxc-*.tar.xz "/mnt/share/proxmox/template/cache/$1.tar.xz" fi } @@ -38,6 +38,11 @@ deploy() { 'nixos-rebuild switch --flake .#'"$1"' --target-host admin@"'"$ip"'" --use-remote-sudo' } +jump-deploy() { + jump_ip=$(tailscale ip xalicas | head -n1) + env NIX_SSHOPTS="-J robert@$jump_ip" ./Taskfile deploy "$1" +} + ssh() { command "${2:-mosh}" admin@"$(get-ip "$1")" } diff --git a/flake.nix b/flake.nix index 3726b2f..6b8206e 100644 --- a/flake.nix +++ b/flake.nix @@ -30,12 +30,14 @@ outputs = { self, nixpkgs, ... }@inputs: majcraft = nixos-vma ./vm-majcraft.nix; homelab = nixos-vma ./vm-homelab.nix; metrics = nixos-lxc ./lxc-metrics.nix; + forge-runner = nixos-lxc ./lxc-forge-runner.nix; }; packages.${system} = { majcraft = image "majcraft"; homelab = image "homelab"; metrics = lxc "metrics"; + forge-runner = lxc "forge-runner"; }; }; } diff --git a/lxc-forge-runner.nix b/lxc-forge-runner.nix new file mode 100644 index 0000000..245c770 --- /dev/null +++ b/lxc-forge-runner.nix @@ -0,0 +1,58 @@ +{ + pkgs, + lib, + ... +}: + +{ + imports = [ + ./lxc-base.nix + ]; + + config = { + my.vm = { + name = "runner01"; + ip4 = "192.168.0.7"; + }; + + environment.systemPackages = with pkgs; [ + grafana-to-ntfy + ]; + + networking.extraHosts = '' + 192.168.0.2 xalicas + 192.168.0.3 proxmox + 192.168.0.4 craft01 + 192.168.0.5 lab01 + 192.168.0.6 metrics01 + 192.168.0.7 runner01 + 192.168.0.100 unifi + ''; + + networking.firewall.trustedInterfaces = [ "br-+" ]; + + virtualisation.docker = { + enable = true; + daemon.settings = { + fixed-cidr-v6 = "fd00::/80"; + ipv6 = true; + }; + }; + + services.gitea-actions-runner = { + package = pkgs.forgejo-runner; + instances.runner01 = { + enable = true; + name = "runner01"; + token = "E17wr2p2EH4krR5NIUokwsBhhdLCWNW5ahpEyjHY"; + url = "https://forge.rperce.net/"; + labels = [ + "node-22:docker://node:22-bookworm" + "nixos-latest:docker://nixos/nix" + "playwright-latest:docker://mcr.microsoft.com/playwright:v1.57.0-jammy" + ]; + # settings = { ... }; + }; + }; + }; +} diff --git a/lxc-metrics.nix b/lxc-metrics.nix index 207ec9e..de1ed6e 100644 --- a/lxc-metrics.nix +++ b/lxc-metrics.nix @@ -25,6 +25,7 @@ 192.168.0.4 craft01 192.168.0.5 lab01 192.168.0.6 metrics01 + 192.168.0.7 runner01 192.168.0.100 unifi ''; From df50fa38306bc82af19318827fcfab716b2104b4 Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Wed, 7 Jan 2026 16:46:56 -0600 Subject: [PATCH 3/7] quote curl urls --- lxc-metrics.nix | 2 +- vm-homelab.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lxc-metrics.nix b/lxc-metrics.nix index de1ed6e..023f94f 100644 --- a/lxc-metrics.nix +++ b/lxc-metrics.nix @@ -173,7 +173,7 @@ startAt = "daily"; postHook = '' if [ $exitStatus -eq 0 ]; then - curl -sSL http://metrics01:3001/api/push/LmyyAawLzw?status=up&msg=OK&ping= + /run/current-system/sw/bin/curl -sSL 'http://192.168.0.6:3001/api/push/LmyyAawLzw?status=up&msg=OK&ping=' fi ''; }; diff --git a/vm-homelab.nix b/vm-homelab.nix index 8d93367..a082ce5 100644 --- a/vm-homelab.nix +++ b/vm-homelab.nix @@ -108,7 +108,7 @@ in postHook = '' echo "exit $exitStatus" if [ $exitStatus -eq 0 ]; then - /run/current-system/sw/bin/curl -sSL http://192.168.0.6:3001/api/push/yTBTVZF8Bz?status=up&msg=OK&ping= + /run/current-system/sw/bin/curl -sSL 'http://192.168.0.6:3001/api/push/yTBTVZF8Bz?status=up&msg=OK&ping=' fi ''; }; From 39bc01a6a4e2c11863c114dc67bef64a383fb6e8 Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Sun, 18 Jan 2026 22:45:50 -0600 Subject: [PATCH 4/7] fix: install curl to use it --- lxc-metrics.nix | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lxc-metrics.nix b/lxc-metrics.nix index 023f94f..9ec1d7b 100644 --- a/lxc-metrics.nix +++ b/lxc-metrics.nix @@ -17,6 +17,7 @@ environment.systemPackages = with pkgs; [ grafana-to-ntfy + curl ]; networking.extraHosts = '' @@ -29,7 +30,7 @@ 192.168.0.100 unifi ''; - networking.firewall.allowedTCPPorts = [ + networking.firewall.allowedTCPPorts = [ 3000 # grafana 3001 # uptime-kuma ]; @@ -173,7 +174,7 @@ startAt = "daily"; postHook = '' if [ $exitStatus -eq 0 ]; then - /run/current-system/sw/bin/curl -sSL 'http://192.168.0.6:3001/api/push/LmyyAawLzw?status=up&msg=OK&ping=' + /run/current-system/sw/bin/curl -sSL 'http://uptime.rperce.net/api/push/LmyyAawLzw?status=up&msg=OK&ping=' fi ''; }; From 8e0385b2d6195a91578e0de7629412e0c180f2f2 Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Mon, 9 Feb 2026 12:11:31 -0600 Subject: [PATCH 5/7] feat: grist --- flake.lock | 40 +++++++++++----------------------------- vm-homelab.nix | 3 +++ 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/flake.lock b/flake.lock index 9ed5c8f..0932dd6 100644 --- a/flake.lock +++ b/flake.lock @@ -16,36 +16,18 @@ "type": "github" } }, - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "nix-minecraft": { "inputs": { "flake-compat": "flake-compat", - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "systems": "systems" }, "locked": { - "lastModified": 1755914134, - "narHash": "sha256-RZNriojTbxeuCcytq/RlXQ7xJIDZPzGScPxWRft2fbM=", + "lastModified": 1770172907, + "narHash": "sha256-rqYl9B+4shcM5b6OYjT+qdsdQNJ7SY64/xcPIb96NzU=", "owner": "Infinidoge", "repo": "nix-minecraft", - "rev": "f4f58df48f0ebd1c898a043790cd58dd95bc272c", + "rev": "8958a5a4259e1aebf4916823bf463faaf2538566", "type": "github" }, "original": { @@ -56,11 +38,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1748929857, - "narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=", + "lastModified": 1769461804, + "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4", + "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", "type": "github" }, "original": { @@ -72,11 +54,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1755704039, - "narHash": "sha256-gKlP0LbyJ3qX0KObfIWcp5nbuHSb5EHwIvU6UcNBg2A=", + "lastModified": 1767313136, + "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9cb344e96d5b6918e94e1bca2d9f3ea1e9615545", + "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", "type": "github" }, "original": { diff --git a/vm-homelab.nix b/vm-homelab.nix index a082ce5..7fdd341 100644 --- a/vm-homelab.nix +++ b/vm-homelab.nix @@ -67,6 +67,9 @@ in header_up - Authorization } ''; + "grist.rperce.net".extraConfig = '' + reverse_proxy http://192.168.0.2:8484 + ''; }; }; From 57478726517b27ebb8cbdbf58f3a641e128250ef Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Mon, 9 Feb 2026 22:15:08 -0600 Subject: [PATCH 6/7] ergo --- Taskfile | 2 +- flake.lock | 14 +++--- flake.nix | 4 +- lxc-ergo.nix | 132 +++++++++++++++++++++++++++++++++++++++++++++++++ vm-homelab.nix | 10 ++++ 5 files changed, 153 insertions(+), 9 deletions(-) create mode 100644 lxc-ergo.nix diff --git a/Taskfile b/Taskfile index 8fde074..2b78a26 100755 --- a/Taskfile +++ b/Taskfile @@ -34,7 +34,7 @@ get-ip() { deploy() { ip=$(get-ip "$1") - nix-shell -p '(nixos{}).nixos-rebuild' --run \ + TMPDIR=/tmp nix-shell -p '(nixos{}).nixos-rebuild' --run \ 'nixos-rebuild switch --flake .#'"$1"' --target-host admin@"'"$ip"'" --use-remote-sudo' } diff --git a/flake.lock b/flake.lock index 0932dd6..51b517f 100644 --- a/flake.lock +++ b/flake.lock @@ -23,11 +23,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1770172907, - "narHash": "sha256-rqYl9B+4shcM5b6OYjT+qdsdQNJ7SY64/xcPIb96NzU=", + "lastModified": 1770520993, + "narHash": "sha256-ks1ZFBYlBmQ4CAM4WSmCFUtkUJzbmJ0VJH/JkKVMPqY=", "owner": "Infinidoge", "repo": "nix-minecraft", - "rev": "8958a5a4259e1aebf4916823bf463faaf2538566", + "rev": "b32f4325880b4fac47b8736161a8f032dd248b70", "type": "github" }, "original": { @@ -54,16 +54,16 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1767313136, - "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", + "lastModified": 1770464364, + "narHash": "sha256-z5NJPSBwsLf/OfD8WTmh79tlSU8XgIbwmk6qB1/TFzY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", + "rev": "23d72dabcb3b12469f57b37170fcbc1789bd7457", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-25.05", + "ref": "nixos-25.11", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 6b8206e..3278dc6 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; nix-minecraft.url = "github:Infinidoge/nix-minecraft"; }; @@ -31,6 +31,7 @@ outputs = { self, nixpkgs, ... }@inputs: homelab = nixos-vma ./vm-homelab.nix; metrics = nixos-lxc ./lxc-metrics.nix; forge-runner = nixos-lxc ./lxc-forge-runner.nix; + ergo = nixos-lxc ./lxc-ergo.nix; }; packages.${system} = { @@ -38,6 +39,7 @@ outputs = { self, nixpkgs, ... }@inputs: homelab = image "homelab"; metrics = lxc "metrics"; forge-runner = lxc "forge-runner"; + ergo = lxc "ergo"; }; }; } diff --git a/lxc-ergo.nix b/lxc-ergo.nix new file mode 100644 index 0000000..6e98ca7 --- /dev/null +++ b/lxc-ergo.nix @@ -0,0 +1,132 @@ +{ + pkgs, + lib, + ... +}: + +{ + imports = [ + ./lxc-base.nix + ]; + + config = { + my.vm = { + name = "ergo01"; + ip4 = "192.168.0.8"; + }; + + environment.systemPackages = with pkgs; [ + certbot + ]; + + networking.firewall.trustedInterfaces = [ "br-+" ]; + networking.firewall.allowedTCPPorts = [ + 6667 + 6697 + 443 + 80 + ]; + + virtualisation.docker = { + enable = true; + daemon.settings = { + fixed-cidr-v6 = "fd00::/80"; + ipv6 = true; + }; + }; + + security.acme = { + acceptTerms = true; + defaults.email = "admin+acme@dukeceph.xyz"; + }; + + services.nginx = { + enable = true; + virtualHosts."irc.dukeceph.xyz" = { + addSSL = true; + enableACME = true; + locations."/webirc" = { + proxyPass = "http://unix:/run/ergo/websocket"; + proxyWebsockets = true; + extraConfig = '' + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 10m; + ''; + }; + }; + }; + + users.groups."ergo" = {}; + users.users."ergo" = { + group = "ergo"; + isSystemUser = true; + }; + + services.ergochat = { + enable = true; + settings = { + network = { + name = "dukeceph.xyz"; + }; + server = { + name = "dukeceph.xyz"; + enforce-utf8 = true; + ip-cloaking = { + enabled = true; + netname = "dukeceph.xyz"; + }; + listeners = { + ":6697" = { + tls = { + cert = "/etc/letsencrypt/live/irc.dukeceph.xyz/fullchain.pem"; + key = "/etc/letsencrypt/live/irc.dukeceph.xyz/privkey.pem"; + }; + }; + }; + }; + oper-classes = { + chat-moderator = { + title = "Chat Moderator"; + capabilities = [ + "kill" # disconnect user sessions + "ban" # ban IPs, CIDRs, NUH masks, and suspend accounts (UBAN / DLINE / KLINE) + "nofakelag" # exempted from "fakelag" restrictions on rate of message sending + "relaymsg" # use RELAYMSG in any channel (see the `relaymsg` config block) + "vhosts" # add and remove vhosts from users + "sajoin" # join arbitrary channels, including private channels + "samode" # modify arbitrary channel and user modes + "snomasks" # subscribe to arbitrary server notice masks + "roleplay" # use the (deprecated) roleplay commands in any channel + ]; + }; + server-admin = { + title = "Server Admin"; + extends = "chat-moderator"; + capabilities = [ + "rehash" # rehash the server, i.e. reload the config at runtime + "accreg" # modify arbitrary account registrations + "chanreg" # modify arbitrary channel registrations + "history" # modify or delete history messages + "defcon" # use the DEFCON command (restrict server capabilities) + "massmessage" # message all users on the server + "metadata" # modify arbitrary metadata on channels and users + ]; + }; + }; + opers = { + duke = { + class = "server-admin"; + whois-line = "is the server administrator"; + password = "$2a$04$eEXmtfM76.qp3D7kJna7k.dF7xeeACwvxwxUM4.ysW5Kndk/S.drG"; + }; + }; + }; + }; + systemd.services.ergochat.serviceConfig.DynamicUser = lib.mkForce false; + systemd.services.ergochat.serviceConfig.User = "ergo"; + systemd.services.ergochat.serviceConfig.Group = "ergo"; + }; +} diff --git a/vm-homelab.nix b/vm-homelab.nix index 7fdd341..2de8bc4 100644 --- a/vm-homelab.nix +++ b/vm-homelab.nix @@ -26,6 +26,10 @@ in services.caddy = { enable = true; virtualHosts = { + "dukeceph.xyz".extraConfig = '' + root * /mnt/nfs/public + file_server browse + ''; "feed.rperce.net".extraConfig = '' reverse_proxy http://192.168.0.5:8080 ''; @@ -70,6 +74,12 @@ in "grist.rperce.net".extraConfig = '' reverse_proxy http://192.168.0.2:8484 ''; + "irc.dukeceph.xyz".extraConfig = '' + reverse_proxy 192.168.0.8 + ''; + "irc.dukeceph.xyz/webirc".extraConfig = '' + reverse_proxy 192.168.0.8:8067 + ''; }; }; From b9f585f1702879096a85b0cd412469a3c8f6878f Mon Sep 17 00:00:00 2001 From: Robert Perce Date: Thu, 12 Feb 2026 23:22:18 -0600 Subject: [PATCH 7/7] ergo, but not broken --- lxc-ergo.nix | 67 ++++++++++++++++++++++++++++---------------------- vm-homelab.nix | 7 ------ 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/lxc-ergo.nix b/lxc-ergo.nix index 6e98ca7..1b35a9a 100644 --- a/lxc-ergo.nix +++ b/lxc-ergo.nix @@ -21,7 +21,7 @@ networking.firewall.trustedInterfaces = [ "br-+" ]; networking.firewall.allowedTCPPorts = [ - 6667 + 8067 6697 443 80 @@ -45,24 +45,23 @@ virtualHosts."irc.dukeceph.xyz" = { addSSL = true; enableACME = true; - locations."/webirc" = { - proxyPass = "http://unix:/run/ergo/websocket"; - proxyWebsockets = true; - extraConfig = '' - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "Upgrade"; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_read_timeout 10m; - ''; - }; + root = "/var/www/html"; + locations."/webirc".extraConfig = '' + proxy_pass http://127.0.0.1:8067; + proxy_read_timeout 600s; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + ''; }; }; - users.groups."ergo" = {}; + users.groups."ergo" = { }; users.users."ergo" = { - group = "ergo"; - isSystemUser = true; + group = "ergo"; + isSystemUser = true; }; services.ergochat = { @@ -85,34 +84,41 @@ key = "/etc/letsencrypt/live/irc.dukeceph.xyz/privkey.pem"; }; }; + ":8067" = { + websocket = true; + }; }; + secure-nets = [ + "127.0.0.0/24" + "192.168.0.0/24" + ]; }; oper-classes = { chat-moderator = { title = "Chat Moderator"; capabilities = [ - "kill" # disconnect user sessions - "ban" # ban IPs, CIDRs, NUH masks, and suspend accounts (UBAN / DLINE / KLINE) + "kill" # disconnect user sessions + "ban" # ban IPs, CIDRs, NUH masks, and suspend accounts (UBAN / DLINE / KLINE) "nofakelag" # exempted from "fakelag" restrictions on rate of message sending - "relaymsg" # use RELAYMSG in any channel (see the `relaymsg` config block) - "vhosts" # add and remove vhosts from users - "sajoin" # join arbitrary channels, including private channels - "samode" # modify arbitrary channel and user modes - "snomasks" # subscribe to arbitrary server notice masks - "roleplay" # use the (deprecated) roleplay commands in any channel + "relaymsg" # use RELAYMSG in any channel (see the `relaymsg` config block) + "vhosts" # add and remove vhosts from users + "sajoin" # join arbitrary channels, including private channels + "samode" # modify arbitrary channel and user modes + "snomasks" # subscribe to arbitrary server notice masks + "roleplay" # use the (deprecated) roleplay commands in any channel ]; }; server-admin = { title = "Server Admin"; extends = "chat-moderator"; capabilities = [ - "rehash" # rehash the server, i.e. reload the config at runtime - "accreg" # modify arbitrary account registrations - "chanreg" # modify arbitrary channel registrations - "history" # modify or delete history messages - "defcon" # use the DEFCON command (restrict server capabilities) - "massmessage" # message all users on the server - "metadata" # modify arbitrary metadata on channels and users + "rehash" # rehash the server, i.e. reload the config at runtime + "accreg" # modify arbitrary account registrations + "chanreg" # modify arbitrary channel registrations + "history" # modify or delete history messages + "defcon" # use the DEFCON command (restrict server capabilities) + "massmessage" # message all users on the server + "metadata" # modify arbitrary metadata on channels and users ]; }; }; @@ -128,5 +134,6 @@ systemd.services.ergochat.serviceConfig.DynamicUser = lib.mkForce false; systemd.services.ergochat.serviceConfig.User = "ergo"; systemd.services.ergochat.serviceConfig.Group = "ergo"; + systemd.services.ergochat.restartIfChanged = false; }; } diff --git a/vm-homelab.nix b/vm-homelab.nix index 2de8bc4..b76e5ee 100644 --- a/vm-homelab.nix +++ b/vm-homelab.nix @@ -26,10 +26,6 @@ in services.caddy = { enable = true; virtualHosts = { - "dukeceph.xyz".extraConfig = '' - root * /mnt/nfs/public - file_server browse - ''; "feed.rperce.net".extraConfig = '' reverse_proxy http://192.168.0.5:8080 ''; @@ -77,9 +73,6 @@ in "irc.dukeceph.xyz".extraConfig = '' reverse_proxy 192.168.0.8 ''; - "irc.dukeceph.xyz/webirc".extraConfig = '' - reverse_proxy 192.168.0.8:8067 - ''; }; };