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

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

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

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

sudo systemctl restart nginx

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

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

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

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

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

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

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

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

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

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

 

Вот пример кода на 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. Заключение

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

Сайт

Документация

Комментарии (24)


  1. funny_falcon
    14.09.2023 09:53
    +1

    Какие есть минусы в использовании SQLite3 вместо MySQL в связке с Gitea?


    1. spoot1986 Автор
      14.09.2023 09:53

      масштабируемость и производительность


      1. funny_falcon
        14.09.2023 09:53
        +1

        У вас были примеры, когда вашим инсталяциям Gitea не хватало SQLite3? Какие симптомы были?

        Простите за нубские вопросы, просто любопытен реальный опыт.


        1. spoot1986 Автор
          14.09.2023 09:53

          Если честно, сразу на MySQL все поднял. Что бы не было проблем в будущем


        1. mrfloony
          14.09.2023 09:53
          +2

          использую связку Git + Gitea + SQLite3, уже больше года полёт нормальный, на производительность не жалуюсь


        1. Jon7
          14.09.2023 09:53
          +1

          Простите за нубский ответ. Разницу вы почувствуете если у вас пользуются одновременно несколько команд разработки. Будут конфликты при попытках одновременной записи в issue. Совершенно не смертельно, но раздражающий "осадочек остаётся".

          Суть вопроса в том что таблица блокируется на запись. А все таблицы находятся в одном файле. И блокировка на запись получается обширной. На чтение проблем нет никаких.

          В общем, если команда маленькая и одновременно никто не сохраняет issue, то на крошечном vps можно смело использовать sqlite. Разумеется про backup забывать тоже не стоит, но это уже совсем другая история.


  1. ProMix
    14.09.2023 09:53

    А есть всё то же, но в контейнере?


    1. spoot1986 Автор
      14.09.2023 09:53

      пока нету


      1. OmSoft
        14.09.2023 09:53
        +2

        1. spoot1986 Автор
          14.09.2023 09:53
          -3

          ок


      1. Stavr666
        14.09.2023 09:53

        Я разворачивал LXC от TurnKey:
        https://www.turnkeylinux.org/gitea


    1. Alabastr
      14.09.2023 09:53
      +2

      https://docs.gitea.com/installation/install-with-docker


    1. spoot1986 Автор
      14.09.2023 09:53
      +1

      Эту инструкцию я сделал для людей кто с докером еще не знаком. В дальнейшем может напишу как это все дело провернуть используя докер


  1. ss-nopol
    14.09.2023 09:53

    У нас сейчас просто доступ по ssh + gitweb. Возожно ли перенести все репы в gitea и при этом оставить параллельно gitweb, чтобы все линки работали?


    1. spoot1986 Автор
      14.09.2023 09:53

      Не знаю. Такого опыта у меня нет


    1. IgorM
      14.09.2023 09:53
      +4

      В gitea при импорте репозитория можно настроить опцию mirror, так что будете иметь полноценную копию и продолжать работать параллельно с gitweb


  1. dimko2203
    14.09.2023 09:53
    +1

    На самом деле, gitea достаточно легковесная система VCS, но это не значит, что нефункциональная. Да, что-то не работает из коробки, как надо, но есть достаточно функцилнальный REST API

    Также, с недавних пор они добавили фичи типа GitHub Actions - Gitea Actions. Пока не щупал, но выглядит интересно. Также вроде бы собирались добавить поддержку CODEOWNERS файла, по аналогии с GitHub


    1. spoot1986 Автор
      14.09.2023 09:53
      +1

      Я вот думаю сделать продолжение статьи, где расскажу про REST API


    1. domix32
      14.09.2023 09:53
      +1

      Только Gitea не VCS всё же, а в первую очередь про хостинг и управление репами.


  1. tommyfrozen
    14.09.2023 09:53

    Какие преимущества у этой системы перед Gitlab?


    1. spoot1986 Автор
      14.09.2023 09:53
      -1

      Она бесплатная. А Gitlab вроде как платный


    1. kyberorg
      14.09.2023 09:53
      +1

      Она более легковесная. CI там совместим с GitHub Actions.

      Gitlab CE - бесплатный, но в плане ресурсов жрёт много.


  1. AlexEf
    14.09.2023 09:53

    а чем установка через snap плоха?


    1. spoot1986 Автор
      14.09.2023 09:53
      -1

      Я не пробовал. Так то не отвечу на твой вопрос