From 1c4d5c093b6499fd628b96a244ebfa50edec715f Mon Sep 17 00:00:00 2001 From: "S.Gromov" Date: Thu, 23 Oct 2025 02:17:39 +0300 Subject: [PATCH] init gitea server --- .gitignore | 3 + README.md | 155 +++++++++++++ custom-templates/base/footer_content.tmpl | 23 ++ custom-templates/base/head.tmpl | 45 ++++ custom-templates/base/head_navbar.tmpl | 207 ++++++++++++++++++ custom-templates/public/assets/css/custom.css | 12 + custom-templates/public/assets/img/logo.webp | Bin 0 -> 33382 bytes custom-templates/public/assets/img/rick.svg | 35 +++ docker-compose.yaml | 136 ++++++++++++ env.example | 127 +++++++++++ 10 files changed, 743 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 custom-templates/base/footer_content.tmpl create mode 100644 custom-templates/base/head.tmpl create mode 100644 custom-templates/base/head_navbar.tmpl create mode 100644 custom-templates/public/assets/css/custom.css create mode 100644 custom-templates/public/assets/img/logo.webp create mode 100644 custom-templates/public/assets/img/rick.svg create mode 100644 docker-compose.yaml create mode 100644 env.example diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f95e4d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +data/* +.env +backups/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..8be46c1 --- /dev/null +++ b/README.md @@ -0,0 +1,155 @@ +# Инструкция по развертыванию и настройке Gitea + +**Данная инструкция предназначена для запуска Git сервера на локальной машине с URL 127.0.0.1.** + +Это дает возможность протестировать: +- ✅ Git сервер +- ✅ Ранеры (Gitea Actions) +- ✅ Отправку писем (SMTP) +- ✅ Интеграцию с S3 + +**⚠️ Ограничения локального режима:** +В локальном режиме **не доступен Container Registry**, так как для его работы требуется `https`. + +## Оглавление +1. [Настройка и запуск GIT сервера](#настройка-и-запуск-git-сервера) + - [Шаг 1: Конфигурация](#шаг-1-конфигурация) + - [Шаг 2: Запуск сервера](#шаг-2-запуск-сервера) + - [Шаг 3: Настройка темы GitHub (по желанию)](#шаг-3-настройка-темы-github-по-желанию) +2. [Настройка и запуск ранеров](#настройка-и-запуск-ранеров) +3. [Возможные проблемы и их решение](#возможные-проблемы-и-их-решение) + - [1. Изменения в конфигурации сервера не применяются](#1-изменения-в-конфигурации-сервера-не-применяются) + - [2. Проблемы с ранерами после изменения конфигурации](#2-проблемы-с-ранерами-после-изменения-конфигурации) + + +--- + +## Настройка и запуск GIT сервера + +В этом разделе описано, как поднять сервер Gitea **локально на своем ПК**. Инструкции по настройке производственной среды (прода) находятся в разделе [Настройка прод сервера](#настройка-прод-сервера). + +### Шаг 1: Конфигурация +1. Перейдите в директорию `server`: + ```bash + cd server + ``` +2. Скопируйте файл `env.example` в `.env` в корневой директории проекта: + ```bash + cp env.example .env + ``` + +### Шаг 2: Запуск сервера + +1. Убедитесь, что у вас установлен Docker и Docker Compose. +2. Выполните следующую команду для запуска Gitea в фоновом режиме: + ```bash + docker-compose up -d + ``` +3. Сервер будет доступен по адресу [http://127.0.0.1:8080](http://127.0.0.1:8080) (по умолчанию) или по адресу, указанному в переменной `GITEA__server__INSTANCE` в файле `.env`. +4. При первом входе вы увидите страницу **Начальная конфигурация**. Базовую настройку лучше не трогать. Вам нужно только указать: + - **Название сайта:** Имя вашего Gitea-сервиса. + - **Настройки учётной записи администратора:** Создайте логин и пароль для главного администратора. + - По желанию можно изучить **Расширенные настройки**, чтобы включить капчу, отключить публичную регистрацию и т.д. +5. **Поздравляем!** На этом этапе вы уже можете работать с вашим GIT сервером: создавать репозитории, клонировать и пушить. + +### Шаг 3: Настройка темы GitHub (по желанию) + +Для выполнения этих шагов, вы должны находиться в директории `server/`. + +1. **Остановите сервер Gitea.** + ```bash + docker-compose down + ``` + +2. **Найдите последнюю версию темы.** + Перейдите на страницу релизов [gitea-github-theme](https://github.com/lutinglt/gitea-github-theme/releases) и скопируйте номер последней версии (например, `v1.24.5`). + +3. **Создайте директорию, скачайте тему и установите права.** + Выполните следующие команды, подставив актуальную версию вместо `v1.24.5`. + ```bash + # Создаем директорию для кастомных тем + mkdir -p data/gitea/custom/public/assets/css/ + + # Скачиваем архив и распаковываем его содержимое (пропуская папку 'dist') + curl -L https://github.com/lutinglt/gitea-github-theme/releases/download/v1.24.5/theme-github.tar.gz | tar -xz --strip-components=1 -C data/gitea/custom/public/assets/css/ + + # Меняем владельца директории, чтобы у Gitea был доступ + chown -R 1000:1000 data/gitea/custom + ``` + +4. **Измените тему по умолчанию.** + Откройте файл `.env` и измените значение переменной `GITEA__ui__DEFAULT_THEME`: + ``` + GITEA__ui__DEFAULT_THEME=github-auto + ``` + +5. **Запустите сервер.** + Перезапустите Gitea, чтобы применить изменения. + ```bash + docker-compose up -d --force-recreate + ``` + +6. **Проверьте установку.** + После запуска сервера перейдите в "Настройки профиля" => "Внешний вид" и убедитесь, что тема по умолчанию установлена как `github-auto`. В списке доступных тем также должны появиться `github-light`, `github-dark` и `github-soft-dark`. + +--- + +## Настройка и запуск ранеров + +1. Перейдите в админ-панель Gitea по адресу [http://127.0.0.1:8080/-/admin/actions/runners/](http://127.0.0.1:8080/-/admin/actions/runners/) и нажмите **"Создать новый раннер"**. +2. Скопируйте полученный токен. +3. Откройте файл `runners/docker-compose.yaml` и вставьте токен в переменную `GITEA_RUNNER_REGISTRATION_TOKEN`. + ```yaml + environment: + - GITEA_RUNNER_REGISTRATION_TOKEN=СЮДА_ВСТАВИТЬ_ВАШ_ТОКЕН + ``` +4. Перейдите в директорию `runners` и запустите раннер: + ```bash + cd runners + docker-compose up -d + ``` +5. Перейдите на вкладку [http://127.0.0.1:8080/-/admin/actions/runners/](http://127.0.0.1:8080/-/admin/actions/runners/) и убедитесь что появился новый раннер, индикатор "Статус" - горит зеленым. + +--- + +## Возможные проблемы и их решение + +### 1. Изменения в конфигурации сервера не применяются + +Если вы изменили значения в файле `.env`, необходимо перезапустить сервер с ключом `--force-recreate` для принудительного пересоздания контейнера: + +```bash +cd server +docker-compose down +docker-compose up -d --force-recreate +``` + +### 2. Проблемы с ранерами после изменения конфигурации + +Если вы изменили настройки ранера или возникли проблемы с его работой, самый эффективный способ решения: + +1. **Остановите ранер:** + ```bash + cd runners + docker-compose down + ``` + +2. **Удалите директорию с данными ранера:** + ```bash + sudo rm -rf gitea-runner-1 + ``` + +3. **Создайте новый токен регистрации:** + - Перейдите в админ-панель [http://127.0.0.1:8080/-/admin/actions/runners/](http://127.0.0.1:8080/-/admin/actions/runners/) + - Нажмите **"Создать новый раннер"** + - Скопируйте новый токен + +4. **Обновите токен в конфигурации:** + Откройте файл `runners/docker-compose.yaml` и замените значение `GITEA_RUNNER_REGISTRATION_TOKEN` на новый токен. + +5. **Запустите ранер с принудительным пересозданием:** + ```bash + docker-compose up -d --force-recreate + ``` + +--- diff --git a/custom-templates/base/footer_content.tmpl b/custom-templates/base/footer_content.tmpl new file mode 100644 index 0000000..1f7b93f --- /dev/null +++ b/custom-templates/base/footer_content.tmpl @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/custom-templates/base/head.tmpl b/custom-templates/base/head.tmpl new file mode 100644 index 0000000..c5daefa --- /dev/null +++ b/custom-templates/base/head.tmpl @@ -0,0 +1,45 @@ + + + + + {{if .Title}}{{.Title}} - {{end}}{{if .Repository.Name}}{{.Repository.Name}} - {{end}}{{AppName}} + {{if .ManifestData}}{{end}} + + + + +{{if .GoGetImport}} + + +{{end}} +{{if and .EnableFeed .FeedURL}} + + +{{end}} + + + + {{template "base/head_opengraph" .}} + {{template "base/head_style" .}} + {{template "base/head_script" .}} + + {{template "custom/header" .}} + + + {{template "custom/body_outer_pre" .}} + +
+ + + {{template "custom/body_inner_pre" .}} + + {{if not .PageIsInstall}} + {{template "base/head_navbar" .}} + {{end}} + +{{if false}} + {{/* to make html structure "likely" complete to prevent IDE warnings */}} +
+ + +{{end}} diff --git a/custom-templates/base/head_navbar.tmpl b/custom-templates/base/head_navbar.tmpl new file mode 100644 index 0000000..c6bc7dd --- /dev/null +++ b/custom-templates/base/head_navbar.tmpl @@ -0,0 +1,207 @@ +{{$notificationUnreadCount := 0}} +{{if and .IsSigned .NotificationUnreadCount}} + {{$notificationUnreadCount = call .NotificationUnreadCount ctx}} +{{end}} +{{$activeStopwatch := NIL}} +{{if and .IsSigned EnableTimetracking .GetActiveStopwatch}} + {{$activeStopwatch = call .GetActiveStopwatch ctx}} +{{end}} + \ No newline at end of file diff --git a/custom-templates/public/assets/css/custom.css b/custom-templates/public/assets/css/custom.css new file mode 100644 index 0000000..1cbf0f8 --- /dev/null +++ b/custom-templates/public/assets/css/custom.css @@ -0,0 +1,12 @@ +/* Кастомные стили для футера */ +.page-footer { + /* Ваши стили здесь */ +} + +.page-footer .left-links { + /* Стили для левой части футера */ +} + +.page-footer .right-links.right-links { + min-width: initial; +} diff --git a/custom-templates/public/assets/img/logo.webp b/custom-templates/public/assets/img/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..65e6239a39d4f682b8e66b5601039476e0c21399 GIT binary patch literal 33382 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 LH*en$VSoYvJlI*N literal 0 HcmV?d00001 diff --git a/custom-templates/public/assets/img/rick.svg b/custom-templates/public/assets/img/rick.svg new file mode 100644 index 0000000..29117f0 --- /dev/null +++ b/custom-templates/public/assets/img/rick.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..1233091 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,136 @@ +services: + gitea: + image: gitea/gitea:latest + container_name: gitea + restart: unless-stopped + environment: + - USER_UID=1000 + - USER_GID=1000 + - GITEA__server__APP_DATA_PATH=/data/gitea + - GITEA__server__DOMAIN + - GITEA__server__HTTP_PORT=80 + - GITEA__server__ROOT_URL=${GITEA__server__INSTANCE}/ + - GITEA__server__LANDING_PAGE + - GITEA__server__SSH_PORT + - GITEA__server__SSH_DOMAIN=${GITEA__server__DOMAIN} + - GITEA__server__MINIMUM_KEY_SIZE_CHECK=false + - GITEA__server__LFS_START_SERVER=true + - GITEA__server__LFS_JWT_SECRET + - GITEA__server__OFFLINE_MODE=false + - GITEA__server__ENABLE_GZIP=true + - GITEA__storage__STORAGE_TYPE + - GITEA__ui__THEMES + - GITEA__ui__DEFAULT_THEME + - GITEA__service__DISABLE_REGISTRATION + - GITEA__service__REGISTER_EMAIL_CONFIRM + - GITEA__openid__ENABLE_OPENID_SIGNIN + - GITEA__openid__ENABLE_OPENID_SIGNUP + - GITEA__mailer__ENABLED + - GITEA__mailer__FROM + - GITEA__mailer__SMTP_ADDR + - GITEA__mailer__SMTP_PORT + - GITEA__mailer__USER + - GITEA__mailer__PASSWD + - GITEA__packages__ENABLED + - GITEA__container__ENABLED + - GITEA_CUSTOM=/data/gitea/custom + # S3 Storage Configuration + - GITEA__storage__SERVE_DIRECT=true + - GITEA__storage__MINIO_ENDPOINT=${S3_ENDPOINT} + - GITEA__storage__MINIO_ACCESS_KEY_ID=${S3_ACCESS_KEY} + - GITEA__storage__MINIO_SECRET_ACCESS_KEY=${S3_SECRET_KEY} + - GITEA__storage__MINIO_BUCKET=${S3_BUCKET} + - GITEA__storage__MINIO_LOCATION=${S3_LOCATION} + - GITEA__storage__MINIO_USE_SSL=${S3_USE_SSL} + # Git LFS S3 Configuration + - GITEA__lfs__STORAGE_TYPE=${GITEA__storage__STORAGE_TYPE} + - GITEA__lfs__SERVE_DIRECT=true + - GITEA__lfs__MINIO_ENDPOINT=${S3_ENDPOINT} + - GITEA__lfs__MINIO_ACCESS_KEY_ID=${S3_ACCESS_KEY} + - GITEA__lfs__MINIO_SECRET_ACCESS_KEY=${S3_SECRET_KEY} + - GITEA__lfs__MINIO_BUCKET=${S3_BUCKET} + - GITEA__lfs__MINIO_LOCATION=${S3_LOCATION} + - GITEA__lfs__MINIO_USE_SSL=${S3_USE_SSL} + - GITEA__lfs__PATH=lfs/ + # Actions S3 Configuration + - GITEA__actions__ENABLED=true + - GITEA__actions__STORAGE_TYPE=${GITEA__storage__STORAGE_TYPE} + - GITEA__actions__MINIO_ENDPOINT=${S3_ENDPOINT} + - GITEA__actions__MINIO_ACCESS_KEY_ID=${S3_ACCESS_KEY} + - GITEA__actions__MINIO_SECRET_ACCESS_KEY=${S3_SECRET_KEY} + - GITEA__actions__MINIO_BUCKET=${S3_BUCKET} + - GITEA__actions__MINIO_LOCATION=${S3_LOCATION} + - GITEA__actions__MINIO_USE_SSL=${S3_USE_SSL} + # Packages S3 Configuration + - GITEA__packages__STORAGE_TYPE=${GITEA__storage__STORAGE_TYPE} + - GITEA__packages__SERVE_DIRECT=true + - GITEA__packages__MINIO_ENDPOINT=${S3_ENDPOINT} + - GITEA__packages__MINIO_ACCESS_KEY_ID=${S3_ACCESS_KEY} + - GITEA__packages__MINIO_SECRET_ACCESS_KEY=${S3_SECRET_KEY} + - GITEA__packages__MINIO_BUCKET=${S3_BUCKET} + - GITEA__packages__MINIO_LOCATION=${S3_LOCATION} + - GITEA__packages__MINIO_USE_SSL=${S3_USE_SSL} + - GITEA__packages__PATH=packages/ + # Avatar S3 Configuration + - GITEA__avatar__STORAGE_TYPE=${GITEA__storage__STORAGE_TYPE} + - GITEA__avatar__SERVE_DIRECT=true + - GITEA__avatar__MINIO_ENDPOINT=${S3_ENDPOINT} + - GITEA__avatar__MINIO_ACCESS_KEY_ID=${S3_ACCESS_KEY} + - GITEA__avatar__MINIO_SECRET_ACCESS_KEY=${S3_SECRET_KEY} + - GITEA__avatar__MINIO_BUCKET=${S3_BUCKET} + - GITEA__avatar__MINIO_LOCATION=${S3_LOCATION} + - GITEA__avatar__MINIO_USE_SSL=${S3_USE_SSL} + - GITEA__avatar__PATH=avatars/ + # Attachments S3 Configuration + - GITEA__attachment__STORAGE_TYPE=${GITEA__storage__STORAGE_TYPE} + - GITEA__attachment__SERVE_DIRECT=true + - GITEA__attachment__MINIO_ENDPOINT=${S3_ENDPOINT} + - GITEA__attachment__MINIO_ACCESS_KEY_ID=${S3_ACCESS_KEY} + - GITEA__attachment__MINIO_SECRET_ACCESS_KEY=${S3_SECRET_KEY} + - GITEA__attachment__MINIO_BUCKET=${S3_BUCKET} + - GITEA__attachment__MINIO_LOCATION=${S3_LOCATION} + - GITEA__attachment__MINIO_USE_SSL=${S3_USE_SSL} + - GITEA__attachment__PATH=attachments/ + # Repository Archive S3 Configuration + - GITEA__repo-archive__STORAGE_TYPE=${GITEA__storage__STORAGE_TYPE} + - GITEA__repo-archive__SERVE_DIRECT=true + - GITEA__repo-archive__MINIO_ENDPOINT=${S3_ENDPOINT} + - GITEA__repo-archive__MINIO_ACCESS_KEY_ID=${S3_ACCESS_KEY} + - GITEA__repo-archive__MINIO_SECRET_ACCESS_KEY=${S3_SECRET_KEY} + - GITEA__repo-archive__MINIO_BUCKET=${S3_BUCKET} + - GITEA__repo-archive__MINIO_LOCATION=${S3_LOCATION} + - GITEA__repo-archive__MINIO_USE_SSL=${S3_USE_SSL} + - GITEA__repo-archive__PATH=repo-archive/ + # Cache S3 Configuration + - GITEA__cache__ENABLED=true + volumes: + - ./data:/data + - ./custom-templates/base:/data/gitea/custom/templates/base:ro + - ./custom-templates/public:/data/gitea/custom/public:ro + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + networks: + - gitea_network + ports: + - ${GITEA__server__DOCKER_SSH_PORT}:22 + - ${GITEA__server__PORT}:80 + + backup: + image: ghcr.io/gromov-io/docker-s3-backup:latest + container_name: gitea-backup + restart: unless-stopped + environment: + - BACKUP_PROJECT_NAME=gitea-server + - BACKUP_S3_BUCKET=${S3_BUCKET} + - BACKUP_S3_ENDPOINT=${S3_ENDPOINT} + - BACKUP_S3_ACCESS_KEY=${S3_ACCESS_KEY} + - BACKUP_S3_SECRET_KEY=${S3_SECRET_KEY} + - BACKUP_S3_FOLDER=gitea-backups + volumes: + - .:/backup-source:ro + - /var/run/docker.sock:/var/run/docker.sock:ro + + +networks: + gitea_network: + name: gitea_network diff --git a/env.example b/env.example new file mode 100644 index 0000000..2d7df6f --- /dev/null +++ b/env.example @@ -0,0 +1,127 @@ +# =========================================== +# Конфигурация сервера +# +# Этот блок содержит настройки, связанные с основной функциональностью сервера Gitea, +# включая домен, URL экземпляра, порты и настройки LFS. +# =========================================== + +# Основной URL-адрес экземпляра Gitea. +GITEA__server__INSTANCE=http://127.0.0.1 + +# Порты HTTP и SSH на которых будет запущен докер. +GITEA__server__PORT=8080 +GITEA__server__DOCKER_SSH_PORT=222 + + +# Домен и порт которые будут отображаться при клонировании/скачивании репозитория. +GITEA__server__DOMAIN=127.0.0.1 +GITEA__server__SSH_PORT=222 + +# Секретный ключ для JWT-аутентификации для Large File Storage (LFS). +GITEA__server__LFS_JWT_SECRET=lfs-secret-string + +# Время жизни JWT токенов для LFS операций (6 часов для больших файлов). +GITEA__server__LFS_HTTP_AUTH_EXPIRY=6h + +# Переопределяем стартову страницу, вместо промо ставим редирект на страницу авторизации. +GITEA__server__LANDING_PAGE=explore + + + +# =========================================== +# Конфигурация пользовательского интерфейса (UI) +# +# Этот блок содержит настройки для пользовательского интерфейса Gitea, такие как +# тема по умолчанию и доступные темы. +# =========================================== + +# Тема по умолчанию для интерфейса Gitea. +GITEA__ui__DEFAULT_THEME=gitea-auto +# Список доступных тем через запятую. +GITEA__ui__THEMES=gitea-auto,gitea-light,gitea-dark,github-auto,github-light,github-dark,github-soft-dark + + + + +# =========================================== +# Конфигурация служб и аутентификации +# +# Этот блок содержит настройки для регистрации пользователей, OpenID и других +# функций на уровне сервиса. +# =========================================== + +# Отключить регистрацию пользователей. Установите 'true', чтобы запретить регистрацию новых пользователей. +GITEA__service__DISABLE_REGISTRATION=false +# Включить OpenID для входа пользователей. +GITEA__openid__ENABLE_OPENID_SIGNIN=false +# Включить OpenID для регистрации пользователей. +GITEA__openid__ENABLE_OPENID_SIGNUP=false +# Включить подтверждение регистрации. +GITEA__service__REGISTER_EMAIL_CONFIRM=true + + + +# =========================================== +# Конфигурация хранилища +# +# Этот блок определяет бэкенд для хранения данных Gitea. Это может быть локальное +# хранилище или облачное решение, такое как S3 (например, Minio). +# =========================================== + +# Тип используемого хранилища. 'local' для локальной файловой системы, 'minio' для S3-совместимого хранилища. +GITEA__storage__STORAGE_TYPE=minio + + + +# =========================================== +# Конфигурация S3 хранилища +# +# Общие настройки для всех типов S3 хранилища в Gitea. +# Детальная конфигурация каждого типа хранилища находится в docker-compose.yaml +# +# Для включения S3 хранилища измените GITEA__storage__STORAGE_TYPE=minio +# =========================================== + +# Эндпоинт S3 сервиса (Yandex Object Storage) +S3_ENDPOINT=storage.yandexcloud.net + +# Ключи доступа к S3 +S3_ACCESS_KEY= +S3_SECRET_KEY= +# Название бакета для хранения всех данных Gitea +S3_BUCKET= +# Регион Yandex Cloud +S3_LOCATION=ru-central1 +# Использование SSL для подключения к S3 +S3_USE_SSL=true + + + + +# =========================================== +# Конфигурация почтового сервера (SMTP) +# +# Этот блок содержит настройки для отправки электронных писем из Gitea, таких как +# уведомления и сброс пароля. +# =========================================== + +# Включить почтовую службу. +GITEA__mailer__ENABLED=true +# Адрес электронной почты, с которого будут отправляться письма. +GITEA__mailer__FROM=no-reply@gromlab.ru +# Адрес SMTP-сервера. +GITEA__mailer__SMTP_ADDR=smtp.mail.ru +# Порт SMTP-сервера. +GITEA__mailer__SMTP_PORT=465 +# Имя пользователя для аутентификации на SMTP-сервере. +GITEA__mailer__USER=no-reply@gromlab.ru +# Пароль для аутентификации на SMTP-сервере. +GITEA__mailer__PASSWD= +# Протокол для SMTP (для Mail.ru нужен SSL). +GITEA__mailer__PROTOCOL=smtps +# Включить TLS для безопасного соединения. +GITEA__mailer__IS_TLS_ENABLED=true +# Пропустить проверку TLS сертификата (если нужно). +GITEA__mailer__SKIP_VERIFY=false +# Имя хоста для HELO команды. +GITEA__mailer__HELO_HOSTNAME=gromlab.ru