Найти тему
Роман Копаев

Домашний медиа-сервер. Установка GitLab

Оглавление

Кроме фоточек и всяких ценных файликов, которые будут лежать в облаке Nextcloud, захотелось собственное хранилище исходного кода.

Оказалось, что заставить работать на одном сервере Nextcloud и GitLab - не самая простая задача и именно о ее решении пойдет дальше речь...

Про установку GitLab писать не буду - на это есть масса инструкций (например на официальном сайте). Отмечу, лишь, два важных момента:

  1. Ставить нужно GitLab-CE (это бесплатная, немного урезанная версия для личного пользования).
  2. Сразу после установки необходимо забрать содержимое файла /etc/gitlab/initial_root_password, в котором храниться временный пароль к админской учетке (root). Через 24 часа после установки файл самоуничтожается и восстановить пароль можно только через сбрасывания пароля админской учетки. Этот процесс хорошо описан тут, за исключением того, что команда запуска консоли (gitlab-rails console production) у меня заработала только в виде gitlab-rails console и нужно немного подождать, пока консоль прогрузиться.

После установки GitLab открывается по IP-адресу сервера, а вот если нужны нормальные доменные имена, то нужно настроить GitLab на работу через тот-же Apache, через который работает Nextcloud.

Настраиваем GitLab

Редактируем конфигурационный файл.

nano /etc/gitlab/gitlab.rb

Прописываем доменное имя и порт HTTPS

external_url 'https://git.myrouter.keenetic.link:4443'

Указываем пользователя, выключаем nginx и настраиваем workhorse (что бы это ни было).

web_server['external_users'] = ['www-data']
nginx['enable'] = false
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "127.0.0.1:8181"

Запускаем обновление конфигурации

gitlab-ctl reconfigure

Настраиваем Apache

Создаем конфигурационный файл для GitLab и открываем его на редактирование

cd /etc/apache2/sites-available
touch gitlab.conf
nano gitlab.conf

Содержимое файла у меня получилось таким

<VirtualHost *:80>
Define root_domain git.myrourer.keenetic.link
ServerName ${root_domain}

RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [NE,R,L]
</VirtualHost>
<VirtualHost *:443>
Define root_domain git.
myrourer.keenetic.link
ServerName ${root_domain}
ServerSignature Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Location />
Require all granted
ProxyPassReverse http://127.0.0.1:8181
ProxyPassReverse http://${root_domain}/
</Location>

SSLCertificateFile /etc/letsencrypt/live/${root_domain}/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${root_domain}/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLUseStapling on

RewriteEngine on

# Replace spaces (encode them) in request_uri to my_request_uri var
RewriteCond %{REQUEST_URI} "(.*) (.*)"
RewriteRule "^(.*) (.*)$" $1\%20$2 [N,NE,E=MY_REQUEST_URI:$1\%20$2]

# Set my_request_uri if there are no spaces
RewriteCond %{REQUEST_URI} !\s
RewriteRule ^ - [E=MY_REQUEST_URI:%{REQUEST_URI}]

# Enable WebSocket reverse Proxy
# Needs proxy_wstunnel enabled
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:8181/$1" [P,L]

# See
https://docs.gitlab.com/ee/integration/shibboleth.html#apache-2-4-gitlab-8-6-update
# Don't escape encoded characters in API requests. This makes the IDE work.
# Don't escape encoded characters in -/refs/*/logs_tree/ or -/tree/, since 12.85,
# these are pre-encoded, and excluding them causes double-encoding.
RewriteCond %{REQUEST_URI} ^/api/v\d+/.* [OR]
RewriteCond %{REQUEST_URI} .*-/branches/.* [OR]
RewriteCond %{REQUEST_URI} .*-/refs/.*/logs_tree/.* [OR]
RewriteCond %{REQUEST_URI} .*-/tree/.* [OR]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/uploads/.*
# Shibboleth
# RewriteCond %{REQUEST_URI} !/Shibboleth.sso
# RewriteCond %{REQUEST_URI} !/shibboleth-sp
# end Shibboleth
RewriteRule .* http://127.0.0.1:8181%{ENV:MY_REQUEST_URI} [P,QSA,NE]

RequestHeader set X_FORWARDED_PROTO 'https'
RequestHeader set X-Forwarded-Ssl on

# needed for downloading attachments
DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public
#Set up apache error documents, if the back end goes down (i.e. 503 error) then a maintenance/deploy page is thrown up.
ErrorDocument 404 /404.html
ErrorDocument 422 /422.html
ErrorDocument 500 /500.html
ErrorDocument 502 /502.html
ErrorDocument 503 /503.html

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common_forwarded

ErrorLog /var/log/apache2/${root_domain}_error.log
CustomLog /var/log/apache2/${root_domain}_forwarded.log common_forwarded
CustomLog /var/log/apache2/${root_domain}_access.log combined env=!dontlog
CustomLog /var/log/apache2/${root_domain}.log combined
</VirtualHost>

В основном, содержимое файла взято отсюда.

Перезапускаем Apache

sudo service apache2 restart

Получение SSL-сертификата

Для получения сертификата с сервиса Let's Encrypt необходимо чтобы сайт был доступен по 80 порту и по тому доменному имени, на которое вы запрашиваете сертификат.

На своем роутере настраиваю внешнее доменное имя git.myrourer.keenetic.link с доступом по HTTP и 80 порту (как это все настроить писал в статье Домашний медиа-сервер. Установка Nextcloud).

Запрашиваю SSL-сертификат

certbot certonly --webroot --webroot-path=/var/opt/gitlab/nginx/www -d git.myrourer.keenetic.link --test-cert --config-dir /tmp

На роутере меняю для доменного имени меняю протокол на HTTPS и порт на 443.

После этого GitLab и из локальной сети и из Интернета должен быть доступен по одному адресу https://git.myrourer.keenetic.link.

Все статьи про домашний медиа-сервер