v1.1.0
2026-07-08
latest
● stable
Что изменилось
Added
- **`gitea install` / `runner install` обнаруживают существующую установку.** Оба потока сначала инспектируют хост (версия бинаря, unit-файл, живой app.ini) и поверх существующей установки — даже ручной, с кастомными путями — переключаются на семантику обновления на месте: пути берутся из **живой** установки, а не из дефолтов; явные `--data-dir`/`--log-dir`, противоречащие живой установке, отклоняются («обновление никогда не переносит данные»); unit-файл, написанный не gtcnsl, **сохраняется байт-в-байт** при обновлении (только замена бинаря + рестарт) — заменить его позволяет новый флаг `--rewrite-unit`. Экран установки в TUI показывает обнаружение баннером обновления с предзаполненными живыми путями и отклоняет противоречащие правки на месте.
- **`gtcnsl gitea adopt` — взять ручную установку под управление, не перенося данные.** По умолчанию dry-run; `--yes` применяет. Извлекает управляемые секреты из `app.ini` в `secrets.ini` с **теми же значениями** (без рестарта — проба секретов у doctor становится зелёной, открываются `secrets check`/`rotate`), ужимает world-readable `app.ini` до 0640, а `--emit-template` пишет свободный от секретов `app.ini.tmpl` для декларативного цикла. `--unit` дополнительно нормализует рукописный `gitea.service` к канону «управляемая база + drop-in оператора» (ADR 0025), причём эквивалентность доказывается эффективными свойствами самого systemd — любое неожиданное расхождение откатывается автоматически.
- **Шаблон юнита gitea выдаёт `CAP_NET_BIND_SERVICE`.** Свежие установки могут указывать `server.HTTP_PORT` ниже 1024 (например, прямой HTTPS на :443 со встроенным ACME Gitea) без ручной правки юнита: `AmbientCapabilities` выдаёт capability непривилегированному сервису, а `CapabilityBoundingSet` отбрасывает все остальные. На дефолтном :3000 безвредно.
- **Профили сервинга у `gitea install`.** `--serving behind-proxy` (по умолчанию — обычный HTTP на :3000, в точности прежнее поведение), `--serving https-acme` (Gitea сама терминирует TLS встроенным Let's Encrypt на :443, :80 отвечает на ACME-челлендж и редиректит; требуются `--domain`, `--acme-email` и **явное согласие `--acme-tos`**) и `--serving https-manual` (ваши `--cert-file`/`--key-file`, `--https-port` по умолчанию 443). Профильные префлайты выполняются до того, как что-либо скачано: целевые порты биндятся, сертификаты существуют и читаемы сервисным пользователем, домен для ACME указывает на этот хост (best-effort-предупреждение). Мастер установки в TUI получил тот же выбор отдельным шагом, с согласием на условия CA в виде явного чекбокса.
- **`gtcnsl gitea enable-https` — переключить живую HTTP-установку на HTTPS, с откатом.** Едет на декларативной машинерии конфига: секция `[server]` переписывается атомарно с бэкапом, Gitea перезапускается и проверяется health-check'ом, а **любая ошибка автоматически откатывает к рабочему HTTP-конфигу**. Привилегированный порт на рукописном юните без `CAP_NET_BIND_SERVICE` — жёсткий стоп с печатью точных директив; `--grant-caps` вместо этого кладёт маленький drop-in от gtcnsl (файл юнита оператора никогда не редактируется, ADR 0025), который откат тоже отзывает. Повторный запуск на уже-https установке — no-op.
- **Doctor проверяет когерентность https/порта/capability.** `PROTOCOL = https` на порту ниже 1024, чей юнит *эффективно* не выдаёт `CAP_NET_BIND_SERVICE` (drop-in учитываются, systemd спрашивается напрямую), репортится как блокер с готовым рецептом — именно такая ручная сборка иначе умирает на bind при следующем рестарте, месяцы спустя.
- Пробер здоровья теперь выводит цель проверки из живого конфига `[server]` (схема, порт, увеличенное окно первой выдачи при включённом ACME) вместо предположения `http://127.0.0.1:3000`; https проверяется по loopback без верификации сертификата — он привязан к домену; это только liveness.
Загрузка
Выберите архитектуру. Прямые ссылки ведут на ассеты релиза.
$ curl -fsSL https://dl.gtcnsl.ru/v1.1.0/gtcnsl-v1.1.0-linux-amd64 -o /usr/local/bin/gtcnsl && chmod +x /usr/local/bin/gtcnsl
i
Проверка
Сверьте с подписанным манифестом сумм, прежде чем что-то запускать.
checksums.txt