Конфигурация
gtcnsl обращается с app.ini Gitea как с декларативной конфигурацией: рендерит его из шаблона в Git, показывает diff, затем применяет атомарно с бэкапом и health-проверкой.
Где лежит конфиг
Gitea читает /etc/gitea/app.ini. gtcnsl никогда не правит его на месте — каждая запись проходит цикл бэкап → атомарная запись → рестарт → health-проверка и откатывается на app.ini.bak, если Gitea не поднялась.
Прочитать текущую конфигурацию
# только ключи, отличающиеся от дефолтов Gitea
gtcnsl config get
# все ключи схемы, с дефолтом рядом с каждым переопределением
gtcnsl config get --show-defaults
# один ключ, удобно для pipe
gtcnsl config get server.DOMAIN
config get — только чтение. Безсекционные ключи-пролог (редкие, напр. RUN_USER) запрашиваются без точки.
Применить шаблон (декларативный путь)
Держите app.ini.tmpl с плейсхолдерами ${VAR} в системе контроля версий, затем рендерите и применяйте:
gtcnsl config apply \
--template app.ini.tmpl \
--var DOMAIN=git.example.com \
--var ROOT_URL=https://git.example.com/ \
--dry-run
# diff устраивает? убираем --dry-run и подтверждаем
gtcnsl config apply --template app.ini.tmpl --var DOMAIN=git.example.com --yes
${VAR} без соответствующего --var — это ошибка, а не пустая строка: опечатка падает громко, а не молча обнуляет значение. Чтобы вывести литеральный ${VAR}, пишите \${VAR}.
--dry-run вычисляет точный diff и ничего не пишет. Сделайте это привычкой перед любым apply.Изменить один ключ
gtcnsl config set server.DOMAIN git.example.com --yes
gtcnsl config toggle service.DISABLE_REGISTRATION --yes
set пишет один ключ; toggle переключает булево (true ↔ false). Оба используют тот же цикл бэкап-и-откат, что и apply.
Что так задать нельзя
config set / toggle отказывают для секретных ключей (напр. security.SECRET_KEY, security.INTERNAL_TOKEN, oauth2.JWT_SECRET) и составных ключей, меняющих форму подсистемы (напр. database.DB_TYPE, session.PROVIDER, cache.ADAPTER). Секретами управляйте через gtcnsl secrets.
Синхронизировать каталог схемы
Чтобы сравнивать с дефолтами конкретной версии Gitea, закэшируйте её app.example.ini:
gtcnsl config sync-schema --version 1.26.2 --yes
Скачивает (~50 МБ) и кэширует в /var/lib/gtcnsl/schema-cache/<version>/. Добавьте --refresh для повторной загрузки.
apply/set/toggle рестартит gitea.service — ожидайте несколько секунд простоя. Если health-проверка не прошла, gtcnsl восстанавливает app.ini.bak и рестартит снова.config.yaml раннера
Собственные настройки gitea-runner (runner.post_task_script, action_shallow_clone, container.network_create_options.enable_ipv4/6 и всё остальное, что документирует generate-config) — отдельный файл от app.ini, и config apply/set/toggle выше его не касаются. runner register/reconfigure при первом запуске пишут базовый файл — через собственный generate-config установленного бинарника, никогда не перезаписывая уже существующий. Чтобы (пере)сгенерировать его явно:
gtcnsl runner config generate # отказывает, если config.yaml уже есть
gtcnsl runner config generate --force # сначала бэкапит существующий файл, затем перезаписывает
Файл лежит в <WorkDir>/config.yaml (по умолчанию /var/lib/gitea-runner/config.yaml), режим 0640. Декларативного применения отдельных ключей — аналога config apply для раннера — пока нет; runner config — родительская команда, зарезервированная под это на будущее.
Дальше
Держите app.ini.tmpl в Git и пусть config apply устраняет дрейф. Про четыре управляемых секрета — в разделе «Секреты».