Всем привет.

В статье описана установка клиента beszel-agent_linux для роутера с openwrt на борту. Установка сервера beszel за рамками этой статьи, предполагается что он у вас уже установлен и работает.

Для тех кто не знал beszel - минималистичная система мониторинга, состоит из сервера и агентов. Архитектурно это выглядит как ssh сервер (агент) на кастомном порту, к которому по ключу ходит сервер и выполняет команды. Агенты (впрочем как и сервер) могут быть запущены в докере, интерфейс предлагает для этого готовые команды, обе две и докер и обычная инсталляция (по классике, как мы все "любим" sudo curl https://.. | bash).
Полностью документация доступна на официальном сайте, не будем ее дублировать.

Из приятного, прямо с консоли сервера нам доступна команда для выполнения на конечном устройстве

Которая выглядит примерно так

curl -sL https://get.beszel.dev -o /tmp/install-agent.sh && chmod +x /tmp/install-agent.sh && /tmp/install-agent.sh -p 45876 -k "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB......" -t "12d4b6-c274df1-131fdc-879c54f6" -url "http://192.168.1.XX:8090"

И ее даже можно ввести в консоли openwrt, предварительно поставив curl.

Но счастье от этого не наступит, по следующим причинам:

  • ключ -t устарел и агент будет тупо ругатся на него


    Thu Dec 11 20:32:13 2025 daemon.info beszel-agent[21427]: Usage: /usr/bin/beszel-agent [command] [flags]
    Thu Dec 11 20:32:13 2025
    daemon.info beszel-agent[21427]:
    Thu Dec 11 20:32:13 2025
    daemon.info beszel-agent[21427]: Commands:
    Thu Dec 11 20:32:13 2025
    daemon.info beszel-agent[21427]: health Check if the agent is running
    Thu Dec 11 20:32:13 2025
    daemon.info beszel-agent[21427]: update Update to the latest version
    Thu Dec 11 20:32:13 2025
    daemon.info beszel-agent[21427]:
    Thu Dec 11 20:32:13 2025
    daemon.info beszel-agent[21427]: Flags:
    Thu Dec 11 20:32:13 2025 daemon.err beszel-agent[21427]: -c, --china-mirrors Use mirror for update (
    gh.beszel.dev) instead of GitHub
    Thu Dec 11 20:32:13 2025 daemon.err beszel-agent[21427]: -h, --help Show this help message
    Thu Dec 11 20:32:13 2025 daemon.err beszel-agent[21427]: -k, --key string Public key(s) for SSH authentication
    Thu Dec 11 20:32:13 2025 daemon.err beszel-agent[21427]: -l, --listen string Address or port to listen on
    Thu Dec 11 20:32:13 2025 daemon.err beszel-agent[21427]: unknown shorthand flag: 't' in -t

  • агент запустится на всех интерфейсах, в том числе на внешнем, что нам конечно же, не надо

  • дальше нас ждет подстава с непривелигерованным пользователем, в инит скрипте видим вот такую прекрасную вещь
    procd_set_param user beszel

    и да, в openwrt своя система инициализации, кто не помнит, procd.

    Побороть, чтобы агент запустился в непривелигированном режиме просто не удалось. Даже исследование с strace потерпело фиаско, была пара-тройка подозрительных мест, но непонятно что с ними делать

    [pid 23941] statx(AT_FDCWD, "/tmp/.uci/system", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, STATX_BASIC_STATS, 0x7fd5f8b8) = -1 ENOENT (No such file or directory)
    [pid 23941] statx(AT_FDCWD, "/tmp/.uci/system", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, STATX_BASIC_STATS, 0x7fd5f8b8) = -1 ENOENT (No such file or directory)

    statx(AT_FDCWD, "/usr/sbin/service_data", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, STATX_BASIC_STATS, 0x7fc2ab78) = -1 ENOENT (No such file or directory)
    statx(AT_FDCWD, "/usr/bin/service_data", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, STATX_BASIC_STATS, 0x7fc2ab78) = -1 ENOENT (No such file or directory)
    statx(AT_FDCWD, "/sbin/service_data", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, STATX_BASIC_STATS, 0x7fc2ab78) = -1 ENOENT (No such file or directory)
    statx(AT_FDCWD, "/bin/service_data", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT, STATX_BASIC_STATS, 0x7fc2ab78) = -1 ENOENT (No such file or directory)
    ioctl(1, TIOCGWINSZ, 0x7fc2ace8) = -1 ENOTTY (Not a tty)
    writev(1, [{iov_base="service_data", iov_len=12}, {iov_base=": not found\n", iov_len=12}], 2) = 24

    [pid 23936] readlink("/etc/init.d/beszel-agent", 0x77d3abd0, 80) = -1 EINVAL (Invalid argument)

В итоге, после редактирования, инит-скрипт стал выглядеть так

cat /etc/init.d/beszel-agent
#!/bin/sh /etc/rc.common

USE_PROCD=1
START=99

start_service() {
    procd_open_instance
    procd_set_param command /opt/beszel-agent/beszel-agent -listen "192.168.1.1:45876" -key "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AA....."
#    procd_set_param user beszel
    procd_set_param pidfile /var/run/beszel-agent.pid
#    procd_set_param env PORT="45876" KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAA...." HUB_URL="http://192.168.1.XX:8090"
    procd_set_param respawn
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_close_instance
}

# Extra command to trigger agent update
EXTRA_COMMANDS="update restart"
EXTRA_HELP="        update          Update the Beszel agent
        restart         Restart the Beszel agent"

update() {
    /opt/beszel-agent/beszel-agent update
}

Не забываем делать /etc/init.d/beszel-agent reload, привет procd.

И наблюдаем наконец красивую картинку

Комментарии (0)