Свой GitLab одним скриптом — и о чём он молчит
На своём GitLab (gitlab.lyokha.ru) держу код этого сайта и ещё пары проектов — ставил его почти этим же скриптом, только под конкретный сервер. Вот версия, которую держу под рукой на работе для быстрой установки на голую Ubuntu или Debian: пятнадцать строк, а через пять минут — рабочий GitLab CE. Дальше разбираю его по частям и то, о чём он не предупреждает.
#!/bin/bash
set -e
# Проверка прав администратора
if [[ $EUID -ne 0 ]]; then
echo "Этот скрипт должен запускаться с правами root (используйте sudo)"
exit 1
fi
# Определяем IP-адрес сервера (первый не-loopback)
IP=$(hostname -I | awk '{print $1}')
if [[ -z "$IP" ]]; then
echo "Не удалось определить IP-адрес сервера"
exit 1
fi
echo "Начинаем установку GitLab на IP: $IP"
# Обновление системы
apt update && apt upgrade -y
# Установка необходимых пакетов
apt install -y curl openssh-server ca-certificates tzdata perl
# Установка Postfix (для отправки уведомлений) без интерактивных запросов
export DEBIAN_FRONTEND=noninteractive
apt install -y postfix
# Добавление официального репозитория GitLab CE
curl -fsSL https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
# Установка GitLab с внешним URL, равным IP-адресу
EXTERNAL_URL="http://$IP" apt install -y gitlab-ce
# Чтение сгенерированного пароля администратора
PASSWORD_FILE="/etc/gitlab/initial_root_password"
if [[ -f "$PASSWORD_FILE" ]]; then
PASSWORD=$(grep 'Password:' "$PASSWORD_FILE" | awk '{print $2}')
else
PASSWORD="Не найден файл пароля (возможно, GitLab уже был установлен ранее)"
fi
echo ""
echo "========================================="
echo "Установка GitLab успешно завершена!"
echo "Адрес для подключения: http://$IP"
echo "Логин: root"
echo "Пароль: $PASSWORD"
echo "========================================="
echo "Внимание: файл с паролем будет автоматически удалён через 24 часа."
echo "Сохраните пароль в надёжном месте прямо сейчас."
Что здесь происходит
Проверка $EUID — без обхода через sudo внутри самого скрипта: либо запускаете от root явно, либо получаете отказ до единой команды apt. hostname -I возвращает все адреса сервера через пробел, awk '{print $1}' берёт первый — на обычной VPS с одним сетевым интерфейсом это ровно то, что нужно. Postfix ставится ради собственных писем GitLab — комментарии, назначения, уведомления о merge request. Официальный репозиторий подключается установщиком самого GitLab (script.deb.sh): он добавляет ключ и apt source, и уже готовым apt install gitlab-ce видит нужную версию. Post-install хук этого пакета сам гоняет gitlab-ctl reconfigure — отсюда долгая и внешне подвисшая последняя минута установки.
О чём скрипт молчит
apt upgrade -y — не гарантия тишины
DEBIAN_FRONTEND=noninteractive в скрипте выставлен только перед установкой postfix, а apt upgrade -y выше по списку идёт без него. Флаг -y подтверждает установку пакетов, но не подтверждает диалоги о конфигах — если апстрим успел завезти правки в grub или в needrestart, апгрейд может встать и ждать ответа на вопрос, который некому задать. На свежей VPS такое бывает нечасто, но именно поэтому первый запуск лучше не оставлять без присмотра.
EXTERNAL_URL — это не просто адрес в браузере
GitLab прописывает EXTERNAL_URL в ссылки для git remote при клонировании через веб-интерфейс, в адреса вебхуков и в письма уведомлений. Скрипт подставляет туда голый IP — работает сразу, но стоит завести домен, старый адрес не поменяется сам. Правка — это external_url в /etc/gitlab/gitlab.rb и заново gitlab-ctl reconfigure; те, кто уже склонировал репозиторий по старому адресу, продолжат пушить на IP, пока не обновят remote вручную.
Соединение без TLS
http://$IP означает ровно то, что написано: без шифрования. Внутри изолированной сети для первого знакомства с GitLab это приемлемо, но если сервер смотрит в интернет, пароль и токены при входе идут открытым текстом любому на пути. Если уже есть домен, направленный на сервер, — самый короткий путь: external_url 'https://git.example.com' и letsencrypt['enable'] = true в gitlab.rb, GitLab сам получит и обновит сертификат. Домена нет — держите GitLab за firewall до тех пор, пока он не появится.
Пароль живёт сутки, и это не метафора
Файл /etc/gitlab/initial_root_password GitLab действительно подчищает сам — это встроенное поведение, а не скрипта. Закрыли терминал, не скопировав пароль, — узнать его тем же способом больше не получится, только через gitlab-rake "gitlab:password:reset[root]" с консоли сервера. Первое, что стоит сделать после первого входа, — сменить пароль root на свой: до этого сгенерированный лежит в файле открытым текстом.
Память
Официальный минимум под omnibus-сборку GitLab CE — около 4 ГБ. На VPS с двумя гигабайтами gitlab-ctl reconfigure может просто зависнуть на полпути или уйти в своп. Если сервер маленький и выделен целиком под GitLab, первое, что стоит выключить, — встроенный Prometheus: prometheus_monitoring['enable'] = false в gitlab.rb заметно снимает нагрузку.
Коротко
Скрипт честно ставит рабочий GitLab за один прогон. Сразу после — три дела: сменить пароль root, пока файл с ним ещё жив; решить вопрос с TLS, если сервер смотрит в интернет; свериться с памятью, если машина не выделена целиком под GitLab. А домен вместо IP в EXTERNAL_URL — это отдельный gitlab-ctl reconfigure, не откладывайте его на потом: чем больше репозиториев склонируют по старому адресу, тем больше ремонта потом.