На Linux обновление ручное: закрыть приложение, скачать .deb/.rpm или бинарник со страницы релиза, установить, запустить заново. На Windows обновление уже работает из приложения.
Решение
При запуске (если включена проверка обновлений) приложение определяет способ установки и предлагает обновиться:
из .deb — pkexec apt-get install -y --reinstall <файл>, запасной вариант dpkg -i;
из .rpm — pkexec dnf install -y <файл>, запасной вариант rpm -U --force;
отдельный бинарник — os.replace, если каталог доступен на запись, иначе pkexec install -m 755 (без ETXTBSY на запущенном файле).
Скачанный файл проверяется по Content-Length и SHA-256 из поля digest GitHub API. Неполный или повреждённый файл удаляется и не устанавливается.
После установки приложение снимает single-instance lock, останавливает прокси, ждёт освобождения порта и запускает новый бинарник. Окружение очищается от _PYI_*/_MEIPASS, переменные *_ORIG восстанавливаются — иначе новый процесс подхватил бы библиотеки из удаляемого _MEI.
Если автоустановка невозможна (AUR, pip, не x86_64, нет pkexec) или установка завершилась ошибкой, остаётся прежнее поведение: предложение открыть страницу релиза.
Изменения
utils/linux_update.py — новый модуль: определение способа установки, команды установки, замена бинарника, relaunch_env;
linux.py — диалог обновления и перезапуск;
utils/update_check.py — download_asset с проверкой длины и SHA-256;
utils/tray_common.py — check_update_async выделен из maybe_notify_update, поведение на Windows/macOS не меняется;
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/Flowseal/tg-ws-proxy/pull/1223
**Author:** [@Fgeeha](https://github.com/Fgeeha)
**Created:** 8/16/2026
**Status:** ✅ Merged
**Merged:** 10/10/2026
**Merged by:** [@Flowseal](https://github.com/Flowseal)
**Base:** `main` ← **Head:** `feature/linux-auto-update`
---
### 📝 Commits (1)
- [`317d7b4`](https://github.com/Flowseal/tg-ws-proxy/commit/317d7b4369e69cfe4b34bb9f736ccf755c824be5) feat: автообновление на Linux без ручной установки пакета
### 📊 Changes
**11 files changed** (+771 additions, -21 deletions)
<details>
<summary>View changed files</summary>
📝 `docs/EN/README.linux.md` (+11 -0)
📝 `docs/RU/README.linux.md` (+11 -0)
📝 `linux.py` (+90 -6)
➕ `tests/test_linux_update.py` (+241 -0)
➕ `tests/test_tray_common.py` (+49 -0)
📝 `tests/test_update_check.py` (+93 -0)
📝 `ui/i18n/en.json` (+2 -0)
📝 `ui/i18n/ru.json` (+2 -0)
➕ `utils/linux_update.py` (+180 -0)
📝 `utils/tray_common.py` (+30 -14)
📝 `utils/update_check.py` (+62 -1)
</details>
### 📄 Description
## Проблема
На Linux обновление ручное: закрыть приложение, скачать `.deb`/`.rpm` или бинарник со страницы релиза, установить, запустить заново. На Windows обновление уже работает из приложения.
## Решение
При запуске (если включена проверка обновлений) приложение определяет способ установки и предлагает обновиться:
- из `.deb` — `pkexec apt-get install -y --reinstall <файл>`, запасной вариант `dpkg -i`;
- из `.rpm` — `pkexec dnf install -y <файл>`, запасной вариант `rpm -U --force`;
- отдельный бинарник — `os.replace`, если каталог доступен на запись, иначе `pkexec install -m 755` (без `ETXTBSY` на запущенном файле).
Скачанный файл проверяется по `Content-Length` и SHA-256 из поля `digest` GitHub API. Неполный или повреждённый файл удаляется и не устанавливается.
После установки приложение снимает single-instance lock, останавливает прокси, ждёт освобождения порта и запускает новый бинарник. Окружение очищается от `_PYI_*`/`_MEIPASS`, переменные `*_ORIG` восстанавливаются — иначе новый процесс подхватил бы библиотеки из удаляемого `_MEI`.
Если автоустановка невозможна (AUR, pip, не x86_64, нет `pkexec`) или установка завершилась ошибкой, остаётся прежнее поведение: предложение открыть страницу релиза.
## Изменения
- `utils/linux_update.py` — новый модуль: определение способа установки, команды установки, замена бинарника, `relaunch_env`;
- `linux.py` — диалог обновления и перезапуск;
- `utils/update_check.py` — `download_asset` с проверкой длины и SHA-256;
- `utils/tray_common.py` — `check_update_async` выделен из `maybe_notify_update`, поведение на Windows/macOS не меняется;
- `ui/i18n/{ru,en}.json` — строки `update.ask_install`, `update.install_fail`;
- `docs/{RU,EN}/README.linux.md` — раздел об автообновлении;
- тесты: `tests/test_linux_update.py`, `tests/test_tray_common.py`, `tests/test_update_check.py`.
`windows.py` и `macos.py` не затронуты.
## Проверка
- `python -m unittest discover -s tests -t .` — 91 тест, OK;
- `ruff check .` — без замечаний;
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
mirror-bot
changed title from [PR #1223] Feature/linux auto update to [PR #1223] feat: автообновление на Linux без ручной установки пакета2026-09-25 16:02:03 +03:00
mirror-bot
changed title from [PR #1223] feat: автообновление на Linux без ручной установки пакета to [PR #1223] [MERGED] feat: автообновление на Linux без ручной установки пакета2026-10-11 00:00:51 +03:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/Flowseal/tg-ws-proxy/pull/1223
Author: @Fgeeha
Created: 8/16/2026
Status: ✅ Merged
Merged: 10/10/2026
Merged by: @Flowseal
Base:
main← Head:feature/linux-auto-update📝 Commits (1)
317d7b4feat: автообновление на Linux без ручной установки пакета📊 Changes
11 files changed (+771 additions, -21 deletions)
View changed files
📝
docs/EN/README.linux.md(+11 -0)📝
docs/RU/README.linux.md(+11 -0)📝
linux.py(+90 -6)➕
tests/test_linux_update.py(+241 -0)➕
tests/test_tray_common.py(+49 -0)📝
tests/test_update_check.py(+93 -0)📝
ui/i18n/en.json(+2 -0)📝
ui/i18n/ru.json(+2 -0)➕
utils/linux_update.py(+180 -0)📝
utils/tray_common.py(+30 -14)📝
utils/update_check.py(+62 -1)📄 Description
Проблема
На Linux обновление ручное: закрыть приложение, скачать
.deb/.rpmили бинарник со страницы релиза, установить, запустить заново. На Windows обновление уже работает из приложения.Решение
При запуске (если включена проверка обновлений) приложение определяет способ установки и предлагает обновиться:
.deb—pkexec apt-get install -y --reinstall <файл>, запасной вариантdpkg -i;.rpm—pkexec dnf install -y <файл>, запасной вариантrpm -U --force;os.replace, если каталог доступен на запись, иначеpkexec install -m 755(безETXTBSYна запущенном файле).Скачанный файл проверяется по
Content-Lengthи SHA-256 из поляdigestGitHub API. Неполный или повреждённый файл удаляется и не устанавливается.После установки приложение снимает single-instance lock, останавливает прокси, ждёт освобождения порта и запускает новый бинарник. Окружение очищается от
_PYI_*/_MEIPASS, переменные*_ORIGвосстанавливаются — иначе новый процесс подхватил бы библиотеки из удаляемого_MEI.Если автоустановка невозможна (AUR, pip, не x86_64, нет
pkexec) или установка завершилась ошибкой, остаётся прежнее поведение: предложение открыть страницу релиза.Изменения
utils/linux_update.py— новый модуль: определение способа установки, команды установки, замена бинарника,relaunch_env;linux.py— диалог обновления и перезапуск;utils/update_check.py—download_assetс проверкой длины и SHA-256;utils/tray_common.py—check_update_asyncвыделен изmaybe_notify_update, поведение на Windows/macOS не меняется;ui/i18n/{ru,en}.json— строкиupdate.ask_install,update.install_fail;docs/{RU,EN}/README.linux.md— раздел об автообновлении;tests/test_linux_update.py,tests/test_tray_common.py,tests/test_update_check.py.windows.pyиmacos.pyне затронуты.Проверка
python -m unittest discover -s tests -t .— 91 тест, OK;ruff check .— без замечаний;🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
[PR #1223] Feature/linux auto updateto [PR #1223] feat: автообновление на Linux без ручной установки пакета[PR #1223] feat: автообновление на Linux без ручной установки пакетаto [PR #1223] [MERGED] feat: автообновление на Linux без ручной установки пакета