Настройка собственного Git сервера с помощью Gitea

Kate

Administrator
Команда форума

1.Немного о Gitea​

Gitea - это удобная система управления репозиториями Git, которая предлагает простой пользовательский интерфейс и все необходимые функции для эффективной разработки и сотрудничества над проектами. Если вы знакомы с другими системами Git, такими как GitHub, Bitbucket или GitLab, то Gitea будет знакомым и удобным решением для вас.

Почему именно Gitea? Она абсолютна бесплатна по сравнению с другими системами. Ее легко настроить под свои задачи. В этой статье, я расскажу об этом.

2. Настройка Ubuntu Server​

И так начнем. Тут все просто. Выбираем какой нить виртуальный сервер, на него ставим Ubuntu Server. Заходим по ssh и ставим обнову.

sudo apt update
sudo apt upgrade
Далее нам нужно создать пользователя под которым будет работать gitea.

sudo adduser \
--system \
--shell /bin/bash \
--gecos 'Git Version Control' \
--group \
--disabled-password \
--home /home/git \
git

3. Установка и настройка MySQL БД​

Следующим этапом будет подготовка БД. Как одним из вариантов можно использовать MySQL.

Давайте его установим:

sudo apt install mysql-server
Далее заходим в консольную утилиту mysql

mysql -u root -p
*пароль пустой

Сразу же зададим пароль для root пользователя:

ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';
Теперь нам нужно создать БД

CREATE DATABASE gitea;
Создаем пользователя для работы БД

CREATE USER 'gitea'@'localhost' IDENTIFIED BY '12345678';
Дадим ему права для доступа к БД

GRANT ALL PRIVILEGES ON `gitea`.* TO 'gitea'@'localhost';
И обновим привилегии:

FLUSH PRIVILEGES;
Все готово! для выхода из консольной утилиты пишем exit

4. Установка и настройка Nginx​

Для того что бы мы могли получить доступ к gitea через web интерфейс, нам нужно установить и настроить Nginx.

Выполняем команду

sudo apt-get install nginx
Теперь нужно отредактировать конфиг. Будем использовать nano. Это редактор более удобный и интуитивно понятный чем vi или vim.

nano /etc/nginx/sites-available/default
Вставляем туда вот эти настройки:

server {
server_name domen.ru www.domen.ru;

location / {
client_max_body_size 512M;
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

5. Установка и настройка Gitea​

Переходим в эту директорию

cd /usr/local/bin
Теперь качаем последнюю версию gitea

curl -s https://api.github.com/repos/go-gitea/gitea/releases/latest |grep browser_download_url | cut -d '"' -f 4 | grep '\linux-amd64$' | wget -i -
Установим права на выполнение файла и переименуем его

chmod +x gitea-1.20.4-linux-amd64
mv gitea-1.20.4-linux-amd64 gitea
Далее нужно создаем структур папок и выставить для них доступы

sudo mkdir -p /etc/gitea /var/lib/gitea/{custom,data,indexers,public,log}
sudo chown git:git /var/lib/gitea/{data,indexers,log}
sudo chmod 750 /var/lib/gitea/{data,indexers,log}
sudo chown root:git /etc/gitea
sudo chmod 770 /etc/gitea
sudo mkdir -p /usr/local/bin/data
sudo chown -R git:git /usr/local/bin/data
Из под пользователя root gitea не запуститься. По этому создадим службу для запуска gitea под пользователем git, которого мы создали ранее.

Создаем файл gitea.service

nano /etc/systemd/system/gitea.service
И копируем туда следующие настройки:

[Unit]
Description=Gitea
After=syslog.target
After=network.target
[Service]
RestartSec=3s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
Далее активируем и запускаем сервис

sudo systemctl enable gitea
sudo systemctl start gitea
И проверяем его статус

sudo systemctl status gitea
Если все ок, то увидим следующее

59065e62fc59031ae9303cad478c8bf2.png

6. Первый запуск​

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

sudo systemctl restart nginx
Открываем в браузере адрес который указали в конфиге.

Если все ок, то увидим следующее

a82b074de231317b199ac8afadc43e81.png

Указываем БД имя пользователя и пароль которые мы создали ранее.

И не забываем про настройки админа(имя admin зарезервировано, так что придумайте что то другое)

c280f1405ee65bb5263a43b03fe2e46b.png

Остальное не трогаем!

Нажимаем на кнопку Установить Gitea и ждем когда завершиться установка.

Поздравляю, теперь у вас есть git сервер.

7.Настройка автодеплоя​

У Gitea есть поддержка веб-хуков. А это значит мы можем запустить свой скрипт, привязавшись к какому-нибудь событию. Например когда был сделан мердж в ветку master.

Для этого нужно зайти в раздел веб-хуки. Указать url обработчика, секретный ключ(придумываем сами) и ветку к которой будем привязываться.

cfef5485d69b536389e0ba78505932e2.png



Вот пример кода на PHP в котором показывается как реализовать обработчик.

К примеру мы можем запустить sh скрипт:

<?php
$secret_key = '123';
$scriptPath = "/path/to/deploy.sh";

// check for POST request
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
error_log('FAILED - not POST - '. $_SERVER['REQUEST_METHOD']);
exit();
}

// get content type
$content_type = isset($_SERVER['CONTENT_TYPE']) ? strtolower(trim($_SERVER['CONTENT_TYPE'])) : '';

if ($content_type != 'application/json') {
error_log('FAILED - not application/json - '. $content_type);
exit();
}

// get payload
$payload = trim(file_get_contents("php://input"));

if (empty($payload)) {
error_log('FAILED - no payload');
exit();
}

// get header signature
$header_signature = isset($_SERVER['HTTP_X_GITEA_SIGNATURE']) ? $_SERVER['HTTP_X_GITEA_SIGNATURE'] : '';

if (empty($header_signature)) {
error_log('FAILED - header signature missing');
exit();
}

// calculate payload signature
$payload_signature = hash_hmac('sha256', $payload, $secret_key, false);

// check payload signature against header signature
if ($header_signature !== $payload_signature) {
error_log('FAILED - payload signature');
exit();
}

// convert json to array
$decoded = json_decode($payload, true);

// check for json decode errors
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('FAILED - json decode - '. json_last_error());
exit();
}

exec("sh $scriptPath", $output, $exitCode);

И вот пример deploy.sh

#!/bin/sh
set -e
git pull origin master
npm install
npm run prod

8. Заключение​

Данное решение не является панацеей, оно подойдет для небольшой фирмы или организации. Это всего лишь одни из вариантов как можно организовать совместную разработку продукта не используя сторонние сервисы.

 
Сверху