Устранение неполадок сценария openrc Gitea в Alpine: проблемы с форком и логгированием

Вопрос или проблема

Я пытаюсь написать скрипт инициализации для 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 имеет некоторые проблемы. Основные из них:

  1. Gitea не форкается, поэтому он остаётся в переднем плане и, соответственно, служба не может корректно работать в фоновом режиме.
  2. При использовании опции --background, служба показывается как "перестала работать", даже когда Gitea действительно работает.
  3. Проблемы с созданием pid файла — без него OpenRC не может правильно отслеживать статус службы.
  4. Отсутствие возможности логирования вывода.

Предложенное решение

В вашем случае правильнее будет использовать уже существующий скрипт, который вы привели в примере, так как он был проверен и корректно работает на 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
}

Пояснение по скрипту

  1. supervise-daemon: Этот процесс управляет Gitea и позволяет ему работать в фоне, обрабатывать перезапуски и следить за состоянием.

  2. command_user: Защитите сервер, запустив Gitea от имени пользователя, который не имеет прав администратора.

  3. command_args: Задается путь к конфигурационному файлу Gitea, чтобы приложение знало, как себя вести.

  4. supervise_daemon_args: Этот аргумент настраивает окружение для Gitea, задает рабочую директорию и указывает, куда записывать логи.

  5. pidfile: Указывает, где будет храниться файл с PID, что позволяет OpenRC правильно отслеживать статус службы.

Логирование

С помощью опций --stdout и --stderr в supervise_daemon_args вы перенаправляете стандартный и стандартный поток ошибок в указанный файл логов. Убедитесь, что указанные пути к лог-файлам существуют и имеют нужные права доступа.

Рекомендации по запуску

Чтобы избежать проблем при запуске, не добавляйте & в конце команды запуска через rc-service, так как это может вызвать проблемы с отслеживанием статуса. Просто запустите команду:

rc-service gitea start

Вывод

Используя предложенный скрипт и указанные рекомендации, вы сможете успешно запустить Gitea как службу в Alpine Linux, а также отлаживать и мониторить его без проблем. Если возникают дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...