Вопрос или проблема
Я пытаюсь написать скрипт инициализации для gitea
в Alpine. Первый код, который я попробовал, был следующим:
#!/sbin/openrc-run
command=/usr/bin/gitea
command_args="web"
pidfile=/var/run/git.pid
name="Gitea Daemon"
description="Gitea - Git с чашечкой чая"
start() {
ebegin "Запуск Gitea"
start-stop-daemon --start --exec /usr/bin/gitea \
--pidfile /var/run/git.pid
eend $?
}
stop() {
ebegin "Остановка Gitea"
start-stop-daemon --stop --exec /usr/bin/gitea \
--pidfile /var/run/git.pid
eend $?
}
Gitea не порождает новые процессы, поэтому при запуске приведенного выше кода сервис запускается и работает, но остается на переднем плане. Я пытался добавить опцию --background
к start-stop-daemon
. Теперь он порождает новый процесс, но сервис отображается как «сбитый», хотя на самом деле он работает. Я могу исправить это, вручную создав файл git.pid
, в противном случае сервис становится непригодным для использования (не запускается и не останавливается), пока я вручную не удалю /var/run/openrc/started/git
.
При использовании приведенного выше кода и вызове его в фоновом режиме с помощью
rc-service git start &
Сервис запустит gitea, но rc-status
показывает, что сервис «запускается».
Кроме того, мне не удалось записать вывод. Возможно, кто-то может дать мне подсказку по этому поводу. Я пытался добавить перенаправление в command_args
, но это не сработало, а перенаправление вывода start-stop-daemon бесполезно при запуске в фоновом режиме.
Это работает (это тот, который поставляется с gitea-openrc):
#!/sbin/openrc-run
supervisor=supervise-daemon
name=gitea
command="/usr/bin/gitea"
command_user="${GITEA_USER:-gitea}"
command_args="web --config '${GITEA_CONF:-/etc/gitea/app.ini}'"
supervise_daemon_args="--env GITEA_WORK_DIR='${GITEA_WORK_DIR:-/var/lib/gitea}' --chdir '${GITEA_WORK_DIR:-/var/lib/gitea}' --stdout '${GITEA_LOG_FILE:-/var/log/gitea/http.log}' --stderr '${GITEA_LOG_FILE:-/var/log/gitea/http.log}'"
pidfile="/run/gitea.pid"
depend() {
use logger dns
need net
after firewall mysql postgresql
}
Если вы хотите продолжить и использовать свой скрипт, пожалуйста, не ставьте “&” в конце и опубликуйте вывод логов.
.: Франческо
Ответ или решение
Конечно, давайте разберем вашу ситуацию и предложим решение.
Проблема
Как вы уже заметили, пишущий вами init-скрипт для Gitea в Alpine Linux имеет некоторые проблемы. Основные из них:
- Gitea не форкается, поэтому он остаётся в переднем плане и, соответственно, служба не может корректно работать в фоновом режиме.
- При использовании опции
--background
, служба показывается как "перестала работать", даже когда Gitea действительно работает. - Проблемы с созданием
pid
файла — без него OpenRC не может правильно отслеживать статус службы. - Отсутствие возможности логирования вывода.
Предложенное решение
В вашем случае правильнее будет использовать уже существующий скрипт, который вы привели в примере, так как он был проверен и корректно работает на Gitea. Этот скрипт использует supervise-daemon
, который управляет фоновым запуском и логированием приложения.
Вот переработанный скрипт для запуска Gitea:
#!/sbin/openrc-run
supervisor=supervise-daemon
name=gitea
command="/usr/bin/gitea"
command_user="${GITEA_USER:-gitea}" # Имя пользователя, под которым запускается Gitea
command_args="web --config '${GITEA_CONF:-/etc/gitea/app.ini}'"
supervise_daemon_args="--env GITEA_WORK_DIR='${GITEA_WORK_DIR:-/var/lib/gitea}' --chdir '${GITEA_WORK_DIR:-/var/lib/gitea}' --stdout '${GITEA_LOG_FILE:-/var/log/gitea/http.log}' --stderr '${GITEA_LOG_FILE:-/var/log/gitea/http.log}'"
pidfile="/run/gitea.pid"
depend() {
use logger dns
need net
after firewall mysql postgresql
}
Пояснение по скрипту
-
supervise-daemon: Этот процесс управляет Gitea и позволяет ему работать в фоне, обрабатывать перезапуски и следить за состоянием.
-
command_user: Защитите сервер, запустив Gitea от имени пользователя, который не имеет прав администратора.
-
command_args: Задается путь к конфигурационному файлу Gitea, чтобы приложение знало, как себя вести.
-
supervise_daemon_args: Этот аргумент настраивает окружение для Gitea, задает рабочую директорию и указывает, куда записывать логи.
-
pidfile: Указывает, где будет храниться файл с PID, что позволяет OpenRC правильно отслеживать статус службы.
Логирование
С помощью опций --stdout
и --stderr
в supervise_daemon_args
вы перенаправляете стандартный и стандартный поток ошибок в указанный файл логов. Убедитесь, что указанные пути к лог-файлам существуют и имеют нужные права доступа.
Рекомендации по запуску
Чтобы избежать проблем при запуске, не добавляйте &
в конце команды запуска через rc-service
, так как это может вызвать проблемы с отслеживанием статуса. Просто запустите команду:
rc-service gitea start
Вывод
Используя предложенный скрипт и указанные рекомендации, вы сможете успешно запустить Gitea как службу в Alpine Linux, а также отлаживать и мониторить его без проблем. Если возникают дополнительные вопросы, не стесняйтесь спрашивать!