Releases: ekuraev/awgram
Releases · ekuraev/awgram
Release list
v0.9.0
🇷🇺 Русский
✨ Добавлено
- Прокси до Telegram Bot API: приоритетный список
telegram_proxies
в конфиге (socks5/socks5h/http/https, авторизация в URL).
При старте бот выбирает первый живой прокси probe-запросомgetMe;
умерший в рантайме прокси лечится автоперезапуском через systemd с
повторным выбором. Креды прокси не попадают в логи. Настройка и
альтернатива через маршрутизацию — в docs/proxy.md
(#48).
🔧 Изменено
- rusqlite 0.32 → 0.40 (bundled SQLite 3.53); для сборки из исходников
теперь нужен Rust не ниже 1.95 — MSRV зафиксирован вCargo.toml
(#44). - Совместимость с инсталлером: поддерживаемая версия —
v5.27.0
(сверен--json-контракт:manage_amneziawg.shв v5.26.0/v5.27.0 не
менялся — v5.26.0 трогает только каскадный скрипт маршрутизации и
диагностический отчёт, v5.27.0 — только установщик); минимальная —
по-прежнему v5.21.0.
🇬🇧 English
✨ Added
- Proxy to the Telegram Bot API: a
telegram_proxiespriority list in
the config (socks5/socks5h/http/https, credentials in the URL).
At startup the bot picks the first live proxy via agetMeprobe; a
proxy dying at runtime is handled by an automatic systemd restart with
re-selection. Proxy credentials never reach the logs. Setup and the
routing-based alternative are covered in
docs/proxy.en.md
(#48).
🔧 Changed
- rusqlite 0.32 → 0.40 (bundled SQLite 3.53); building from source now
requires Rust 1.95 or newer — the MSRV is pinned inCargo.toml
(#44). - Installer compatibility: the supported version is now
v5.27.0
(--jsoncontract verified:manage_amneziawg.shis unchanged in
v5.26.0/v5.27.0 — v5.26.0 only touches the cascade routing script and
the diagnostic report, v5.27.0 only the installer); the minimum is
still v5.21.0.
v0.9.0-rc.1
🧪 Предрелиз для проверки поддержки прокси (#48). Канал
rc:awgram-setup update --channel rc; вернуться —--channel stable. Стабильный v0.9.0 выйдет после подтверждения.
🧪 Pre-release to verify proxy support (#48). Thercchannel:awgram-setup update --channel rc; switch back with--channel stable. Stable v0.9.0 ships once confirmed.
🇷🇺 Русский
✨ Добавлено
- Прокси до Telegram Bot API: приоритетный список
telegram_proxies
в конфиге (socks5/socks5h/http/https, авторизация в URL).
При старте бот выбирает первый живой прокси probe-запросомgetMe;
умерший в рантайме прокси лечится автоперезапуском через systemd с
повторным выбором. Креды прокси не попадают в логи. Настройка и
альтернатива через маршрутизацию — в docs/proxy.md
(#48).
🔧 Изменено
- rusqlite 0.32 → 0.40 (bundled SQLite 3.53); для сборки из исходников
теперь нужен Rust не ниже 1.95 — MSRV зафиксирован вCargo.toml
(#44). - Совместимость с инсталлером: поддерживаемая версия —
v5.27.0
(сверен--json-контракт:manage_amneziawg.shв v5.26.0/v5.27.0 не
менялся — v5.26.0 трогает только каскадный скрипт маршрутизации и
диагностический отчёт, v5.27.0 — только установщик); минимальная —
по-прежнему v5.21.0.
🇬🇧 English
✨ Added
- Proxy to the Telegram Bot API: a
telegram_proxiespriority list in
the config (socks5/socks5h/http/https, credentials in the URL).
At startup the bot picks the first live proxy via agetMeprobe; a
proxy dying at runtime is handled by an automatic systemd restart with
re-selection. Proxy credentials never reach the logs. Setup and the
routing-based alternative are covered in
docs/proxy.en.md
(#48).
🔧 Changed
- rusqlite 0.32 → 0.40 (bundled SQLite 3.53); building from source now
requires Rust 1.95 or newer — the MSRV is pinned inCargo.toml
(#44). - Installer compatibility: the supported version is now
v5.27.0
(--jsoncontract verified:manage_amneziawg.shis unchanged in
v5.26.0/v5.27.0 — v5.26.0 only touches the cascade routing script and
the diagnostic report, v5.27.0 only the installer); the minimum is
still v5.21.0.
v0.8.2
🇷🇺 Русский
✨ Добавлено
- Кнопка «Клиенты группы» в карточке группы: открывает список клиентов
с фильтром по этой группе
(#20).
🐛 Исправлено
- Тупик фильтра «Без группы»: когда все клиенты распределены по группам
(или под липкий статус-фильтр никто не попал), раздел «Клиенты» больше не
запирается на «клиентов нет» — экран пустой выборки сохраняет кнопки смены
статус-фильтра и группового фильтра, а текст различает «клиентов нет
вообще» и «под фильтр никто не попал»
(#20).
♻️ Изменено
- Совместимость с инсталлером: поддерживаемая версия —
v5.23.0
(сверен--json-контракт: v5.22.0 добавил предупреждение о рассинхроне
awgsetup_cfg.initтолько в stderr, v5.23.0 меняет только установщики);
минимальная — по-прежнему v5.21.0.
🇬🇧 English
✨ Added
- "Group clients" button on the group card: opens the client list
filtered to that group
(#20).
🐛 Fixed
- "No group" filter dead end: when every client is assigned to a group
(or the sticky status filter matches nobody), the "Clients" section no
longer locks up on "no clients" — the empty-selection screen keeps the
status-filter and group-filter buttons, and the text distinguishes
"no clients at all" from "nothing matches the filter"
(#20).
♻️ Changed
- Installer compatibility: the supported version is now
v5.23.0
(--jsoncontract verified: v5.22.0 adds anawgsetup_cfg.initdrift
warning to stderr only, v5.23.0 only changes the installers); the minimum
stays v5.21.0.
v0.8.1
🇷🇺 Русский
🐛 Исправлено
- Гонка квоты группы: при двух одновременных созданиях/переносах
клиентов в одну группу квота могла быть превышена — проверка и привязка
теперь атомарны; создание, проигравшее гонку, откатывается с сообщением
«квота исчерпана» (#20). - «Готово» после ошибки создания: провал добавления клиента больше не
завершается сообщением «Готово» — после ошибки бот возвращает главное
меню (#40). - Устойчивость к «Text file busy»: запуск manage-скрипта теперь
переживает короткое окно, когда файл открыт на запись (например,
awgram-setup updateпереписывает скрипт под работающим ботом) —
spawn ретраится до 200 мс вместо немедленной ошибки.
♻️ Изменено
- Централизованная авторизация кнопок: все callback-действия проходят
через единую таблицу доступа (владелец / групповой админ) — забытая
проверка в новом действии теперь невозможна by construction.
🇬🇧 English
🐛 Fixed
- Group quota race: two concurrent client creations/moves into the
same group could exceed the quota — the check and the binding are now
atomic; a creation that loses the race is rolled back with a
"quota reached" message (#20). - "Done" after a failed add: a failed client creation no longer ends
with a "Done" message — on error the bot now returns the main menu
(#40). - Resilience to "Text file busy": launching the manage script now
survives a brief window when the file is open for writing (e.g.
awgram-setup updaterewriting the script under a running bot) — the
spawn retries for up to 200 ms instead of failing immediately.
♻️ Changed
- Centralized button authorization: every callback action now passes
through a single access table (owner / group admin) — a forgotten check
in a new action is impossible by construction.
v0.8.0
🇷🇺 Русский
✨ Добавлено
- Собственное SQLite-хранилище (
rusqlite, bundled): настройки,
статистика трафика, история подключений и операций — вместо/поверх
state.json, путь настраивается черезdb_pathв конфиге. - Фоновый сборщик статистики: тик раз в 60 с опрашивает
stats --json,
сохраняет сэмплы трафика и события online/offline, каждые 5 мин сворачивает
сэмплы в часовые/дневные агрегаты с ретенцией. - Экран «Статистика»: трафик за сегодня/7д/30д, тренд, среднее, топ
клиентов по трафику — данные переживают ребут сервера. - Экран «История» по каждому клиенту: подключения/отключения и операции
(добавление, изменение, перевыпуск, удаление) с таймстампами. - Группы клиентов и делегирование: групповые админы с доступом только к
своей группе, одноразовые инвайт-ссылки (TTL 24 ч), квоты на группу,
перенос клиентов между группами, массовый перевыпуск группы
(#20).
🐛 Исправлено
- Честный онлайн-статус: клиент с хэндшейком старше 5 минут больше не
показывается онлайн (ранее порог ошибочно достигал суток). - Цвет статуса клиентов в списке: клиенты, никогда не подключавшиеся или
давно отключившиеся, снова корректно показываются как 🟡, а не 🔴. Экран
списка (#27) был переключён наstats --json, который не различает «никогда
не подключался» и «был, но давно» — обоим он ставитinactive(🔴). Теперь
status_codeберётся изlist --json(детальная классификация), а
last_handshake/трафик — изstats --json.
♻️ Изменено
- Миграция
state.json→ SQLite выполняется автоматически и один раз при
первом запуске новой версии; старый файл не удаляется. - Каналы обновлений сокращены до
stable|rc— beta/alpha упразднены,
не успев использоваться:--channel beta|alphaтеперь отклоняется с
ошибкой, а старое значениеCHANNEL=beta|alphaвsetup.confмолча
трактуется какstable. В README иawgram-setup helpзафиксировано,
что каналы доступны начиная с v0.7.0, и добавлена инструкция обновления
для серверов со скриптом старше v0.7.0.
🇬🇧 English
✨ Added
- Dedicated SQLite store (
rusqlite, bundled): settings, traffic
statistics, connection and operation history — replacing/augmenting
state.json; the path is configurable viadb_pathin the config. - Background stats collector: a 60s tick polls
stats --json, saves
traffic samples and online/offline events, and every 5 min rolls samples
up into hourly/daily aggregates with retention. - "Stats" screen: traffic for today/7d/30d, trend, average, top clients
by traffic — data survives server reboots. - Per-client "History" screen: connections/disconnections and operations
(add, modify, re-issue, delete) with timestamps. - Groups & delegation: per-group admins scoped to their own group,
one-time invite links (24 h TTL), per-group client quotas, moving clients
between groups, group-wide regen
(#20).
🐛 Fixed
- Honest online status: a client with a handshake older than 5 minutes
is no longer shown as online (the threshold used to erroneously reach
a full day). - Client status color in the list: clients that never connected or
disconnected long ago are correctly shown as 🟡 again, not 🔴. The list
screen (#27) was switched tostats --json, which does not distinguish
"never connected" from "was connected long ago" — both getinactive(🔴).
Nowstatus_codeis taken fromlist --json(detailed classification),
whilelast_handshake/traffic come fromstats --json.
♻️ Changed
state.json→ SQLite migration runs automatically, once, on first
startup of the new version; the old file is not deleted.- Update channels narrowed to
stable|rc— beta/alpha removed before
ever being used:--channel beta|alphais now rejected with an error,
and a legacyCHANNEL=beta|alphavalue insetup.confis silently
treated asstable. README andawgram-setup helpnow state that
channels are available since v0.7.0 and include upgrade instructions
for servers running a pre-v0.7.0 script.
v0.7.0
🇷🇺 Русский
✨ Добавлено
- Каналы обновлений:
awgram-setup update --channel stable|rc|beta|alpha—
установка предрелизных сборок на своём сервере. Канал запоминается;
prerelease-каналы видят и стабильные релизы. Теги с суффиксом
(напримерv0.7.0-rc.1) публикуются как GitHub prerelease и невидимы
для обычногоupdateна существующих установках.
🇬🇧 English
✨ Added
- Update channels:
awgram-setup update --channel stable|rc|beta|alpha—
install pre-release builds on your own server. The channel is sticky;
pre-release channels also see stable releases. Suffixed tags
(e.g.v0.7.0-rc.1) are published as GitHub prereleases and stay
invisible to plainupdateon existing installs.
v0.6.0
🇷🇺 Русский
✨ Добавлено
- Массовая генерация клиентов: префикс + количество (1/3/5/10, cap 10 —
лимит альбома Telegram). Один вызов инсталлера, выдача альбомом.conf.
Превентивная проверка свободных адресов подсети и коллизий имён
(#22). - Фильтр выдачи после создания: тумблеры
.conf/ QR / ссылка в
настройках. Действует на одиночное и массовое добавление. - Карточка клиента: отдельные кнопки для конфига, QR, ссылки и «всё»
(раньше — одна кнопка «всё»). - Трёхцветная индикация статуса: 🟢 активен/недавно, 🟡 нет handshake
(никогда не подключался), 🔴 оффлайн/ошибка ключа — вместо прежнего
бинарного «зелёный/красный». Время последнего handshake теперь прямо в
кнопке списка клиентов; карточка перерисована в иконочном формате
(#21). - Фильтр и сортировка списка клиентов: кнопки фильтра по статусу
(Все / 🟢 Онлайн / 🔴 Оффлайн / 🟡 Никогда) и сортировка «онлайн вперёд»
(🟢 → 🔴 → 🟡, внутри группы — по имени). Выбранный фильтр сохраняется
между сессиями и отображается в заголовке списка
(#28).
🇬🇧 English
✨ Added
- Bulk client generation: prefix + count (1/3/5/10, cap 10 — Telegram
album limit). A single installer call, with configs delivered as an album
of.conffiles. Pre-emptive check of free subnet addresses and name
collisions (#22). - Post-creation delivery filter:
.conf/ QR / link toggles in settings.
Applies to both single and bulk addition. - Client card: separate buttons for config, QR, link and "all"
(previously a single "all" button). - Three-color status indicators: 🟢 active/recent, 🟡 no handshake
(never connected), 🔴 offline/key error — replacing the former binary
"green/red". Last handshake time now shown directly in the client list
button; the card was restyled to an icon-based layout
(#21). - Client list filter and sort: status filter buttons
(All / 🟢 Online / 🔴 Offline / 🟡 Never) and "online-first" sorting
(🟢 → 🔴 → 🟡, by name within a group). The selected filter persists
across sessions and is shown in the list title
(#28).
v0.5.0
🇷🇺 Русский
✨ Добавлено
- Механика in-place-навигации (
editMessageText) расширена на все
экраны-меню: настройки и тумблеры, карточка клиента, статистика,
бэкапы (меню/список/карточка), подтверждения (удаление/рестарт/рестор/
перевыпуск) и выбор языка. Чат больше не плодит дубли ни при каком
переходе по кнопкам — каждое меню живёт в одном сообщении
(продолжение #16).
🇬🇧 English
✨ Added
- The in-place navigation (
editMessageText) now covers all menu
screens: settings and toggles, client card, stats, backups
(menu/list/card), confirmations (delete/restart/restore/regen) and
language selection. No transition through a button clutters the chat
with duplicates anymore — every menu lives in a single message
(follow-up to #16).
v0.4.0
🇷🇺 Русский
✨ Добавлено
- Навигация по меню/списку клиентов (меню ↔ список ↔ страницы) теперь
обновляет сообщение на месте черезeditMessageText, а не отправляет
новое — чат больше не захламляется копиями
(#16). Если исходное
сообщение нельзя отредактировать (удалено и т.п.) — бот отправляет новое
и снимает клавиатуру со старого, чтобы не висели две активные. - Кнопка 🔄 «Обновить» в списке клиентов: перерисовывает актуальные статусы
и метки срока действия в том же сообщении, сохраняя текущую страницу
(актуально для списков длиннее одной страницы).
♻️ Изменено
- Поддержка инсталлера расширена до
v5.21.2
(минимум остался v5.21.0).
JSON-контракт не изменился — v5.21.1/v5.21.2 это багфиксы валидации
(нормализация порта вcheck, числовые счётчики вstats --json),
которые бот переваривает как есть. - Обновление зависимостей:
rand0.9 → 0.10 (переход на свободную функцию
rand::random_range), а также минорные бампыregex,thiserror,
tokio,serde.
🇬🇧 English
✨ Added
- Menu/clients navigation (menu ↔ list ↔ pages) now updates the message
in place viaeditMessageTextinstead of sending a new one — the chat
no longer gets cluttered with duplicate copies
(#16). If the source
message can't be edited (deleted, etc.), the bot sends a new one and
clears the old keyboard so two active ones never sit side by side. - 🔄 "Refresh" button in the clients list: redraws current statuses and
expiry badges in the same message, keeping the current page (relevant
for lists longer than a single page).
♻️ Changed
- Installer support extended to
v5.21.2
(minimum remains v5.21.0).
The JSON contract is unchanged — v5.21.1/v5.21.2 are validation bugfixes
(port normalisation incheck, numeric counters instats --json) that
the bot handles as-is. - Dependency updates:
rand0.9 → 0.10 (moved to therand::random_range
free function), plus minor bumps ofregex,thiserror,tokio,serde.
v0.3.0
🇷🇺 Русский
⚠️ Breaking
- Минимальная версия инсталлера поднята до
v5.21.0.
Бот переведён на расширенный--json-интерфейс команд управления
(add/remove/regen/modify/backup/restore/check/restart/
repair-module), которого нет в v5.20.x. На действующем VPS обновите
инсталлер:awgram-setup update(илиbash install_amneziawg.sh --force).
Добавлено
- 🛠 Изменение параметров клиента (
modify): Keepalive, DNS, AllowedIPs,
Endpoint — кнопка «⚙️ Изменить» в карточке клиента. - 🔁 Перезапуск сервиса (
restart) и 🛠 починка модуля (repair-module)
— новый ряд обслуживания в главном меню. - 🩺 Структурированная карточка проверки: статус сервиса, интерфейса,
порта, модуля, клиентов и фаервола — вместо сырого<pre>с текстом. - Точные сообщения об ошибках: «клиент не найден», «восстановление откачено».
Изменено
- Убраны хрупкие эвристики: fingerprint
.confдля обнаружения «тихого
пропуска» приadd, поиск новейшего бэкапа по mtime, угадывание путей
.conf/.png/.vpnuriпо имени — теперь всё из JSON-ответа скрипта. - Деструктивные команды (
remove/restore/restart) запускаются с
AWG_STRICT_CONFIRM=1+--yes(рекомендация маинтейнера инсталлера).
Исправлено (багфиксы code review)
- P1.1:
run()отбрасывал stdout при ненулевом exit code, но инсталлер
v5.21.0 печатает JSON и ЗАТЕМ выходит с кодом 1 дляexists/not_found/
partial/rolled_back/repair rc=1/2. Все status-ветки были недостижимы
в проде (стабыexit 0маскировали баг).run()теперь всегда возвращает
(stdout, exit_code), методы парсят JSON независимо от кода выхода. - P1.2:
restored.keysдесериализовался какu32, но инсталлер
возвращает"keys": true|false(наличие*.private). Успешный restore
падал на парсинге → бот сообщал о провале. - P2.1:
vpnuriв JSON-конверте — ПУТЬ к файлу, а не ссылкаvpn://.
add/regen_clientтеперь читают содержимое файла, иначе пользователь
получал серверный путь вместо импорт-ссылки. - P2.2: аварийный конверт
{"ok":false,"error":...}при фатальной ошибке
checkдесериализовался в фиктивный отчёт (все defaults). Теперь
try_error_envelopeловит его →ScriptFailed. - P2.3:
repair-moduleиспользует отдельный timeout 300с (общий 60с
обрывал DKMS rebuild + apt-установку kernel headers — заявлено до 5 минут). - P2.4: endpoint-валидатор принимает порт 1..=65535 и требует парные
скобки[IPv6]:port(ранее пропускалhost:0,host:99999,[host:port).
🇬🇧 English
⚠️ Breaking
- Minimum installer version bumped to
v5.21.0.
The bot now uses the extended--jsoninterface for management commands
(add/remove/regen/modify/backup/restore/check/restart/
repair-module), unavailable in v5.20.x. On a running VPS, update the
installer:awgram-setup update(orbash install_amneziawg.sh --force).
Added
- 🛠 Modify client parameters (
modify): Keepalive, DNS, AllowedIPs,
Endpoint — "⚙️ Modify" button in the client card. - 🔁 Restart service (
restart) and 🛠 repair module (repair-module)
— new maintenance row in the main menu. - 🩺 Structured check card: service, interface, port, module, clients and
firewall status — instead of raw<pre>text. - Precise error messages: "client not found", "restore rolled back".
Changed
- Removed fragile heuristics:
.conffingerprinting for silent-skip detection
onadd, newest-backup-by-mtime lookup, path guessing for
.conf/.png/.vpnuri— now all from JSON response. - Destructive commands (
remove/restore/restart) run with
AWG_STRICT_CONFIRM=1+--yes(recommended by the installer maintainer).
Fixed (code review bugfixes)
- P1.1:
run()discarded stdout on non-zero exit code, but installer
v5.21.0 prints JSON THEN exits with code 1 forexists/not_found/
partial/rolled_back/repair rc=1/2. All status branches were
unreachable in production (stubsexit 0masked the bug).run()now
always returns(stdout, exit_code); methods parse JSON regardless of
exit code. - P1.2:
restored.keysdeserialized asu32, but the installer returns
"keys": true|false(presence of*.private). A successful restore failed
to parse → bot reported failure. - P2.1:
vpnuriin the JSON envelope is a file PATH, not avpn://
link.add/regen_clientnow read the file contents — otherwise the user
got a server path instead of an import link. - P2.2: an error envelope
{"ok":false,"error":...}on a fatalcheck
failure deserialized into a fake report (all defaults). Now
try_error_envelopecatches it →ScriptFailed. - P2.3:
repair-moduleuses a dedicated 300s timeout (the common 60s
cut off DKMS rebuild + apt kernel headers install — up to 5 minutes). - P2.4: endpoint validator accepts port 1..=65535 and requires paired
[IPv6]:portbrackets (previously allowedhost:0,host:99999,
[host:port). - P2.5: keepalive range widened from 0..=600 to 0..=65535 to match the
installer (manage.sh:1024).