Ещё год назад я обещал Тайсу дать инструкцию по Анубису, наконец дошли руки. Вся документация годичной свежести и для Дебиана-11, но думаю при небольших поправках вы
вместе с ИИ запустите эту штуку и у себя.

За прошедший год, система прекрасно себя показала и на Суппорте, и на моём форуме, снизив нагрузку раз в 7 и не убив ни одного полезного поситителя или поискового бота.
Anubis + Docker + Nginx: развёртывание перед большим форумом
Что такое Anubis и зачем он нужен большому форуму
Anubis — промежуточный защитный слой перед сайтом, предназначенный прежде всего для отсечения нежелательного автоматизированного трафика: агрессивных сканеров, парсеров, AI-краулеров и других ботов.
Без Anubis каждый такой запрос сразу доходит до Nginx backend, PHP-FPM, vBulletin и базы данных. Для большого форума это особенно неприятно: у него много тем, архивных страниц, профилей, вложений и других URL, которые роботы могут обходить массово и значительно быстрее обычного посетителя.
Anubis проверяет клиента до передачи запроса форуму. Обычный браузер при необходимости проходит challenge и продолжает работу, а значительная часть автоматического трафика отсеивается до тяжёлого backend.
Практический смысл для большого форума:
- меньше бесполезных обращений к PHP;
- меньше SQL-запросов от краулеров;
- меньше одновременно занятых PHP-FPM процессов;
- снижение CPU-нагрузки и количества фонового мусорного трафика;
- возможность отдельно управлять известными поисковыми, социальными, AI- и прочими ботами;
- защита ставится перед существующим форумом без переделки самого vBulletin.
Anubis в этой схеме не заменяет firewall, CrowdSec, WAF или защиту от объёмного DDoS. Его задача — уменьшить количество нежелательных автоматических HTTP-запросов, которые доходят до форумного backend.
Итоговая схема
Используется один экземпляр Anubis на том же сервере, где находятся Nginx и сайт.
Code:
Посетитель
|
| HTTPS :443
v
Nginx FRONT
|
| HTTP 127.0.0.1:8001
v
Anubis
|
| HTTPS 127.0.0.1:9443
v
Nginx BACKEND
|
| FastCGI
v
PHP-FPM / vBulletin
Nginx FRONT остаётся единственной публичной точкой входа. Anubis слушает только локальный порт 8001. Сам сайт переносится во второй server-блок Nginx, который слушает локальный HTTPS-порт 9443.
Между frontend-Nginx и Anubis используется HTTP:
Code:
http://127.0.0.1:8001
Между Anubis и backend-Nginx используется HTTPS:
Code:
https://127.0.0.1:9443
Один и тот же сертификат сайта можно использовать и на публичном frontend, и на локальном backend.
Почему используется host network
Anubis запускается в Docker, но backend-Nginx находится на самом хосте.
В обычной bridge-сети Docker адрес 127.0.0.1 внутри контейнера обозначает сам контейнер, а не хост. Поэтому обращение Anubis к 127.0.0.1:9443 в bridge-режиме не попадёт в локальный Nginx хоста.
Рабочее решение:
В этом режиме Anubis использует сетевой стек хоста и может обращаться непосредственно к:
Code:
https://127.0.0.1:9443
При host network для Anubis не нужны ports, networks и extra_hosts.
Сам Anubis привязывается только к:
поэтому его порт не публикуется наружу.
Как сохраняется реальный IP посетителя
Поскольку между посетителем и PHP находятся два промежуточных слоя, backend физически получает соединение от localhost.
Frontend передаёт реальный адрес клиента:
Code:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Backend доверяет локальному прокси и восстанавливает адрес:
Code:
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
После этого переменная $remote_addr на backend снова содержит IP посетителя.
В FastCGI он передаётся PHP:
Code:
fastcgi_param REMOTE_ADDR $remote_addr;
Это позволяет vBulletin видеть реальные IP посетителей вместо 127.0.0.1.
Почему backend работает на порту 9443
Публичный Nginx уже занимает порт 443. Поэтому внутренний server-блок того же сайта слушает отдельный локальный TLS-порт:
Code:
listen 127.0.0.1:9443 ssl http2;
Порт 9443 наружу не публикуется. Он нужен только для связи Anubis с backend и для аварийного прямого обхода Anubis через frontend-Nginx.
Чтобы внутренний порт 9443 не попадал в абсолютные redirect URL, frontend сообщает внешний протокол, hostname и порт:
Code:
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
На backend используется:
Code:
port_in_redirect off;
Для PHP задаются публичные параметры запроса:
Code:
fastcgi_param HTTPS on;
fastcgi_param SERVER_PORT 443;
fastcgi_param HTTP_X_FORWARDED_PROTO https;
fastcgi_param HTTP_X_FORWARDED_HOST $host;
fastcgi_param HTTP_X_FORWARDED_PORT 443;
Полная установка
Скачать исходники Anubis
Используется upstream TecharoHQ:
Code:
cd /home/true
git clone https://github.com/TecharoHQ/anubis.git
cd anubis
Исполняемый Go-пакет находится в:
Корень репозитория собирать как исполняемый файл нельзя.
Правильная команда сборки Go-бинарника:
Code:
go build -o anubis ./cmd/anubis
Файлы рабочего комплекта
В корне проекта используются четыре основных файла:
Code:
/home/true/anubis/
├── Dockerfile
├── docker-compose.yml
├── entrypoint.sh
├── botPolicies.yaml
└── исходники Anubis
Dockerfile собирает собственный образ techaro-anubis из исходников.
entrypoint.sh является точкой входа контейнера и организует запись вывода Anubis в файл лога.
botPolicies.yaml содержит правила обработки ботов и пороги challenge.
docker-compose.yml описывает рабочий запуск контейнера: сеть, адрес backend, policy-файл, логирование и автоматический перезапуск.
Dockerfile
Сборка выполняется в три стадии:
- Node.js/Bullseye — frontend и web-ресурсы;
- Go 1.24/Bullseye — бинарник Anubis;
- Debian Bullseye Slim — конечный runtime.
Использование Bullseye и на стадии Go-сборки, и в runtime важно для совместимости с Debian 11 и его glibc.
Актуальный Dockerfile:
Code:
# 1) фронтенд
FROM node:20-bullseye AS nodebuilder
WORKDIR /app
COPY package*.json ./
RUN npm ci --no-audit --no-fund
RUN npm install -g esbuild postcss postcss-cli
RUN apt-get update && apt-get install -y --no-install-recommends zstd brotli \
&& rm -rf /var/lib/apt/lists/*
COPY . .
ENV PATH="/app/node_modules/.bin:${PATH}"
RUN cd web && ./build.sh
RUN cd xess && ./build.sh
# 2) Go build — ВАЖНО: golang:1.24-bullseye
FROM golang:1.24-bullseye AS gobuilder
WORKDIR /app
COPY . .
COPY --from=nodebuilder /app/web /app/web
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go mod download && \
go build -trimpath -o /app/anubis ./cmd/anubis
# 3) runtime — Debian 11
FROM debian:bullseye-slim
WORKDIR /app
COPY --from=gobuilder /app/anubis /app/anubis
COPY --from=nodebuilder /app/web/static /app/web/static
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/anubis /app/entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]
Frontend-сборке требуются esbuild, postcss, postcss-cli, zstd и brotli.
Бинарник обязательно собирается из ./cmd/anubis:
Code:
go build -trimpath -o /app/anubis ./cmd/anubis
entrypoint.sh
Актуальный файл:
Code:
#!/bin/bash
set -e
LOGFILE="/logs/anubis.log"
mkdir -p /logs
touch "$LOGFILE"
chmod 644 "$LOGFILE"
exec /app/anubis \
-bind 0.0.0.0:8001 \
-target https://127.0.0.1 \
-target-insecure-skip-verify \
"$@" 2>&1 | tee -a "$LOGFILE"
Файл создаёт:
и через tee одновременно сохраняет вывод Anubis в файловый лог.
Каталог /logs монтируется с хоста, поэтому итоговый лог доступен как:
Code:
/var/log/anubis/anubis.log
Параметры из command в docker-compose.yml передаются в entrypoint через "$@". Именно Compose задаёт актуальные bind, target и policy для конкретной рабочей схемы.
botPolicies.yaml
Файл содержит пользовательскую политику обработки ботов.
В секции bots перечислены известные User-Agent. В актуальной политике явно разрешены группы Google, Yandex, CIS-ботов, AI-ботов, социальных и ряда международных ботов.
Дополнительное правило fake-bot-weight увеличивает вес на 20 для User-Agent, содержащих bot, crawler или spider.
Пороговая логика:
- вес меньше 0 — ALLOW;
- вес от 0 до 9 — CHALLENGE metarefresh, difficulty 1;
- вес от 10 до 19 — CHALLENGE fast, difficulty 2;
- вес 20 и выше — CHALLENGE fast, difficulty 4.
Актуальный файл:
Code:
bots:
- name: google-bots
user_agent_regex: "(?i)(Googlebot|Google-Extended|GoogleOther|Google Web Preview|Google-InspectionTool|Google-Read-Aloud|Google-Proxy|AdsBot-Google|Google Web Light|googlezip)"
action: ALLOW
- name: yandex-bots
user_agent_regex: "(?i)(YandexBot|YaK|YandexImages|YandexDirect|YandexMetrika)"
action: ALLOW
- name: cis-bots
user_agent_regex: "(?i)(Mail\\.RU_Bot|StackRambler|SputnikBot|Coccocbot|MegaIndex|MegaIndex\\.ru|LinkpadBot|SapeBot|Sape_Client)"
action: ALLOW
- name: ai-bots
user_agent_regex: "(?i)(GPTBot|ClaudeBot|Bytespider)"
action: ALLOW
- name: social-bots
user_agent_regex: "(?i)(facebot|facebookexternalhit|Twitterbot|Pinterestbot)"
action: ALLOW
- name: worldwide-bots
user_agent_regex: "(?i)(Baiduspider|AhrefsBot|MJ12bot|SemrushBot|DotBot|PetalBot|NigmaBot|Yeti|DuckDuckBot|Sogou|Sogou web spider|CCBot|BLEXBot|MojeekBot|SeznamBot|Exabot|archive\\.org_bot|InternetArchive|AspiegelBot|Amazonbot|Trendictionbot|Seekport Crawler|Screaming Frog SEO Spider|ZoominfoBot)"
action: ALLOW
- name: fake-bot-weight
action: WEIGH
expression: 'userAgent.contains("bot") || userAgent.contains("crawler") || userAgent.contains("spider")'
weight:
adjust: 20
thresholds:
- name: allow-clean
expression: weight < 0
action: ALLOW
- name: challenge-suspicious
expression:
all:
- weight >= 0
- weight < 10
action: CHALLENGE
challenge:
algorithm: metarefresh
difficulty: 1
report_as: 1
- name: moderate
expression:
all:
- weight >= 10
- weight < 20
action: CHALLENGE
challenge:
algorithm: fast
difficulty: 2
report_as: 2
- name: extreme
expression: weight >= 20
action: CHALLENGE
challenge:
algorithm: fast
difficulty: 4
report_as: 4
Файл монтируется в контейнер как:
Code:
/app/botPolicies.yaml
docker-compose.yml
Актуальный Compose:
Code:
version: '3.8'
services:
anubis:
image: techaro-anubis
container_name: anubis
restart: unless-stopped
network_mode: host # ← КЛЮЧЕВОЕ
command: >
-bind 127.0.0.1:8001
-target https://127.0.0.1:9443
-target-insecure-skip-verify
-policy-fname /app/botPolicies.yaml
-xff-strip-private=false
volumes:
- /var/log/anubis:/logs
- ./botPolicies.yaml:/app/botPolicies.yaml
environment:
TZ: Europe/Vilnius
# В ЭТОМ РЕЖИМЕ: никаких ports:/networks:/extra_hosts не нужно
Основные параметры:
- image: techaro-anubis — наш собранный образ;
- restart: unless-stopped — автоматический запуск после рестарта Docker/сервера;
- network_mode: host — использование сетевого стека хоста;
- -bind 127.0.0.1:8001 — локальный listener Anubis;
- -target https://127.0.0.1:9443 — локальный backend-Nginx;
- -target-insecure-skip-verify — отключение проверки сертификата внутреннего backend;
- -policy-fname — подключение botPolicies.yaml;
- -xff-strip-private=false — сохранение переданной цепочки X-Forwarded-For;
- /var/log/anubis:/logs — файловый лог на хосте.
Сборка образа
Из корня проекта:
Code:
docker build -t techaro-anubis .
Проверка:
Code:
docker images | grep techaro-anubis
Запуск контейнера
Code:
docker compose up -d
Проверка:
Логи Docker:
Code:
docker logs -f anubis
Файловый лог:
Code:
tail -f /var/log/anubis/anubis.log
Проверка локального listener:
Code:
curl -I http://127.0.0.1:8001/
Перенос на другую машину
На новую машину переносится рабочий каталог проекта с исходниками и четырьмя основными файлами:
Code:
Dockerfile
docker-compose.yml
entrypoint.sh
botPolicies.yaml
На новой машине:
Code:
cd /path/to/anubis
docker build -t techaro-anubis .
docker compose up -d
Готовый image переносить необязательно: его можно пересобрать из тех же исходников.
Работа на машине с ограниченными CPU и RAM
Сборка Anubis заметно тяжелее его дальнейшей работы.
Основную нагрузку при build создают Node.js, frontend build, Go build и распаковка слоёв Docker.
Перед сборкой полезно проверить:
Code:
free -h
df -h
docker system df
Базовые образы можно скачать заранее:
Code:
docker pull node:20-bullseye
docker pull golang:1.24-bullseye
docker pull debian:bullseye-slim
Затем выполняется обычная сборка:
Code:
docker build -t techaro-anubis .
Настройка Nginx
Общий принцип
Старый единственный HTTPS server-блок сайта разделяется на frontend и backend, но оба остаются в одном конфигурационном файле сайта.
Code:
443 публичный -> Anubis 127.0.0.1:8001
9443 локальный -> оригинальный сайт/PHP
80 -> HTTPS redirect
Все прежние location, rewrite, PHP-FPM, gzip и защитные правила сайта переносятся в backend-блок.
Frontend занимается только TLS, передачей служебных заголовков и проксированием в Anubis.
Актуальный конфиг vbsupport.ru
Code:
log_format postdata $request_body;
#############################
# 1) FRONT: публичный 443 → Anubis:8001 (HTTP)
#############################
server {
if ($host = www.vbsupport.ru) {
return 301 https://vbsupport.ru$request_uri;
}
listen 443 ssl http2;
server_name vbsupport.ru www.vbsupport.ru;
ssl_certificate /etc/letsencrypt/live/vbsupport.ru/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/vbsupport.ru/privkey.pem; # managed by Certbot
# Можно логировать фронт отдельно (по желанию):
access_log /var/log/nginx/vbsupport.ru.front.access.log combined;
error_log /var/log/nginx/vbsupport.ru.front.error.log;
# Прокси строго по HTTP к Anubis на 127.0.0.1:8001
location / {
# ====== ВКЛ/ВЫКЛ АНУБИС ЗДЕСЬ ======
# РЕЖИМ "через Anubis":
proxy_pass http://127.0.0.1:8001;
# РЕЖИМ "напрямую в бэк" (обход Anubis):
# proxy_pass https://127.0.0.1:9443;
# ===================================
proxy_http_version 1.1;
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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
proxy_buffering off;
proxy_request_buffering off;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
client_max_body_size 256M;
}
#############################
# 2) BACKEND: локальный HTTPS для Anubis (127.0.0.1:9443)
#############################
server {
listen 127.0.0.1:9443 ssl http2;
server_name vbsupport.ru www.vbsupport.ru;
ssl_certificate /etc/letsencrypt/live/vbsupport.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vbsupport.ru/privkey.pem;
root /var/www/vbsupport.ru/;
index index.html index.htm index.php index.cgi index.pl index.xhtml;
client_max_body_size 256M;
# ВОССТАНОВЛЯЕМ РЕАЛЬНЫЙ IP от фронта/анубиса
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
port_in_redirect off; # nginx не будет подставлять порт в собственные редиректы
error_log /var/log/nginx/vbsupport.ru.error.log;
access_log /var/log/nginx/vbsupport.ru.access.log combined;
access_log /var/log/nginx/vbsupport.ru.data.log postdata;
gzip on;
gzip_types application/javascript text/css text/html application/json image/svg+xml;
gzip_static on;
# Защита скрытых файлов
location ~ /\. { deny all; }
#hacked 2026-15-18
location ^~ /forum/imagehosting/ {
autoindex off;
if ($request_method !~ ^(GET|HEAD)$) {
return 405;
}
if ($uri ~ (^|/)\.) {
return 403;
}
if ($uri !~* \.(jpg|jpeg|png|gif|webp|avif|ico)$) {
return 403;
}
try_files $uri =404;
}
location ^~ /forum/albumimages/ {
autoindex off;
if ($request_method !~ ^(GET|HEAD)$) {
return 405;
}
if ($uri ~ (^|/)\.) {
return 403;
}
if ($uri !~* \.(jpg|jpeg|png|gif|webp|avif|ico)$) {
return 403;
}
try_files $uri =404;
}
location ^~ /forum/downlimages/ {
autoindex off;
if ($request_method !~ ^(GET|HEAD)$) {
return 405;
}
if ($uri ~ (^|/)\.) {
return 403;
}
if ($uri !~* \.(jpg|jpeg|png|gif|webp|avif|ico|css|woff2|woff|ttf)$) {
return 403;
}
try_files $uri =404;
}
#hacked 2026-15-18
# Favicon / robots
location = /favicon.ico {
log_not_found off;
access_log off;
expires max;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location @php {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/run/php/php5.6-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Чтобы приложение видело реальный IP
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_intercept_errors on;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param HTTPS on;
fastcgi_param SERVER_PORT 443;
fastcgi_param HTTP_X_FORWARDED_PROTO https;
fastcgi_param HTTP_X_FORWARDED_HOST $host;
fastcgi_param HTTP_X_FORWARDED_PORT 443;
}
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @php;
}
location /archive/ {
if ($request_filename ~ "\.html$") {
rewrite ^/(.*)/f-([0-9]+).html$ /$1?f-$2 last;
rewrite ^/(.*)/f-([0-9]+)-p-([0-9]+).html$ /$1?f-$2-p-$3 last;
rewrite ^/(.*)/t-([0-9]+).html$ /$1?t-$2 last;
rewrite ^/(.*)/t-([0-9]+)-p-([0-9]+).html$ /$1?t-$2-p-$3 last;
break;
}
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @php;
}
}
# /react/ как было
location /react/ {
try_files $uri $uri/ /react/index.php;
}
location / {
try_files $uri $uri/ /index.php;
}
}
#############################
# 3) HTTP → HTTPS + ACME
#############################
server {
if ($host = vbsupport.ru) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name vbsupport.ru www.vbsupport.ru;
# Если certbot кладёт файлы в root сайта:
location /.well-known/acme-challenge/ {
root /var/www/vbsupport.ru/;
try_files $uri =404;
}
return 301 https://$host$request_uri;
}
Быстрое отключение Anubis
В frontend уже оставлены две строки proxy_pass.
Через Anubis:
Code:
proxy_pass http://127.0.0.1:8001;
# proxy_pass https://127.0.0.1:9443;
Напрямую в backend:
Code:
# proxy_pass http://127.0.0.1:8001;
proxy_pass https://127.0.0.1:9443;
После переключения:
Code:
nginx -t && systemctl reload nginx
Docker Compose менять не нужно, контейнер останавливать необязательно.
Проверка всей цепочки
Сначала backend:
Code:
curl -Ik https://127.0.0.1:9443/
Затем Anubis:
Code:
curl -I http://127.0.0.1:8001/
Состояние контейнера:
Логи:
Code:
docker logs --tail=100 anubis
tail -f /var/log/anubis/anubis.log
Nginx:
Применение конфига:
Code:
systemctl reload nginx
Полный публичный путь:
Code:
curl -I https://vbsupport.ru/
Грабли и известные проблемы
Бинарник Anubis оказался ar archive
Причина — попытка собрать корневой Go-пакет:
Code:
go build -o /app/anubis .
Правильно:
Code:
go build -trimpath -o /app/anubis ./cmd/anubis
unknown block type: tool
Причина — слишком старый Go.
Go 1.22 для актуального исходного дерева Anubis не подходит.
Рабочий builder:
Code:
FROM golang:1.24-bullseye AS gobuilder
Не находятся esbuild, postcss, zstd или brotli
Frontend build требует:
Code:
esbuild
postcss
postcss-cli
zstd
brotli
Они устанавливаются в nodebuilder Dockerfile.
GLIBC_2.32 или GLIBC_2.34 not found
Причина — бинарник собран в более новом userspace, чем Debian 11 runtime.
Рабочая пара:
Code:
FROM golang:1.24-bullseye AS gobuilder
FROM debian:bullseye-slim
502 Bad Gateway
Проверять цепочку по частям:
Code:
curl -Ik https://127.0.0.1:9443/
curl -I http://127.0.0.1:8001/
docker logs --tail=100 anubis
При нашей схеме у контейнера должен быть:
Docker падает при создании bridge-сети
Наблюдавшаяся ошибка:
Code:
Failed to Setup IP tables
No chain/target/match by that name
В принятой схеме bridge для Anubis не нужен. Используется host network.
После изменения сети Anubis перестал видеть backend
После изменения маршрутов, bridge-интерфейсов или firewall Docker может продолжать использовать старое сетевое состояние.
Рабочее действие:
Code:
systemctl restart docker
SSL_do_handshake(): wrong version number
Frontend ошибочно обращается к HTTP-listener Anubis по HTTPS.
Неправильно:
Code:
proxy_pass https://127.0.0.1:8001;
Правильно:
Code:
proxy_pass http://127.0.0.1:8001;
Anubis в backend, наоборот, ходит по HTTPS:
Code:
https://127.0.0.1:9443
Все посетители имеют IP 127.0.0.1
На backend должны быть:
Code:
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
В FastCGI:
Code:
fastcgi_param REMOTE_ADDR $remote_addr;
Redirect на https://vbsupport.ru:9443/
Frontend:
Code:
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
Backend:
Code:
port_in_redirect off;
FastCGI:
Code:
fastcgi_param HTTPS on;
fastcgi_param SERVER_PORT 443;
fastcgi_param HTTP_X_FORWARDED_PROTO https;
fastcgi_param HTTP_X_FORWARDED_HOST $host;
fastcgi_param HTTP_X_FORWARDED_PORT 443;
main.mjs приходит как text/plain
Сначала нужно проверить HTTP-код самого ресурса.
В нашем случае причиной MIME-ошибки был неправильный путь и ответ 404, а не необходимость вручную менять MIME-типы Nginx.
Краткая памятка
Запуск:
Code:
docker compose up -d
Логи:
Code:
docker logs -f anubis
tail -f /var/log/anubis/anubis.log
Проверка backend:
Code:
curl -Ik https://127.0.0.1:9443/
Проверка Anubis:
Code:
curl -I http://127.0.0.1:8001/
Проверка и применение Nginx:
Code:
nginx -t && systemctl reload nginx
После существенных изменений сети:
Code:
systemctl restart docker
Для временного обхода Anubis достаточно переключить активную строку proxy_pass во frontend-блоке Nginx.