форум vBSupport.ru > vBSupport.ru > Гурушник > True
Register Меню vBsupport Изображения Files Manager О рекламе Today's Posts Search
  • Родная гавань
  • Блок РКН снят
  • Premoderation
  • For English speaking users
  • Каталог Фрилансеров
  • If you want to buy some product or script
  • Администраторам
VBsupport перешел с домена .ORG на родной .RU Ура! Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже:
Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
 
 
 
 
True
Администратор
 
True's Avatar
Default Anubis (защита сайтов от ботов)
6

Ещё год назад я обещал Тайсу дать инструкцию по Анубису, наконец дошли руки. Вся документация годичной свежести и для Дебиана-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 хоста.

Рабочее решение:

Code:
network_mode: host
В этом режиме Anubis использует сетевой стек хоста и может обращаться непосредственно к:

Code:
https://127.0.0.1:9443
При host network для Anubis не нужны ports, networks и extra_hosts.

Сам Anubis привязывается только к:

Code:
127.0.0.1:8001
поэтому его порт не публикуется наружу.

Как сохраняется реальный 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-пакет находится в:

Code:
./cmd/anubis
Корень репозитория собирать как исполняемый файл нельзя.

Правильная команда сборки 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"
Файл создаёт:

Code:
/logs/anubis.log
и через 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
Проверка:

Code:
docker ps
Логи 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 ps
Логи:

Code:
docker logs --tail=100 anubis
tail -f /var/log/anubis/anubis.log
Nginx:

Code:
nginx -t
Применение конфига:

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
При нашей схеме у контейнера должен быть:

Code:
network_mode: host
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.
Attached Files
File Type: zip anubs_files.zip (2.2 KB, 1 views)
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 04:28 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.