К содержимому
gtcnsl
EN RU
Статический Go-бинарник · без зависимостей рантайма

Self-hosted Gitea
под управлением одного бинарника.

Устанавливайте, обновляйте и настраивайте Gitea и раннер — HTTPS, декларативный конфиг, бэкап и self-update. Один проверяемый бинарник, за которым не нужно следить.

Документация Проверка через SHA-256
$ curl -fsSL https://dl.gtcnsl.ru/latest/gtcnsl-v1.3.2-linux-amd64 -o /usr/local/bin/gtcnsl && chmod +x /usr/local/bin/gtcnsl
Контрольные суммы SHA-256 проверяются при загрузке.
// 02

Что умеет

Весь жизненный цикл Gitea — декларативно и проверяемо.

gpg 01

Проверенная установка и апгрейд

Скачивает Gitea с официального зеркала с проверкой GPG и SHA-256, а раннер — с проверкой SHA-256; определяет существующую установку и безопасно обновляет её на месте.

tls 02

HTTPS-профили и adopt

Прямой HTTPS через встроенный ACME или свой сертификат, с автоматическим откатом. gitea adopt берёт под управление установку вручную, не перемещая данные.

ini 03

Декларативный app.ini

Желаемое состояние — в Git. gtcnsl config apply приводит сервер в соответствие — с diff и бэкапом. config get/set/toggle для точечных изменений.

key 04

Управление секретами

Генерация, ротация и безопасное хранение секретов Gitea — включая защищённую ротацию SECRET_KEY, которая перешифровывает каждую затронутую запись вместо того, чтобы её «осиротить».

sys 05

Бэкап, восстановление и self-update

Снимает бэкап бинарника и конфига Gitea для восстановления, управляет systemd-юнитами gitea и gitea-runner и поддерживает актуальность самого gtcnsl через self-update — каждый шаг откатывается при сбое.

i/o 06

TUI и CLI

Интерактивный TUI по умолчанию; неинтерактивный CLI для cron и CI-пайплайнов — один и тот же статический бинарник для linux amd64, arm64 и armv7.

// 03

Консоль, а не скрипт

Запустите gtcnsl без аргументов — и получите настоящий терминальный интерфейс: сервисы, наличие конфига и секреты с одного экрана.

gtcnsl — v1.3.2
gtcnsl — Main menu
SERVICES
giteaactive · 1.27.0
gitea-runneractive · 2.2.0
CONFIG
app.ini/etc/gitea/app.ini (present)
secrets4/4 managed
ACTIONS
> Gitea — install / upgrade
Runner — install / register / upgrade
Config — apply / get / set / toggle
Secrets — generate / check / rotate
Doctor — host prereqs / installed-Gitea / installed-runner
Self-update — check / apply / rollback
↑ move up • ↓ move down • enter select • r refresh status • esc back • ? toggle help • q quit
// 04

Быстрый старт

От нуля до работающего Gitea с CI — три команды.

1
$ gtcnsl gitea install --yes

Устанавливает Gitea, генерирует секреты, пишет app.ini, разворачивает systemd-юнит и запускает его — автоматический откат, если health-check не прошёл.

2
$ gtcnsl runner install --executor=docker --yes

Устанавливает раннер и его юнит gitea-runner с executor-ом Docker. Остаётся остановленным, пока вы его не зарегистрируете.

3
$ gtcnsl runner register --instance https://git.example.com --token <fresh-token> --yes

Регистрирует раннер на вашем инстансе и запускает его. Токен возьмите в Site Admin, Runners, Create new runner.

// 05

Декларативно по умолчанию

Держите app.ini как шаблон в Git. gtcnsl config apply рендерит его с подстановкой --var, показывает diff, делает бэкап старого файла и перезапускает Gitea с health-check.

app.ini.tmpl
[server]
PROTOCOL = http
HTTP_PORT = 3000
SSH_PORT = ${SSH_PORT}
DOMAIN = localhost
ROOT_URL = http://localhost:3000/
APP_DATA_PATH = /var/lib/gitea/data
[actions]
ENABLED = ${ACTIONS_ENABLED}
gtcnsl config apply
$ gtcnsl config apply --template /root/app.ini.tmpl --var SSH_PORT=2222 --var ACTIONS_ENABLED=true --yes
==> render template
template /root/app.ini.tmpl (681 bytes), 2 variable(s)
done in 0s
==> parse current
done in 0s
==> diff
2 change(s):
[actions] ENABLED: "true" (added)
[server] SSH_PORT: "22" → "2222" (changed)
done in 0s
==> apply
backup written to /etc/gitea/app.ini.bak
done in 9ms
==> restart + health check
gitea.service restarted
Gitea is responding again
done in 1.019s
applied 2 change(s) to /etc/gitea/app.ini
// 06

Работает там, где вы

Один бинарник на дистрибутивах и архитектурах, которые вы реально разворачиваете.

Debian
13
Ubuntu
24.04 LTS
Rocky
9
linux/amd64 linux/arm64 linux/armv7
От облачного VPS до Raspberry Pi в шкафу.
// 07

Почему бинарник, а не скрипт

Для тех, кто относится к своему серверу как к продакшену.

Один статический бинарник

Ни Python, ни Ansible, ни рантайма для установки и версионирования. Положите на сервер и запустите.

Проверяемость

Загрузки Gitea сверяются с GPG-подписями и SHA-256; раннер и сам gtcnsl проверяются через SHA-256 — каждый раз, ещё до того, как что-то коснётся системы.

Идемпотентность

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

Весь жизненный цикл

Установка, апгрейд, настройка и запуск — один инструмент вместо папки хрупких shell-скриптов.

// 08

Статус

v1.x — CLI стабилен и версионируется по SemVer с v1.0.

Готово v1.2
Установка, апгрейд и adopt Gitea и раннера
HTTPS profiles — built-in ACME or your own certificate
Декларативный app.ini с diff и бэкапом
Генерация, ротация и безопасное перешифрование секретов
systemd-юниты, бэкап/восстановление и self-update
TUI и неинтерактивный CLI
В планах later
Управление несколькими хостами по SSH
Миграция БД app.ini (SQLite в PostgreSQL/MySQL)
Инкрементальные бэкапы репозиториев
Поддержка Alpine / OpenRC
Больше поддерживаемых дистрибутивов
// 09

Вопросы

Только то, что описано в декларативном конфиге. Всё остальное не трогается, а config apply показывает diff и пишет бэкап перед любым изменением.

Да. gtcnsl gitea adopt берёт установку вручную под управление, не перемещая данные (по умолчанию dry-run), а затем config apply приводит app.ini в соответствие с вашим шаблоном — с diff и бэкапом.

Для установки и операций с сервисами — да, он управляет systemd-юнитами. Команды только на чтение — doctor, config get — нет.

Нет. Ни аккаунта, ни телеметрии, ни phone-home. Один бинарник и ваш сервер.

Бинарники Gitea сверяются с их GPG-подписью и SHA-256; раннер и self-update самого gtcnsl проверяются через SHA-256 — каждая загрузка, каждый раз.