Skip to content

relay deploy ломается на минимальной Debian: на реле нет nc, на экзите дёргается sudo под root #77

Description

@Dev-cmyser

What happened?

Пока настраивал реле на рф серв нашел два бага

Два бага meridian'а:

  1. provision/relay.py:26 — в _RELAY_PACKAGES нет netcat-openbsd. VerifyRelay дёргает nc -z → 127 → ложное "cannot reach exit". Фикс: добавить
    netcat-openbsd в список.
  2. ssh.py:212-216 — в local_mode команды оборачиваются в sudo -n bash -c даже когда мы root, если use_sudo or needs_sudo. На минимальном Debian
    (где meridian relay deploy бежит из-под root, sudo не установлен) → FileNotFoundError: 'sudo'. Фикс: при os.geteuid() == 0 пропускать
    sudo-обёртку.

What happened? (body):

meridian relay deploy падает в двух независимых местах на минимальной Debian. Оба бага воспроизводятся на свежеподнятых exit + relay.
Воркэраунды — однострочники, корневые причины похожи на простые недосмотры.

Баг 1: VerifyRelay ложно фейлится, когда на реле нет nc

Симптом:

✗ Verify relay connectivity (relay cannot reach exit X.X.X.X:443. Check: ...)

Причина: src/meridian/provision/relay.py:26

_RELAY_PACKAGES = ["curl", "wget", "ufw", "ca-certificates"]

Netcat в список не включён. VerifyRelay в src/meridian/provision/relay.py:336 зовёт nc -z -w 5 ..., который возвращает 127 ("command not
found") когда nc отсутствует — meridian рапортует это как фейл коннективити. На самом деле сеть в порядке (проверено через bash -c 'exec 3<>/dev/tcp/...').

InstallPackages отчитывается "all packages present", потому что проверяет только 4 пакета из списка.

Фикс: добавить netcat-openbsd в _RELAY_PACKAGES.

Баг 2: в local-mode команды оборачиваются в sudo даже когда я root → крашится на системах без sudo

Симптом (после воркэраунда Баг 1):

FileNotFoundError: [Errno 2] No such file or directory: 'sudo'

Трейс упирается в commands/relay.py:202 (_deploy_relay_nginx) → ssh.py:218subprocess.run(["sudo", "-n", ...]).

Причина: src/meridian/ssh.py:210-216

use_sudo = sudo if sudo is not None else (self.user != "root")
if self.local_mode:
    if self.needs_sudo or use_sudo:
        cmd = ["sudo", "-n", "bash", "-c", command]

Запускаю meridian relay deploy прямо на экзите под root: local_mode=True (детектится по /etc/meridian/proxy.yml), но self.user для
exit-соединения почему-то не "root" (берётся из registry) → use_sudo=True → meridian локально дёргает sudo. На минимальной Debian, где root
— единственный логин и sudo не ставится никогда, это хард-крашит деплой.

Фикс: в local-mode при os.geteuid() == 0 пропускать sudo-обёртку — привилегии уже есть.

Окружение

  • Meridian v3.17.2 (uv tool install meridian-vpn)
  • Exit: Debian 12 (6.1.0-44-amd64), запуск под root, sudo не установлен, nginx уже на :443 как SNI-роутер (needs_web_server=True, Reality на
    127.0.0.1:<derived port>)
  • Relay: Debian 12, deploy user user с passwordless sudo, netcat не установлен

Воркэраунд

ssh user@<relay>  'sudo apt-get install -y netcat-openbsd'
ssh root@<exit>   'apt-get install -y sudo'
meridian relay deploy <relay> --exit <exit> --user user -y

После обоих фиксов деплой проходит чисто от начала до конца.

Setup mode

Standalone (no domain)

When does it fail?

During SSH connection

Doctor output


Error output


Server OS

No response

Local OS

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions