Compare commits

..

3 Commits

6 changed files with 2985 additions and 87 deletions

View File

@@ -6,6 +6,7 @@ GITEA_DB_NAME=
GITEA_HOST_DB_PORT=3306 GITEA_HOST_DB_PORT=3306
GITEA_HOST_WEB_PORT=8080 GITEA_HOST_WEB_PORT=8080
GITEA_HOST_SSH_PORT=222 GITEA_HOST_SSH_PORT=222
RUNNER_REG_TOKEN=
OG_DB_ROOT_PASSWORD= OG_DB_ROOT_PASSWORD=
OG_DB_USER= OG_DB_USER=

3
.gitignore vendored
View File

@@ -1,4 +1,4 @@
/gitea/*.ini /gitea/app.ini
/gitea/data/ /gitea/data/
/runner/*.yaml /runner/*.yaml
@@ -17,7 +17,6 @@
*.sql *.sql
*.sql.* *.sql.*
*.log *.log
*.ini
*dump* *dump*
*backup* *backup*

140
README.md
View File

@@ -5,43 +5,49 @@
Ниже краткая выжимка этого поста. Ниже краткая выжимка этого поста.
Стек: Стек:
- git, ssh, scp, nginx, certbot, docker, docker-compose-plugin, любой текстовый редактор
- gitea (latest) + mariadb 10.6 - gitea (latest) + mariadb 10.6
- opengist (latest) + mariadb 10.6 - opengist (latest) + mariadb 10.6
- git, docker, docker-compose-plugin; могут понадобиться ssh, scp, nginx, certbot, любой текстовый редактор
## Порядок действий ## Порядок действий
### Для переноса сервисов с другого сервера ### Для переноса сервисов с другого сервера
1. Клонировать репозиторий 1. Клонировать репозиторий
2. Выполнить `cp .env.example .env` и указать корректные данные для подключения 2. Выполнить `cp ./.env.example ./.env` и указать корректные данные для подключения
3. Перенос Gitea: 3. Создать пользователя git, подробности [описаны в блоге](https://axenov.dev/gitea-to-docker)
1. Потушить сервис (не сервер) 4. Выполнить `cp ./gitea/app.example.ini ./gitea/app.ini` и указать необходимые настройки
2. Скопировать существующий конфиг в `./gitea/app.ini` и скорректировать по необходимости **ИЛИ**
3. Снять дамп mysql и положить в `./gitea/dump.sql.gz` - (Необязательно) Для переноса инстанса Gitea:
4. Директории с данными скопировать в `./gitea/data` - Потушить сервис (не сервер)
4. Перенос Gitea Runner: - Выполнить `cp ./compose.override.yml.example ./compose.override.yml`
* Скопировать старый конфиг в `./runner/config.yaml` и скорректировать по необходимости - Скопировать существующий конфиг в `./gitea/app.ini` и скорректировать по необходимости
ИЛИ - Снять дамп mysql и положить в `./gitea/dump.sql.gz`
* Выполнить `cp ./runner/config.example.yaml ./runner/config.yaml` и скорректировать по необходимости - Директории с данными скопировать в `./gitea/data`
5. Перенос OpenGist: - (Необязательно) Для переноса инстанса Gitea Runner:
1. Потушить сервис (не сервер) - Выполнить `cp ./compose.override.yml.example ./compose.override.yml`, если ещё не
2. Скопировать существующий конфиг скопировать в `./opengist/opengist.yml` и скорректировать по необходимости - Скопировать старый конфиг в `./runner/config.yaml` и скорректировать по необходимости
3. Снять дамп mysql и положить в `./opengist/dump.sql.gz` **ИЛИ**
4. Директории с данными скопировать в `./opengist/data` - Выполнить `cp ./runner/config.example.yaml ./runner/config.yaml` и скорректировать по необходимости
6. Убедиться, что владельцем `./` является юзер с `UID`=`1000`, если не -- `cd ..; chown -R 1000:1000 gitea; cd -` - (Необязательно) Для переноса инстанса OpenGist:
7. Запустить через `docker compose up -d --build` - Потушить сервис (не сервер)
8. Проверить логи через `docker logs -f ...` - Выполнить `cp ./compose.override.yml.example ./compose.override.yml`, если ещё не
9. Проверить веб-морды через `curl -I localhost:...` - Скопировать существующий конфиг скопировать в `./opengist/opengist.yml` и скорректировать по необходимости
- Снять дамп mysql и положить в `./opengist/dump.sql.gz`
- Директории с данными скопировать в `./opengist/data`
5. Убедиться, что владельцем `./` является юзер `git`, если нет -- присвоить владение ему
6. Запустить через `docker compose up -d --build`
7. Проверить логи через `docker logs -f ...`
8. Проверить веб-морды через `curl -I localhost:...`
9. (Необязательно) Если есть домены:
- Настроить nginx на хосте как реверс-прокси из внешки в контейнеры:
(поменять `server_name` и порты на свои)
Опционально, если есть домены: <details>
<summary>Файл: /etc/nginx/sites-available/gitea.conf</summary>
10. Настроить nginx на хосте как реверс-прокси из внешки в контейнеры: (поменять `server_name` и порты на свои) ```
server {
Файл: `/etc/nginx/sites-available/gitea.conf`
```
server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name git.example.com server_name git.example.com
@@ -53,13 +59,16 @@ server {
location / { location / {
proxy_pass http://127.0.0.1:8080; proxy_pass http://127.0.0.1:8080;
} }
} }
``` ```
Файл: `/etc/nginx/sites-available/opengist.conf` </details>
``` <details>
server { <summary>Файл: /etc/nginx/sites-available/opengist.conf</summary>
```
server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name gist.example.com server_name gist.example.com
@@ -71,44 +80,27 @@ server {
location / { location / {
proxy_pass http://127.0.0.1:8081; proxy_pass http://127.0.0.1:8081;
} }
} }
```
Сделать линки и перезапустить `nginx`
```shell
ln -s /etc/nginx/sites-available/gitea.conf /etc/nginx/sites-enabled/gitea.conf
ln -s /etc/nginx/sites-available/opengist.conf /etc/nginx/sites-enabled/opengist.conf
unlink /etc/nginx/sites-enabled/default
systemctl restart nginx
```
11. Переключить DNS на новый IP
12. Проверить веб-морды по доменам через `curl -i ...`
13. Настроить SSL через `certbot`
### Для деплоя с нуля
Всё то же, но шаги 3 и 5 можно опустить.
## Gitea + ssh через хост
Проблема в том, что порт openssh на хосте занят (по дефолту 22), пробросить порт напрямую из докера не получится.
1. Запомнить абсолютный путь до скрипта [./gitea/gitea.sh](./gitea/gitea.sh) (например, `/home/user/gitea/gitea/gitea.sh`)
2. Назначить его оболочкой для юзера `git`
```shell
usermod -s /home/user/gitea/gitea/gitea.sh git
```
3. Создать конфиг `/etc/ssh/sshd_config.d/gitea.conf` следующее:
```shell
Match User git
AuthorizedKeysCommandUser git
AuthorizedKeysCommand /usr/bin/docker exec -i gitea /usr/local/bin/gitea keys -e git -u %u -t %t -k %k
``` ```
4. Перезапустить демона через `systemctl restart sshd` </details>
- Сделать линки и перезапустить `nginx`
```shell
ln -s /etc/nginx/sites-available/gitea.conf /etc/nginx/sites-enabled/gitea.conf
ln -s /etc/nginx/sites-available/opengist.conf /etc/nginx/sites-enabled/opengist.conf
unlink /etc/nginx/sites-enabled/default
systemctl restart nginx
```
- Переключить DNS на новый IP
- Проверить веб-морды по доменам через `curl -i ...`
- (Необязательно) Настроить SSL через `certbot`
## Gitea + ssh через хостовый порт
Выполнить скрипт [`./gitea/config-gitea-ssh.sh`](./gitea/config-gitea-ssh.sh).
## Настройка Gitea Actions (runner) ## Настройка Gitea Actions (runner)
@@ -119,17 +111,19 @@ systemctl restart nginx
ENABLED=true ENABLED=true
``` ```
Для версий выше этого делать не нужно.
Для начала нужно запустить всю среду. Для начала нужно запустить всю среду.
Чтобы раннер заработал, его нужно зарегистрировать в Gitea с помощью токена регистрации. Чтобы раннер заработал, его нужно зарегистрировать в Gitea с помощью токена регистрации.
Раннеры могут работать в разных скоупах: на уровне репозитория, организации или глобально. Раннеры могут работать в разных скоупах: на уровне пользователя, репозитория, организации или глобально.
Базово, для создания глобального раннера, нужно зайти в раздел админки со [списком раннеров](http://localhost:8080/-/admin/actions/runners) и найти кнопку в правом верхнем углу. Базово, для создания глобального раннера, нужно зайти в раздел админки со [списком раннеров](http://localhost:8080/-/admin/actions/runners) и найти кнопку в правом верхнем углу.
![Скриншот админки из документации, весьма старый, но суть передаёт](https://docs.gitea.com/assets/images/register-runner-9a8b9ef53a945ba67fe002b581b1ecf4.png) ![Скриншот админки из документации, весьма старый, но суть передаёт](https://docs.gitea.com/assets/images/register-runner-9a8b9ef53a945ba67fe002b581b1ecf4.png)
Токен из этого поля нужно скопировать в файл [`.env`](.env.example) в переменную `RUNNER_REG_TOKEN` и перезапустить контейнер `gitea-runner` или всю среду по желанию. Токен из этого поля нужно скопировать в файл [`.env`](.env.example) в переменную `RUNNER_REG_TOKEN` и пересоздать контейнер `gitea-runner`.
В логах раннера должны быть подобные строчки: В логах раннера должны быть подобные строчки:
@@ -147,12 +141,14 @@ time="2025-04-08T02:14:17Z" level=info msg="runner: gitea-runner, with version:
Если во время выполнения экшена `actions/checkout@v4` возникает ошибка `Could not resolve host`, то в конфиге `./runner/config.yaml` надо указать имя сети: Если во время выполнения экшена `actions/checkout@v4` возникает ошибка `Could not resolve host`, то в конфиге `./runner/config.yaml` надо указать имя сети:
```yaml ```yaml
#...
container: container:
network: "gitea_network" network: "gitea_network"
#...
``` ```
Доп. информация: Доп. информация:
* https://axenov.dev/gitea-to-docker
* https://docs.gitea.com/installation/install-with-docker-rootless
* https://github.com/go-gitea/gitea/blob/main/custom/conf/app.example.ini
* https://docs.gitea.com/administration/config-cheat-sheet
* https://docs.gitea.com/usage/actions/quickstart * https://docs.gitea.com/usage/actions/quickstart
* https://docs.gitea.com/usage/actions/act-runner * https://docs.gitea.com/usage/actions/act-runner

2854
gitea/app.example.ini Normal file

File diff suppressed because it is too large Load Diff

48
gitea/config-gitea-ssh.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/bin/bash
set -e
# ==================================================================================
echo "Configuring user 'git'..."
if ! id git; then
sudo adduser \
--system \
--disabled-password \
--group \
--gecos 'Gitea user' \
--home /home/git \
git
fi
sudo passwd -d git
sudo usermod -aG docker git
currentdir=$(dirname $(readlink -e -- "${BASH_SOURCE}"))
sudo cp -f "$currentdir/gitea-shell" /home/git/
sudo chmod a+x /home/git/gitea-shell
sudo usermod -s /home/git/gitea-shell git
sudo mkdir -p /home/git/.ssh
sudo chown -R git:git /home/git
sudo chmod 755 /home/git
sudo chmod 700 /home/git/.ssh
# ==================================================================================
cfgpath="/etc/ssh/sshd_config.d/gitea.conf"
echo "Installing new ssh config: $cfgpath"
sudo tee "$cfgpath" > /dev/null <<EOF
Match User git
PasswordAuthentication no
AuthorizedKeysCommandUser git
AuthorizedKeysCommand /usr/bin/docker exec -i gitea /usr/local/bin/gitea keys -e git -u %u -t %t -k %k
EOF
# ==================================================================================
echo "Reloading ssh configs..."
sudo systemctl reload ssh
# sudo systemctl reload sshd
echo "Done!"