Если требуется установка Git сервиса для индивидуального разработчика или небольшой компании, то легковесный аналог GitLib, который называется Gogs, — это лучшее решение.
Git сервис Gogs
Gogs (GO Git Service) — это сервис Git для установки на собственном сервере, очень похож на GitLib. Gogs написан на языке Go, имеет низкие требования к системным ресурсам (в отличие от GitLib). Прост в установке и настройке. Gogs — лучшее решение, если вам нужен собственный Git репозиторий, и вы не хотите оплачивать тарифы других Git сервисов.
Установка Git сервиса Gogs
Установка Git
Устанавливаем систему контроля версий git:
apt install git
Создание пользователя
Создаем пользователя git:
adduser --disabled-login --gecos 'Gogs' git

Мы создали нового пользователя с именем git и все дальнейшие действия будем выполнять под пользователем git. Чтобы зайти под пользователем git, нужно будет выполнить команду:
su - git
Чтобы завершить работу под пользователем git, нужно будет выполнить команду:
exit
Установка Go
Для компиляции Gogs требуется Go версии 1.18 и новее.
Под пользователем git, которого мы только что создали, создаем новую директорию /home/git/local/:
su - git
mkdir $HOME/local && cd $_
Скачиваем самую новую версию Go. На момент написания статьи это была версия 1.20.2:
wget https://golang.google.cn/dl/go1.20.2.linux-amd64.tar.gz
Распаковываем скаченный архив:
tar -C /home/git/local -xvzf go1.20.2.linux-amd64.tar.gz
Зададим переменную окружения GOROOT, чтобы указать наше локальное место установки Go. Переменные окружения задаем в файле .bashrc. Так переменные окружения будут доступны, когда пользователь входит в систему:
echo 'export GOROOT=$HOME/local/go' >> $HOME/.bashrc
echo 'export GOPATH=$HOME/go' >> $HOME/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> $HOME/.bashrc
source $HOME/.bashrc
Проверяем установку Go:
go version

Установка Go успешно завершена.
Установка Gogs
Клонируем репозиторий в подкаталог gogs:
git clone --depth 1 https://github.com/gogs/gogs.git gogs
cd gogs
Компилируем Gogs, все необходимые зависимости будут скачены:
go build -o gogs
Проверка работоспособности Gogs
Чтобы проверить работоспособность Gogs, запускаем команду:
./gogs web

Стартовал веб-сервер и случает HTTP соединения на порту 3000. Чтобы остановить веб-сервер, нажмите комбинацию клавиш CRTL+C
.
Завершаем работу под пользователем git:
exit
Добавление Gogs в автозагрузку
Настроим автоматическую загрузку Git сервиса Gogs при запуске системы.
Создаем файл /etc/systemd/system/gogs.service:
touch /etc/systemd/system/gogs.service
Добавляем в созданный файл следующее содержимое (проверив пути WorkingDirectory и ExecStart):
[Unit]
Description=Gogs
After=syslog.target
After=network.target
After=postgresql.service
After=nginx.service
[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/local/gogs
ExecStart=/home/git/local/gogs/gogs web
Restart=always
Environment=USER=git HOME=/home/git
[Install]
WantedBy=multi-user.target
Активируем созданный нами systemd файл:
systemctl enable gogs
Запускаем сервис:
systemctl start gogs
Проверяем статус сервиса:
systemctl status gogs

Все отлично запустилось и работает! Можно перезагрузить сервер и проверить, что Git сервис Gogs автоматически запускается.
Установка PostgreSQL
Gogs не требует обязательное использование сервера баз данных. Поэтому, можете пропустить данный подраздел, если не планируете использовать Gogs вместе с сервером баз данных.
Устанавливаем необходимые пакеты:
apt install postgresql postgresql-client libpq-dev

Открываем PostgreSQL-терминал, чтобы создать базу данных и пользователя для Gogs:
sudo -u postgres psql -d template1

Создаем нового пользователя с именем gogs:
CREATE USER gogs CREATEDB;
Задаем пароль для пользователя gogs:
\password gogs
Будет предложено ввести новый пароль для пользователя gogs, а затем повторить его ввод.
Создаем базу данных gogs, владельцем которой будет пользователь gogs:
CREATE DATABASE gogs OWNER gogs;
Выходим из PostgreSQL-терминала:
\q
Установка и настройка Nginx
Установим и настроим Nginx в качестве обратного прокси-сервера для Gogs. Благодаря этому, сможем получать доступ к Gogs не по IP адресу сервера, где располагается Gogs, а используя доменное имя (git.adminkin.pro). Nginx также будет обрабатывать HTTPS соединения к Gogs.
Устанавливаем Nginx:
apt install nginx
Создаем конфигурационный файл /etc/nginx/sites-available/git.adminkin.pro.conf:
touch /etc/nginx/sites-available/git.adminkin.pro.conf
Добавляем в файл следующие строки:
server {
listen 80;
server_name git.adminkin.pro;
root /var/www/html;
index index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
Создаем символьную ссылку:
ln -s /etc/nginx/sites-available/git.adminkin.pro.conf /etc/nginx/sites-enabled/git.adminkin.pro.conf
Стартуем Nginx:
nginx
Ура! Домен git.adminkin.pro доступен по HTTP на 80 порту:

Пора получать бесплатный SSL сертификат от Let’s Encrypt на домен git.adminkin.pro. Устанавливаем Certbot (клиент Let’s Encrypt, который создает и устанавливает SSL сертификаты от Let’s Encrypt):
apt install certbot python3-certbot-nginx
Запускаем Certbot для генерации SSL сертификата и его установки на сайт:
certbot --nginx -d git.adminkin.pro -d www.git.adminkin.pro --register-unsafely-without-email
Если просмотреть конфигурационный файл /etc/nginx/sites-available/git.adminkin.pro.conf, то обнаружите, что Certbot внес изменения в этот файл. Перезагружаем Nginx, чтобы изменения в конфигурационном файле были применены:
nginx -s reload
SSL сертификат работает. Переадресация (редирект) с HTTP на HTTPS, прописанная Certbot-ом в конфигурационном файле, работает.

Для автоматического обновления SSL сертификата добавим задачу в cron. Для этого под пользователем root откроем для редактирования файл crontab:
crontab -e
И добавим следующую строчку:
30 2 * * 1 /usr/bin/certbot renew >> /var/log/certbot.log
Так, каждый понедельник в 2:30 ночи будет запускаться проверка валидности SSL сертификата. Если срок действия SSL сертификата истекает, то сертификат будет обновлен.
Настроим Nginx в качестве обратного прокси-сервера для Gogs. Открываем конфигурационный файл /etc/nginx/sites-available/git.adminkin.pro.conf и приводим его к виду:
server {
listen 443 ssl;
server_name git.adminkin.pro;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:3000;
}
ssl_certificate /etc/letsencrypt/live/git.adminkin.pro/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.adminkin.pro/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
listen 80;
server_name git.adminkin.pro www.git.adminkin.pro;
return 301 https://$server_name$request_uri;
}
server {
listen 443;
server_name www.git.adminkin.pro;
ssl_certificate /etc/letsencrypt/live/git.adminkin.pro/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/git.adminkin.pro/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
return 301 https://git.adminkin.pro$request_uri;
}

Перезагружаем Nginx, чтобы изменения в конфигурационном файле были применены:
nginx -s reload
Набираем в адресной строке браузера http://git.adminkin.pro/, и происходит редирект на https://git.adminkin.pro/install. Установка Git сервиса Gogs продолжится в браузере.

Настройка Git сервиса Gogs
Настройки базы данных (см. рисунок выше) оставляем по умолчанию. Вводим только Пароль пользователя gogs базы данных PostgreSQL, который задали в разделе Установка PostgreSQL.
Общие параметры Gogs тоже оставляем по умолчанию, кроме:
- Домен меняем с localhost на git.adminkin.pro
- SSH порт делаем пустым полем, т.к. SSH сервер использоваться не будет;
- URL приложения меняем с http://localhost:3000/ на https://git.adminkin.pro

Расширенные настройки тоже оставляем по умолчанию. Только создадим учетную запись администратора. Для этого заполняем поля: Имя пользователя, Пароль, Подтвердить пароль и нажимаем кнопку Установить Gogs:

В дальнейшем, если потребуется изменение параметров Gogs, это можно сделать вручную, открыв конфигурационный файл /home/git/local/gogs/custom/conf/app.ini.
Все! Мы оказались в панели управления администратора Gogs, можем создавать свой первый собственный Git-репозиторий (здесь мы этого касаться не будем).

Осталось запретить доступ к сайту Gogs по незащищенному протоколу HTTP. Если в адресной строке браузера набрать http://git.adminkin.pro:3000/, то будет предоставлен доступ по HTTP-протоколу:

Это потому, что веб-сервер Gogs прослушивает все сетевые интерфейсы на порту 3000. Для того, чтобы сайт Gogs был доступен только по безопасному HTTPS протоколу, необходимо настроить, чтобы веб-сервер Gogs прослушивал только loopback интерфейс на порту 3000.
Открываем файл /home/git/local/gogs/custom/conf/app.ini с настройками Gogs и в секции [server] добавляем строку:
HTTP_ADDR = 127.0.0.1

Перезапускаем сервис Gogs:
systemctl restart gogs
Проверяем. Доступ по незащищенному HTTP протоколу запрещен:

Выводы
Установка Git сервиса Gogs прошла без проблем. Сам сервис Gogs нетребовательный к ресурсам сервера. Как заявляют его разработчики, может работать на недорогом Raspberry Pi. Gogs — достойная альтернатива GitHub и GitLab.
Как это может помочь бизнесу?
Git сервис Gogs сэкономит деньги бизнеса: не нужно арендовать cервер c супер-конфигурацией (как в случае с GitLab) и не нужно оплачивать все новые и новые тарифы (как в случае с GitHub). Gogs бесплатный, легковесный и кроссплатформенный!
Пожалуйста, вопросы задавайте в комментариях под статьей!
Комментарии
Если «пушите» в новенький Git-репозиторий с помощью команды:
git push -u origin master
И прилетает ошибка «error: 413 Request Entity Too Large«. Это значит, что веб-сервер блокирует большие загружаемые файлы.
Разрешаем загрузку больших файлов строчкой:
client_max_body_size 50m;
в конфигурационном файле Nginx веб-сервера. В моем случае этот конфигурационный файл называется /etc/nginx/sites-available/git.adminkin.pro.conf. И не забываем перезагрузить Nginx.
Против СПАМ ботов помогает либо включение подтверждения email пользователя, либо отключение регистрации совсем. Обе настроки делаются в одном конфигурационном файле /home/git/local/gogs/custom/conf/app.ini. Для включения подтверждения email пользователя выставляем параметр:
REQUIRE_EMAIL_CONFIRMATION=true
Для отключения регистрации выставляем параметр:
DISABLE_REGISTRATION=true
И не забываем перезапустить сервис Gogs:
systemctl restart gogs