Апгрейды и self-update
gtcnsl обновляет себя с download-хоста с проверкой SHA-256 и снапшотом для отката. Gitea двигается вперёд так же, как вы её ставили — после бэкапа.
Обновить сам gtcnsl
# доступен ли новый релиз? (без записи, --yes не нужен)
gtcnsl self-update --dry-run
# обновиться до последнего релиза
gtcnsl self-update --yes
# зафиксировать конкретную версию
gtcnsl self-update --to v0.6.1 --yes
Под капотом он определяет последний тег по versions.json, скачивает https://dl.gtcnsl.ru/<tag>/gtcnsl-<tag>-linux-<arch>, сверяет с checksums.txt (SHA-256), снапшотит работающий бинарник, атомарно меняет его, затем запускает gtcnsl --version для подтверждения — откатываясь автоматически, если проверка не прошла.
Откатить gtcnsl
gtcnsl self-update --rollback --yes
Восстанавливает бинарник, заменённый последним self-update. (--rollback нельзя сочетать с --to или --dry-run.)
https://dl.gtcnsl.com. Перенаправьте через --dl-host или переменную $GTCNSL_DLHOST; https://dl.gtcnsl.ru — идентичное зеркало.Двигать Gitea вперёд
gtcnsl gitea upgrade [--to <v>] [--yes] — короткая команда для уже установленной Gitea: она чисто отказывает, если ставить пока нечего, а иначе едет по тому же пути обновления на месте, что и gitea install --to <version> всегда использовала: пути берутся из живой установки (обновление никогда не переносит данные), --data-dir/--log-dir, противоречащие живой установке, отклоняются, а юнит gitea.service, написанный не gtcnsl, сохраняется байт-в-байт — только замена бинарника и перезапуск; передайте --rewrite-unit, если сознательно хотите шаблон gtcnsl. Если в том же шаге нужны дополнительные флаги — обращайтесь напрямую к gitea install --to. TUI показывает ту же детекцию баннером обновления с живыми путями в полях.
Если после замены бинарника что-то ломается — деплой юнита, рестарт или health-check после апгрейда — gtcnsl автоматически восстанавливает предыдущий бинарник Gitea и перезапускает сервис; после неудачного апгрейда хост никогда не остаётся без работающей Gitea.
Данные Gitea сохраняются при замене бинарника, но сначала сделайте снапшот, чтобы можно было вернуться в заведомо рабочее состояние:
gtcnsl backup
gtcnsl gitea upgrade --to v1.27.0 --yes
gtcnsl doctor # убедиться, что юнит поднялся и здоров
gtcnsl backup снапшотит бинарник Gitea, app.ini, secrets.ini, дерево custom/, а также — если установлен раннер — его регистрацию .runner, config.yaml и юнит gitea-runner.service, всё в /var/lib/gtcnsl/backups/<id>/. Список и восстановление:
gtcnsl backup list
gtcnsl restore <backup-id> --yes
restore снапшотит живые файлы, останавливает Gitea (и раннер, если в бэкапе есть его состояние), подставляет бэкап, рестартит и проверяет здоровье — отменяя себя, если Gitea не поднимается. Бэкап, сделанный до этого релиза, восстанавливается точно так же, как раньше — просто без пунктов раннера, которых в нём нет.
gtcnsl doctor после каждого.1., поэтому переход с 1.27 — смена мажора (--to v28.0.0, с согласием). Прежде чем подтверждать, проверьте, что изменится в вашей установке — собственные настройки gtcnsl уже совместимы:
[server] DOMAINбольше не читается — домен инстанса и SSH-адресов клонирования берётся только изROOT_URL. Убедитесь, чтоROOT_URLуказывает на ваш реальный хост.- Саморегистрация закрыта по умолчанию. Если вы полагались на открытую регистрацию, задайте
[service] DISABLE_REGISTRATION = falseявно. - Удалены настройки
[migrations] ALLOWED_DOMAINS,BLOCKED_DOMAINS,ALLOW_LOCALNETWORKSи пресет[external]— миграции и зеркала теперь используют[migrations] EGRESS_MODE/ALLOWED_HOST_LIST/BLOCKED_HOST_LIST. НевалидныйBLOCKED_HOST_LISTне даст Gitea стартовать. - История Actions истекает: прогоны старше
[actions] RUN_RETENTION_DAYS(по умолчанию 400 дней) удаляются вместе с логами и артефактами. Чтобы сохранить всё, задайте0до апгрейда. - Уведомления переезжают на WebSocket (
/-/ws): reverse proxy перед Gitea должен пробрасывать заголовкиUpgrade. Профилям прямого HTTPS в gtcnsl ничего не нужно. - Нужен git ≥ 2.25 — во всех дистрибутивах, которые поддерживает gtcnsl, он новее.
Сначала сделайте бэкап: апгрейд выполняет необратимые миграции базы.
Смена мажорной версии — только с вашего согласия
Любое обновление, которое выполняет gtcnsl, — gitea upgrade, runner upgrade, self-update и install поверх существующей установки — остаётся внутри мажорной версии, которая у вас уже стоит, пока вы не решите иначе. Мажор — это первое число: длинная серия Gitea 1.x — один мажор, а с 28.0.0 (апстрим убрал префикс 1.) каждый фичевый релиз Gitea — 28, 29, … — отдельный мажор; у раннера мажоры — 3, 4, ….
- Без
--toвы получаете новейший релиз своего мажора: Gitea на 1.26 или 1.27 переходит на новейшую 1.27.x, раннер на 3.x — на новейшую 3.x. Если вышел мажор новее, gtcnsl предупреждает и называет его. Свежая установка без--toполучает новейший мажор, проверенный этим релизом gtcnsl. --toв мажор новее — отдельное решение. В терминале gtcnsl называет обе версии и просит подтвердить; в cron или CI передайте--allow-major-upgrade.--yesне считается согласием на смену мажора — без согласия gtcnsl отказывает, ничего не изменив.
# остаётся в вашем мажоре, предупреждает, если вышел новый
gtcnsl gitea upgrade --yes
# переход на новый мажор без терминала
gtcnsl backup
gtcnsl gitea upgrade --to v28.0.0 --yes --allow-major-upgrade
Двигать раннер вперёд
gtcnsl runner upgrade [--to <v>] [--yes] — аналог gitea upgrade для раннера: чисто отказывает, если раннер не установлен, иначе меняет бинарник на месте и перезапускает сервис. Команда следует фактам живого юнита — путь к бинарнику, рабочая директория, даже устаревшее имя act_runner.service из времён до переименования в v0.2 — вместо того чтобы полагаться на канонический layout gtcnsl, так что усыновлённый или перенесённый раннер (gtcnsl runner adopt) тоже обновляется корректно. Как и gitea upgrade, при неудачной замене gtcnsl автоматически восстанавливает предыдущий бинарник раннера и перезапускает сервис.
gtcnsl runner upgrade --yes
[!NOTE] Переход на Runner 3.x Механику 3.x (новый лок «один процесс на
.runner», генерацию конфига) gtcnsl берёт на себя, но три изменения апстрима живут внутри ваших workflow, а не в gtcnsl:
- Кэш и артефакты: штатные
actions/upload-artifact,download-artifactиactions/cacheтеперь работают как есть — форкgitea-upload-artifactможно убрать. Cache service v2 включён по умолчанию (cache.v2: falseвconfig.yaml, чтобы выключить).container.options, дотягивающиеся до хоста (--pid,--cap-add, устройства, …), молча вырезаются, пока вconfig.yamlне включёнcontainer.privileged.::set-env::/::add-path::(раннер ≥ 3.1.0) отклоняются, если шаг или джоба не задаётACTIONS_ALLOW_UNSECURE_COMMANDS.
[!NOTE] Переход на Runner 4.x Runner 4 — смена мажора (
--to v4.1.0, с согласием). Сам раннер gtcnsl берёт на себя; эти изменения апстрима после 3.1 касаются ваших workflow иconfig.yaml:
- Кэш через раннер (4.0): джобы ходят в кэш через свой раннер. Джобы с
container.network: bridgeдо него больше не достают — оставьтеcontainer.networkпустым или используйте пользовательскую сеть; при удалённомDOCKER_HOSTнужныcache.host/cache.port.valid_volumes(4.0):*больше не совпадает через/— пишите/data/**вместо/data/*.- Tool cache не общий (3.2): каждая джоба видит только то, что есть в её образе; для прежнего общего тома задайте
runner.tool_cache_mode: shared.- Ограничения
container.options(3.3.1): workflow больше не может передавать--env-file,--label-fileи опции драйвера томов, а голый--env NAMEне читает окружение раннера.NODE_OPTIONS(3.3.2) из workflow больше не задаётся.
Дальше
Если после апгрейда что-то не так — начните с «Решение проблем и FAQ».