Новости

Как я домашний Git-сервер Gogs на Alpine linux устанавливал

“Опасное это дело, Фродо, выходить за порог: стоит ступить на дорогу и, если дашь волю ногам, неизвестно куда тебя занесет.” 

(с)  Властелин Колец: Братство Кольца

С чего всё началось

Мне захотелось завести себе домашний Git-сервер, чтобы практиковаться в разработке и развёртывании пет-проектов. Плюс спокойнее, когда твои наработки лежат не только на github.

В качестве операционной системы выбрал Alpine linux, так как меня заинтересовали её возможности. Был опыт размещения на ней небольшого сервиса. Понравилось, что в ней нет ничего лишнего, а ещё она очень лёгкая в плане системных ресурсов.

Исходные данные

В распоряжении был гипервизор на Proxmox 6.1-3, контейнер с системой Alpine  просто взял из шаблонов (template) — Alpine Linux 3.12 Kernel 5.3.10-1-pve on an x86_64.

Реализацию Git-сервера выбирал из числа открытых и бесплатных проектов. Решил взять для начала, тот у которого меньше настроек и лишних плюшек. Мне нужен git-сервер, который не требователен к ресурсам и наличием базовых операций. Остановился на проекте Gogs.io.

Причины такого выбора:

  1. знакомый интерфейс, т.к. использую на работе;

  2. написан на Golang — значит довольно шустрый;

  3. минимальный набор настроек и функционала;

  4. нормальная документация.

Мой гипервизор пока обладает скромным железом. В распоряжении только:

  • ЦПУ — 4 x AMD Ryzen 3 1200 Quad-Core

  • ОЗУ — 8 Гб

  • Диски — два SSD в ZFS

Из них 1-2 Гб ОЗУ забирает ОС гипервизора. Значит на контейнеры и виртуалки остаётся не так много ресурсов. Решил, что для 1-2 пользователей git-сервера хватит одного ядра, 512 Мб ОЗУ и 8 Гб диска.

Запуск контейнера с ОС Alpine

Настройка и запуск Alpine на Proxmox очень просты и удобны. Описывать их не буду. Скажу только, что мне эта тема с шаблонами очень понравилась. Жаль, что самих шаблонов не так много на мой взгляд.

С другой стороны, никто не мешает развернуть любую ОС и поставить нужный сервис из её пакетов. Например в Alpine так:

alpine:~# apk search zabbix

Подготовка системы

Сменил имя хоста сервера:

alpine:~# hostname gogs-githost

Вначале я установил openssh и nano для его настройки, чтобы нормально подключаться по ssh:

gogs-githost:~# apk add openssh nano

Далее добавил демон в автозагрузку:

gogs-githost:~# rc-update add sshd

Поправил конфиг /etc/ssh/sshd_config и убрал комментарии строк:

...
Port 22
…
PermitRootLogin yes
...

Всё, запустил демон:

gogs-githost:~# /etc/init.d/sshd start

Установка сервиса Gogs

Попытка первая

В документации к Alpine рекомендуют для разработки использовать Gitea. Но это слишком просто неть, поэтому выбрал другое. Я решил внаглую установить git-сервер командой:

gogs-githost:~# apk add gogs
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
(1/8) Installing ca-certificates (20191127-r4)
(2/8) Installing nghttp2-libs (1.41.0-r0)
(3/8) Installing libcurl (7.69.1-r3)
(4/8) Installing expat (2.2.9-r1)
(5/8) Installing pcre2 (10.35-r0)
(6/8) Installing git (2.26.3-r0)
(7/8) Installing gogs (0.11.91-r1)
Executing gogs-0.11.91-r1.pre-install
(8/8) Installing gogs-openrc (0.11.91-r1)
Executing busybox-1.31.1-r19.trigger
Executing ca-certificates-20191127-r4.trigger
OK: 89 MiB in 38 packages

В результате, система помимо самого сервиса gogs установила ещё и дополнительные пакеты, например сам git. Пробую запустить сервер и получаю ошибку:

gogs-githost:~# gogs web
2021/03/18 20:13:42 [ WARN] Custom config '/usr/bin/custom/conf/app.ini' not found, ignore this if you're running first time
2021/03/18 20:13:42 [TRACE] Custom path: /usr/bin/custom
2021/03/18 20:13:42 [TRACE] Log path: /usr/bin/log
2021/03/18 20:13:42 [TRACE] Log Mode: Console (Trace)
2021/03/18 20:13:42 [ INFO] Gogs 0.11.91.0811
2021/03/18 20:13:42 [ INFO] Cache Service Enabled
2021/03/18 20:13:42 [ INFO] Session Service Enabled
2021/03/18 20:13:42 [ INFO] SQLite3 Supported
2021/03/18 20:13:42 [ INFO] Run Mode: Development
2021/03/18 20:13:42 [FATAL] [...gogs/gogs/cmd/web.go:66 checkVersion()] Fail to read 'templates/.VERSION': open /usr/bin/templates/.VERSION: no such file or directory

Как мы видим, ему не хватает конфига и структуры каталогов для работы. Проверил каталог /usr/bin, там оказался лишь одинокий исполняемый файл gogs.

Попытка вторая

После первой попытки я попробовал воссоздать необходимую структуру и конфиг вручную. Ничего хорошего из этого не вышло.

Тогда решил пойти другим путём — в документации Gogs описывается установка под популярные дистрибутивы Linux. Обнаружил там таблицу архивов под две версии Gogs, поэтому проверил, какой установился у меня на Alpine:

gogs-githost:~# gogs -v
Gogs version 0.11.91.0811

Решил попробовать вот этот. Скопировал его в директорию /opt на Alpine:

gogs-githost:/opt# wget https://dl.gogs.io/0.11.91/gogs_0.11.91_linux_amd64.tar.gz

Распаковал:

gogs-githost:/opt# tar -xvf gogs_0.11.91_linux_amd64.tar.gz

Мой замысел был в том, что либо он заработает после распаковки сразу, либо с него можно будет взять недостающей структуры и конфигов. Поменял права на директорию распакованного gogs:

gogs-githost:/opt# chown -R root:root gogs

Попробовал запустить и получил странную ошибку (спойлер: не удивительно, ведь С-компиляторы разные на Alpine это mysl, но об этом я узнаю позже):

gogs-githost:/opt/gogs# ./gogs web
-ash: ./gogs: not found

Тогда то мне и пришла дикая идея подсунуть gogs из Alpine пакетов:

gogs-githost:/opt/gogs# cp /usr/bin/gogs gogs

И бинго! Сервер стартанул и я даже смог его настроить из веб-интерфейса. Но это был не конец…

Попытка третья

Несмотря на охватившую меня эйфорию, радости и “я у мамки сисадмин!” весь следующий день я провёл в раздумьях. Мне не верилось, что в таком перспективном проекте как Alpine, есть место битому пакету. Чувство, что ошибка на моей стороне, не давала покоя.

Я нашел телеграм-чат по Alpine и (увы) на ломаном инглише объяснил свою проблему. Меня направили проверять конфиги в репозитории пакета gogs проекта Alpine.

Честно — у меня не получилось выяснить, в чём ошибка. Но добыл ценную инфу — сервер можно запускать с явным указанием пути к файлу конфига. Попробовал, и штатный gogs-сервер запустился:

gogs-githost:~# gogs web -c /etc/gogs/conf/app.ini
2021/03/20 19:22:47 [TRACE] Custom path: /usr/bin/custom
2021/03/20 19:22:47 [TRACE] Log path: /var/log/gogs
2021/03/20 19:22:47 [TRACE] Log Mode: File (Info)
2021/03/20 19:22:47 [ INFO] Gogs 0.11.91.0811

Дальше настраивал по этому видео-уроку, начиная с момента про настройку из веб-интерфейса.

Конечно, это не полная настройка. При настройке из GUI, я выяснил, что нужно ещё ставить bash. 

Кроме этого, нужно настроить автозапуск сервера. Вернее, он уже есть — /etc/init.d/gogs, но не работает:

#!/sbin/openrc-run
name=gogs
conffile="$GOGS_CUSTOM/conf/app.ini"
command="/usr/bin/gogs"
command_args="web -c $conffile"
start_stop_daemon_args="${GOGS_USER:+--user} $GOGS_USER --env GOGS_CUSTOM=$GOGS_CUSTOM"
pidfile="/var/run/gogs.pid"
command_background="yes"

depend() {
        use logger dns
        need net
        after firewall
}

Путём перебора вариантов пришёл к такому:

#!/sbin/openrc-run

name=gogs
conffile="/etc/gogs/conf/app.ini"
command="/usr/bin/gogs"
command_args="web -c $conffile"
start_stop_daemon_args="${GOGS_USER:+--user} root --env GOGS_CUSTOM=/etc/gogs"
pidfile="/var/run/gogs.pid"
command_background="yes"

depend() {
        use logger dns
        need net
        after firewall
}

Грубо, но да — я просто вместо переменных прописал путь и пользователя (того, которого задавал при настройке из веб-интерфейса). Возможно на этот момент мне указывали в чатике Alpine?

Как на самом деле нужно было

После такого долгого пути экспериментов и щупанья головой стены на прочность, меня осенило! Сервер не нужно запускать вручную, он должен стартовать вместе с системой. Значит, его надо настроить по аналогии с openssh.

Снова решил проверить — клонировал контейнер с Alpine и уже настроенным ssh. А дальше всё оказалось очень просто:

alpine:~# apk add gogs
alpine:~# rc-update add gogs
 * service gogs added to runlevel default
alpine:~# /etc/init.d/gogs start
 * Starting gogs ...                                                                     [ ok ]
alpine:~# rc-status
Runlevel: default
 networking                                                                    [  started  ]
 sshd                                                                             [  started  ]
 crond                                                                            [  started  ]
 gogs                                                                             [  started  ]

Этого действительно достаточно, чтобы запустить свой Git-сервер (если вас устраивает БД SQLite). Теперь можно идти на веб-интерфейс, у меня это был http://192.168.50.205:3000, и делать базовые настройки.

Заключение

Этой статьёй я хочу обратить внимание на важность документации и навыков по ОС Linux. Скорее всего, опытные линуксоиды сразу поняли в чём дело и от души посмеялись над моим дилетанством. Что ж, теперь мне и самому забавно, каким извилистым был мой путь =).

Но правда также и в том, что простой справки по развороту именно пакета gogs на Alpine я не нашёл. Надеюсь, моя статья будет полезна тем, кто задумает нечто подобное.

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

Кнопка «Наверх»