Author SHA1 Message Date
rootandGreg Hellings e6217401f9 feat(gitea): add Anubis anti-crawler proxy
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Anubis (https://anubis.techaro.lol) is a lightweight proof-of-work
challenge that protects web services from AI crawlers and scrapers.
2026-05-24 21:25:50 -05:00
Greg Hellings d97fb37f0e chore: update SSH config for home-manager updates
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Update flake.lock / update-flake-lock (push) Successful in 1m46s
Update manifest chart versions / update-manifests (push) Successful in 29s
2026-05-21 13:19:26 -05:00
Greg Hellings 75e71f9ce9 fix: get Matrix running again
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-effects Build done.
buildbot/nix-build Build done.
2026-05-20 03:27:45 -05:00
Greg Hellings 19540ea1da chore: update mariadb-operator version 2026-05-20 03:26:37 -05:00
Greg Hellings 431f78f8af fix: enable minio access for gitea backups 2026-05-19 23:48:34 -05:00
Greg Hellings 95eea6fc26 fix: enable s3 DNS aliases 2026-05-19 23:47:42 -05:00
greg 387a34ffff Merge pull request 'chore: update flake.lock 2026-05-18' (#23) from auto/update-flake-lock-20260518 into main
buildbot/nix-eval Build done. (1 warning)
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
Reviewed-on: https://src.thehellings.com/greg/nixos/pulls/23
Reviewed-by: klaatu <klaatu@thehellings.com>
2026-05-19 15:16:50 +00:00
10 changed files with 150 additions and 92 deletions
+24 -26
View File
@@ -13,25 +13,23 @@
includes = [ "config.local" ];
enableDefaultConfig = false;
matchBlocks =
settings =
let
nas = {
user = "admin";
User = "admin";
};
owned = {
user = "greg";
User = "greg";
};
in
{
inherit nas;
"*" = {
dynamicForwards = [ { port = 10240; } ];
serverAliveInterval = 60;
extraOptions = {
LogLevel = "error";
SetEnv = "TERM=xterm-256color";
};
DynamicForward = [ "10240" ];
ServerAliveInterval = 60;
LogLevel = "error";
SetEnv = { TERM = "xterm-256color"; };
};
"10.42.1.4" = lib.hm.dag.entryBefore [ "10.42.*" ] nas;
@@ -41,46 +39,46 @@
"chronicles.thehellings.lan" = lib.hm.dag.entryBefore [ "*.thehellings.lan" ] nas;
gh = {
user = "git";
hostname = "github.com";
User = "git";
Hostname = "github.com";
};
"src" = {
user = "git";
hostname = "jeremiah.shire-zebra.ts.net";
port = 32222;
User = "git";
Hostname = "jeremiah.shire-zebra.ts.net";
Port = 32222;
};
srcpub = {
user = "git";
hostname = "src.thehellings.com";
port = 2222;
User = "git";
Hostname = "src.thehellings.com";
Port = 2222;
};
ivr = {
user = "git";
hostname = "gitlab.com";
User = "git";
Hostname = "gitlab.com";
};
"ivr.thehellings.lan" = lib.hm.dag.entryBefore [ "ivr" ] {
user = "gregory.hellings";
User = "gregory.hellings";
};
"*.thehellings.lan" = owned;
"10.42.*" = owned;
"host.crosswire.org crosswire" = {
hostname = "host.crosswire.org";
user = "ghellings";
Hostname = "host.crosswire.org";
User = "ghellings";
};
fedpeople = {
hostname = "fedorapeople.org";
user = "greghellings";
Hostname = "fedorapeople.org";
User = "greghellings";
};
"src.fedoraproject.org pkgs.fedoraproject.org" = {
user = "greghellings";
User = "greghellings";
};
"127.*".extraOptions = {
"127.*" = {
PubkeyAcceptedAlgorithms = "+ssh-rsa";
HostkeyAlgorithms = "+ssh-rsa";
};
+7 -2
View File
@@ -115,10 +115,15 @@ in
"@\tIN\tSOA\t${config.networking.hostName}\tgreg@thehellings.com (1 1m 1m 1m 1m)"
"\tIN\tNS\t${config.networking.hostName}"
];
makeHost = host: "${host.name}\tIN\tA\t${host.address}";
makeHost =
host:
[ "${host.name}\tIN\tA\t${host.address}" ]
++ lib.map (a: "${a}\tIN\tA\t${host.address}") (
if builtins.hasAttr "aliases" host then host.aliases else [ ]
);
in
pkgs.writeText "${domain}" (
builtins.concatStringsSep "\n" (preamble ++ (lib.map makeHost hosts) ++ [ "" ])
builtins.concatStringsSep "\n" (preamble ++ (lib.flatten (lib.map makeHost hosts)) ++ [ "" ])
);
in
lib.mapAttrs
+53 -27
View File
@@ -1,4 +1,4 @@
{ ... }:
{ config, ... }:
let
srcDomain = "src.thehellings.com";
@@ -6,15 +6,23 @@ let
in
{
greg.proxies."${srcDomain}" = {
target = "https://gitea.shire-zebra.ts.net";
target = "http://unix:${config.services.anubis.instances.git.settings.BIND}";
ssl = true;
genAliases = false;
extraConfig = ''
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on;
#proxy_ssl_verify off;
#proxy_ssl_server_name on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Http-Version $server_protocol;
proxy_set_header User-Agent $http_user_agent;
client_max_body_size 100000m;
#proxy_set_header Host $host;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto $scheme;
#proxy_set_header X-Forwarded-Ssl on;
# Ultimate AI Block List v1.7 20250924
# https://perishablepress.com/ultimate-ai-block-list/
@@ -87,6 +95,44 @@ in
networking.firewall.allowedTCPPorts = [ sshPort ];
services = {
anubis = {
instances = {
git = {
enable = true;
settings = {
BIND = "/run/anubis/anubis-git/anubis.sock";
COOKIE_DOMAIN = "thehellings.com";
SERVE_ROBOTS_TXT = true;
TARGET = "https://gitea.shire-zebra.ts.net/";
};
};
};
};
haproxy = {
enable = true;
config = ''
global
daemon
maxconn 20
defaults
timeout connect 500s
timeout client 500s
timeout server 1h
listen gitsshd
bind *:${toString sshPort}
timeout client 1h
mode tcp
server git-isaiah isaiah.shire-zebra.ts.net:32222
server git-jeremiah jeremiah.shire-zebra.ts.net:32222
server git-zeke zeke.shire-zebra.ts.net:32222
'';
};
};
systemd.services = {
haproxy = {
after = [
@@ -98,25 +144,5 @@ in
};
};
services.haproxy = {
enable = true;
config = ''
global
daemon
maxconn 20
defaults
timeout connect 500s
timeout client 500s
timeout server 1h
listen gitsshd
bind *:${toString sshPort}
timeout client 1h
mode tcp
server git-isaiah isaiah.shire-zebra.ts.net:32222
server git-jeremiah jeremiah.shire-zebra.ts.net:32222
server git-zeke zeke.shire-zebra.ts.net:32222
'';
};
users.users.nginx.extraGroups = [ config.users.groups.anubis.name ];
}
+13 -31
View File
@@ -2,12 +2,24 @@
# them by the following commands:
# nix run nixpkgs.matrix-synapse
# register_new_matrix_user -k "B9EoPr2WV9hzwc7uL2Sx1JmvCeKDEOGCpB0uginQcQtEH4wzRtkSIdo7lltrjSQa" http://localhost:8448
{ config, lib, ... }:
{ config, ... }:
let
domain = "${config.networking.domain}";
fqdn = "matrix.${domain}";
in
{
greg.proxies."${fqdn}" = {
extraConfig = ''
error_log /var/log/nginx/debug.log debug;
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on;
'';
genAliases = false;
ssl = true;
target = "https://matrix.shire-zebra.ts.net";
};
services.nginx = {
virtualHosts = {
# Server the '.well-known' files to find the Matrix API server
@@ -44,36 +56,6 @@ in
return 200 '${builtins.toJSON client}';
'';
};
# Reverse proxy in front of the actual Matrix server
"${fqdn}" = {
enableACME = true;
forceSSL = true;
extraConfig = ''
error_log /var/log/nginx/debug.log debug;
'';
# Not the appropriate place for the chat client
locations =
(builtins.listToAttrs (
builtins.map
(
val:
lib.nameValuePair "/_${val}" {
proxyPass = "https://matrix.shire-zebra.ts.net";
}
)
[
"matrix"
"synapse"
"dendrite"
]
))
// {
"/".extraConfig = "return 404;";
};
};
};
};
-5
View File
@@ -34,10 +34,5 @@ in
ssl = true;
genAliases = false;
};
"doubles.thehellings.com" = {
target = "http://localhost:8081";
ssl = true;
genAliases = false;
};
};
}
+1
View File
@@ -15,6 +15,7 @@
(name: value: {
inherit name;
address = builtins.getAttr netAttr value;
aliases = lib.optionals (builtins.hasAttr "aliases" value) (builtins.getAttr "aliases" value);
})
(
lib.filterAttrs (
+47
View File
@@ -119,6 +119,53 @@ spec:
cpu: "100m"
memory: "2Gi"
# Anubis anti-crawler sidecar
# Anubis listens on :8080 and proxies to Gitea at http://localhost:3000
# Ingress is updated to route to the anubis port instead of http
extraContainers:
- name: anubis
image: ghcr.io/techarohq/anubis:latest
imagePullPolicy: Always
env:
- name: BIND
value: ":8080"
- name: DIFFICULTY
value: "4"
- name: METRICS_BIND
value: ":9090"
- name: POLICY_FNAME
value: "/etc/anubis/policy.yaml"
- name: SERVE_ROBOTS_TXT
value: "true"
- name: TARGET
value: "http://localhost:3000"
volumeMounts:
- name: anubis-policy
mountPath: /etc/anubis
readOnly: true
resources:
limits:
cpu: "750m"
memory: "256Mi"
requests:
cpu: "250m"
memory: "256Mi"
securityContext:
runAsUser: 1000
runAsGroup: 1000
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault
extraVolumes:
- name: anubis-policy
configMap:
name: anubis-policy
strategy:
type: RollingUpdate
rollingUpdate:
+2
View File
@@ -19,6 +19,7 @@ spec:
kind: HelmRepository
name: mariadb-operator
interval: "1h"
version: "26.3.0"
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
@@ -33,6 +34,7 @@ spec:
kind: HelmRepository
name: mariadb-operator
interval: "1h"
version: "26.3.0"
dependsOn:
- name: mariadb-operator-crds
- name: longhorn
@@ -11,6 +11,7 @@ spec:
kind: HelmRepository
name: mariadb-operator
interval: "1h"
version: "26.3.0"
dependsOn:
- name: mariadb-operator-crds
- name: mariadb-operator
+2 -1
View File
@@ -13,7 +13,8 @@
"ip": "10.42.1.4",
"pubkey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEBecZUva9OnZuXLaBun6/1ITo5f9p0YMLPD+q0egLRS",
"external": true,
"ts": "100.119.228.115"
"ts": "100.119.228.115",
"aliases": [ "s3" ]
},
"exodus": {
"ip": null,