Il y a quelques temps, j’avais coupé toute lecture possible de mon instance de Forgejo, pour éviter de me faire spammer par tous ces bots idiots ne viennent pomper mes idées, textes et bêtises :

Incoming Anubis
Anubis se présente comme un “proxy filtrant” ; on le place derrière le reverse proxy, mais devant l’application :
- Nginx gère toujours les connexions TLS, ainsi que le reverse proxy,
- Le trafic est intercepté par Anubis, avec un challenge à compléter par le navigateur,
- Avant d’être retransmis vers l’application upstream.
Courtesy of https://anubis.techaro.lol/docs/admin/environments/nginx
Vu que je ne maîtrise Docker que quand je ne dois pas y toucher (et que la doc est un chouia succinte à ce niveau), je suis passé par un paquet natif (https://github.com/TecharoHQ/anubis/releases), suivi d’un apt install anubis_1.27.0_amd64.deb.
La configuration miniale pour Forgejo se place dans un fichier /etc/anubis/forgejo.env, pour pointer vers l’application upstream - soit sur socket, soit sur un port http - en fonction de votre configuration.
Bot policies
“Bot policies let you customize the rules that Anubis uses to allow, deny, or challenge incoming requests.”.
On place le contenu ci-dessous dans un fichier /etc/anubis/forgejo.botPolicies.yaml - que l’on prendra bien soin de référencer dans le fichier d’environnement :
bots:
- name: cloudflare-workers
headers_regex:
CF-Worker: .*
action: DENY
- name: well-known
path_regex: ^/.well-known/.*$
action: ALLOW
- name: favicon
path_regex: ^/favicon.ico$
action: ALLOW
- name: robots-txt
path_regex: ^/robots.txt$
action: ALLOW
- name: generic-browser
user_agent_regex: Mozilla
action: CHALLENGE
See : https://anubis.techaro.lol/docs/admin/policies/
On démarre avec systemctl enable --now anubis@forgejo.service.
Anubis nécessitent deux ports : le premier pour les métriques et s’assurer du healthcheck ; le second pour le proxy en lui-même.
On peut interroger localhost sur ce port pour s’assurer que les métriques sont bien remontées : curl http://localhost:9090/metrics, et on peut passer à la configuration du reverse proxy.
Nginx
Ma configuration précédente était spécifique à Forgejo, avec un upstream sur le port 3000 et un service systemd pour maintenir tout le monde en vie :
root@dagger:~# cat /etc/nginx/sites-available/sources.grimbox.be
server {
listen 80;
server_name sources.grimbox.be;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl http2;
ssl_protocols TLSv1.1 TLSv1.2;
root /var/www/sources.grimbox.be/;
server_name sources.grimbox.be;
ssl_certificate /etc/letsencrypt/live/grimbox.be/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grimbox.be/privkey.pem;
index index.html index.htm index.nginx-debian.html index.php;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header Content-Security-Policy "frame-ancestors 'none'";
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
expires -1;
location / {
proxy_pass http://localhost:3000/;
client_max_body_size 100M;
}
location ~ /.well-known {
allow all;
}
}
… que l’on remplace à présent en :
server {
listen 80;
server_name sources.grimbox.be;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl http2;
ssl_protocols TLSv1.1 TLSv1.2;
root /var/www/sources.grimbox.be/;
server_name sources.grimbox.be;
ssl_certificate /etc/letsencrypt/live/grimbox.be/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grimbox.be/privkey.pem;
location / {
proxy_pass http://localhost:8923;
proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Http-Version $server_protocol;
client_max_body_size 512M;
}
location ~ /.well-known {
allow all;
}
}
Grosso modo, on remplace simplement le passthrough d’Nginx vers l’app upstream, en transférant d’abord vers le service Anubis. Pour chaque service, il suffit de définir un nouveau service Anubis, le démarrer via systemctl et rediriger Nginx vers ce port local.