Установка Gitea в Docker на Rocky Linux

О чём эта инструкция
Эта пошаговая инструкция рассчитана на системного администратора или инженера DevOps, который хочет быстро и устойчиво развернуть Gitea — лёгкую систему хостинга Git — в контейнерах Docker на Rocky Linux 8. Покрыты требования, конфигурация сети и брандмауэра, Docker и Docker Compose, настройка PostgreSQL как бекенда, получение SSL, настройка Nginx как прокси и практические действия для разработчиков (SSH, клонирование, первый коммит).
Важно: предварительно в разделе «Требования» указан пункт “Отключить SELinux” как исходный предпосыл — если безопасность важна, рассмотрите корректную конфигурацию SELinux вместо полного отключения.
Основные преимущества этого подхода
- Лёгкий и переносимый стек: Gitea + PostgreSQL в Docker-контейнерах.
- Простая масштабируемость и резервирование данных через монтируемые тома.
- Nginx + Let’s Encrypt для безопасного публичного доступа.
Кому это подходит
- Малые и средние команды, которым нужен приватный Git-хостинг.
- Инженерам, предпочитающим self-hosted решения вместо SaaS.
Предварительные требования
- Сервер с Rocky Linux 8.5 (или совместимая ветка Rocky 8).
- Непользователь root: пользователь с sudo-привилегиями.
- Отключённый SELinux (или правильно настроенный профиль SELinux для контейнеров).
- Обновление пакетов: выполните
$ sudo dnf update- Установите базовые утилиты:
$ sudo dnf install yum-utils nano curl- Зарезервированное FQDN (полное доменное имя), указывающее на сервер, например: gitea.example.com
Примечание: в продакшене используйте корректные DNS-записи и, по возможности, статический IP.
Структура руководства
- Настройка брандмауэра
- Установка Docker
- Установка Docker Compose
- Конфигурация и запуск Gitea
- SSL через Let’s Encrypt
- Установка и настройка Nginx
- Доступ и первоначальная настройка Gitea
- Создание репозитория, настройка SSH, первый коммит
- Резервное копирование и обновления
- Отладка, безопасность и лучшие практики
Шаг 1 — Настройка брандмауэра (Firewalld)
Rocky Linux использует firewalld по умолчанию. Проверьте состояние:
$ sudo firewall-cmd --state
runningПроверка активных сервисов в зоне public:
$ sudo firewall-cmd --permanent --list-servicesРазрешите HTTP и HTTPS:
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=httpsОткройте нестандартный SSH-порт для Gitea (в примере 2221):
$ sudo firewall-cmd --permanent --add-port=2221/tcpПросмотрите итоговую конфигурацию:
$ sudo firewall-cmd --permanent --list-allПерезагрузите конфигурацию firewalld:
$ sudo firewall-cmd --reloadСовет: при использовании облачных провайдеров также проверьте правила сети/ACL на уровне облака.
Шаг 2 — Установка Docker
Rocky Linux может поставляться с устаревшими пакетами: добавим официальный репозиторий Docker и установим актуальную версию.
Добавление репозитория Docker:
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repoУстановка Docker Engine и компонентов:
$ sudo dnf install docker-ce docker-ce-cli containerd.ioВключите и запустите демона Docker:
$ sudo systemctl enable docker --nowПроверка статуса:
$ sudo systemctl status dockerДля удобства добавьте пользователя в группу docker (требуется повторный вход):
$ sudo usermod -aG docker $(whoami)Важно: группа docker по факту даёт привилегии root к контейнерам — применяйте осторожно.
Шаг 3 — Установка Docker Compose
Скачайте стабильный релиз Docker Compose и сделайте его исполняемым:
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-composeПроверьте версию:
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c(Опционально) установите автодополнение Bash:
$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
$ source ~/.bashrcШаг 4 — Конфигурация и установка Gitea
Настройка системного часового пояса
Проверьте текущее значение:
$ timedatectlУстановите нужную зону, например для Москвы:
$ sudo timedatectl set-timezone Europe/MoscowСоздание директорий для данных
Создайте рабочую папку и поддиректории для томов Gitea и PostgreSQL:
$ mkdir ~/gitea-docker
$ cd ~/gitea-docker
$ mkdir gitea postgresПолучение UID и GID текущего пользователя
Gitea в контейнере будет создавать файлы от имени указанных UID/GID, чтобы избегать проблем с правами:
$ echo $(id -u)
1000
$ echo $(id -g)
1000Запомните значения и используйте их в docker-compose.
Пример docker-compose.yml
Создайте файл docker-compose.yml в ~/gitea-docker и вставьте содержимое ниже, подставив свои UID и GID:
version: \"3\"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.16.6
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- \"3000:3000\"
- \"2221:22\"
depends_on:
- db
db:
image: postgres:14
restart: always
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=gitea
- POSTGRES_DB=gitea
networks:
- gitea
volumes:
- ./postgres:/var/lib/postgresql/dataПояснения:
- Контейнеры соединены внутренней сетью docker под именем gitea.
- Том ./gitea содержит все данные Gitea и конфигурацию (/data внутри контейнера).
- Публичные порты 3000 (веб) и 2221 (SSH для Git) проброшены на хост.
Сохраните файл и запустите контейнеры:
$ docker-compose up -dПроверьте статус контейнеров:
$ docker psЕсли контейнеры не стартуют, смотрите лог контейнера Gitea:
$ docker logs -f giteaШаг 5 — Установка SSL (Let’s Encrypt)
Для получения сертификата используем certbot.
Установка EPEL и certbot:
$ sudo dnf install epel-release
$ sudo dnf install certbotПолучение сертификата в режиме standalone (требует свободного порта 80 на хосте):
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m admin@example.com -d gitea.example.comСертификаты сохраняются в /etc/letsencrypt/live/gitea.example.com
Создание параметров Diffie-Hellman:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096Создайте веб-корень для webroot challenge (используется при автоматическом обновлении):
$ sudo mkdir -p /var/lib/letsencryptАвтообновление сертификатов: создайте /etc/cron.daily/certbot-renew с содержимым:
#!/bin/sh
certbot renew --cert-name gitea.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"Сделайте скрипт исполняемым:
$ sudo chmod +x /etc/cron.daily/certbot-renewПримечание: при использовании Docker и проброса портов убедитесь, что certbot может привязаться к порту 80, либо используйте webroot-метод через Nginx.
Шаг 6 — Установка и настройка Nginx
Добавьте официальный репозиторий Nginx и установите пакет:
$ sudo nano /etc/yum.repos.d/nginx.repo
# вставьте репозиторий nginx
$ sudo dnf install nginx
$ sudo systemctl enable nginx --nowПример конфигурации /etc/nginx/conf.d/gitea.conf (адаптируйте gitea.example.com):
# Redirect all non-encrypted to encrypted
server {
listen 80;
listen [::]:80;
server_name gitea.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name gitea.example.com;
ssl_certificate /etc/letsencrypt/live/gitea.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/gitea.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/gitea.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
access_log /var/log/nginx/gitea.example.com.access.log main;
error_log /var/log/nginx/gitea.example.com.error.log;
location / {
client_max_body_size 100M;
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;
}
}Добавьте в /etc/nginx/nginx.conf строку server_names_hash_bucket_size 64; перед include и проверьте конфиг:
$ sudo nginx -t
$ sudo systemctl restart nginxСовет: при использовании reverse proxy в docker-сети можно проксировать на внутренний IP контейнера или использовать socket, но в нашем примере применяется проброс хост->контейнер.
Шаг 7 — Доступ и первичная настройка Gitea
Откройте в браузере https://gitea.example.com — появится экран установки. Большая часть полей предзаполнится из docker-compose.
- Server Domain: gitea.example.com
- Gitea Base URL: https://gitea.example.com
- SSH Server Port: 2221 (если вы используете 2221, как в compose)
При необходимости добавьте SMTP для уведомлений — укажите хост, порт, учётные данные.
На странице дополнительных настроек можно отключить саморегистрацию, скрыть адреса электронной почты по умолчанию и настроить интеграции.
Создайте административную учётную запись и завершите установку.

Если при установке возникает ошибка 502, обновите страницу и проверьте логи Gitea и Nginx.
Шаг 8 — Создание первого репозитория
Через веб-интерфейс нажмите плюс (+) и создайте новый репозиторий — заполните имя, описание, лицензию и выберите ветку по умолчанию.

После создания вы попадёте на страницу репозитория с инструкцией по клонированию по HTTPS и SSH.
Шаг 9 — Настройка SSH для доступа к репозиторию
На локальной машине создайте SSH-ключ (пример для Ubuntu):
$ ssh-keygen -f ~/.ssh/gitea-demo -t rsa -b 4096 -C \"Gitea Demo\" -q -N \"yourpassphrase\"Экспортируйте публичный ключ и добавьте его в Gitea: Настройки → SSH/GPG Keys → Add Key.
$ cat ~/.ssh/gitea-demo.pubЗапустите ssh-agent и добавьте ключ:
$ eval $(ssh-agent -t 3600)
$ ssh-add ~/.ssh/gitea-demoПроверьте, что SSH-доступ работает, выполнив git clone по SSH.
Шаг 10 — Клонирование репозитория по SSH
Скопируйте SSH-URL репозитория, например:
ssh://[email protected]:2221/navjot/howtoforge.gitКлонируйте:
$ git clone ssh://[email protected]:2221/navjot/howtoforge.gitПри первом подключении подтвердите fingerprint и добавьте хост в known_hosts.
Шаг 11 — Первый коммит и пуш
Отредактируйте README.md, добавьте изменения, зафиксируйте и запушьте:
$ git add README.md
$ git commit -m "Update the Readme file for Gitea tutorial."
$ git push origin masterПроверьте, что коммит появился в веб-интерфейсе Gitea.

Шаг 12 — Обновление Gitea (обновление контейнеров)
Порядок обновления:
- Остановите и удалите старые контейнеры (данные сохранены на хосте):
$ cd ~/gitea-docker
$ docker-compose down --remove-orphans- Обновите тег образа в docker-compose.yml (например на новую версию) и выполните pull:
$ docker-compose pull- Поднимите сервисы заново:
$ docker-compose up -d- Проверьте логи и состояние контейнеров.
Совет: перед обновлением делайте резервную копию данных и схемы БД.
Практические дополнения и лучшие практики
Резервное копирование и восстановление (SOP)
Резервные объекты:
- Том Gitea: ~/gitea-docker/gitea
- Том PostgreSQL: ~/gitea-docker/postgres
- Конфигурация docker-compose.yml и /etc/nginx/*
- Сертификаты /etc/letsencrypt
Резервный скрипт (примерная последовательность):
- Остановить приложение: docker-compose down
- Создать архивы томов:
$ tar -czf gitea-data-$(date +%F).tar.gz gitea/
$ tar -czf postgres-data-$(date +%F).tar.gz postgres/- Скопировать архивы на удалённый бэкап-репозиторий или в S3.
- Запустить сервисы: docker-compose up -d
Восстановление:
- Остановить сервисы.
- Распаковать архивы в соответствующие каталоги.
- Запустить контейнеры.
Критерии приёмки:
- Gitea возвращается в рабочее состояние после восстановления.
- Все репозитории доступны и сертификаты валидны.
Жёсткая политика безопасности (рекомендации)
- Не храните пароли в Docker Compose в открытом виде — используйте Docker secrets или внешнюю систему управления секретами.
- Разрешайте доступ по SSH только с известных IP, если возможно.
- Ограничьте привилегии группы docker, избегайте добавления лишних пользователей.
- Регулярно обновляйте образы и пакеты.
- Настройте мониторинг и алерты (логирование контейнеров, метрики).
Настройка бэкенда базы данных
- В продакшене рассмотрите отдельный кластер PostgreSQL или managed PostgreSQL.
- Настройте регулярные дампы pg_dump и WAL-репликацию по необходимости.
Тестовые сценарии и критерии приёмки
- Установка сервиса по инструкции без ошибок.
- Успешное создание репозитория, клонирование, пуш и пулл по SSH и HTTPS.
- Автообновление сертификата certbot проходит без ошибок.
- Ручное восстановление из резервной копии возвращает сервис в рабочее состояние.
Отладка: частые ошибки и решения
- Контейнер Gitea не стартует: смотрите docker logs gitea. Частая причина — неверные права на том или конфликт UID/GID.
- Проблемы с подключением к БД: проверьте переменные окружения в compose, что хост db доступен внутри сети gitea.
- Nginx возвращает 502: проверьте, что Gitea слушает на localhost:3000 и что proxy_pass настроен корректно.
- Certbot не может получить сертификат: убедитесь, что порт 80 доступен и не блокируется внутренним прокси.
Альтернативные подходы
- Развёртывание Gitea как системного сервиса (без Docker) — подходит для систем с ограниченным Docker-поддержанием.
- Использовать Kubernetes с манифестами Helm-чартов Gitea для масштабируемости и высокой доступности.
- Использовать внешнюю managed БД (например RDS) вместо PostgreSQL в контейнере для упрощения резервирования.
Плюсы Docker-стека: простота управления и переносимость. Минусы: на одном хосте не обеспечивает высокой доступности.
Роли и чек-листы (кто что делает)
Sysadmin / DevOps:
- Настроил сервер, брандмауэр, Docker и Nginx.
- Настроил SSL и мониторинг.
- Настроил резервное копирование.
Разработчик:
- Сгенерировал SSH-ключ и добавил его в Gitea.
- Клонировал репозиторий и выполнил первый коммит.
Владелец продукта / Менеджер:
- Принял критерии приёмки и права доступа.
Мини-методология проверки готовности к продакшену
- Функциональная проверка: регистрация, создание репозитория, клонирование, пуш, пулл.
- Безопасность: проверка SSL, SSH, права доступа, отсутствие излишних root-привилегий.
- Непрерывность: резервирование данных, проверка восстановления из бэкапа.
- Наблюдаемость: есть ли логи, метрики, алерты.
Короткий справочник (глоссарий, 1 строка)
- Gitea — лёгкая система хостинга Git, альтернатива GitHub/GitLab для self-host.
- Docker Compose — инструмент для описания и запуска мультиконтейнерных Docker-приложений.
- Certbot — клиент Let’s Encrypt для автоматического получения SSL-сертификатов.
- Nginx — высокопроизводительный HTTP-сервер и обратный прокси.
Частые вопросы (FAQ)
Можно ли запускать Gitea с SELinux включённым?
Да, можно, но потребуется настроить политики SELinux для разрешения доступа контейнера к смонтированным томам и портам. Полное отключение SELinux проще, но менее безопасно.
Поддерживает ли Gitea масштабирование?
Gitea можно масштабировать горизонтально для веб-части, но база данных и файловое хранилище требуют отдельной архитектуры (внешняя БД, NFS/S3 для LFS/загрузок).
Как сделать бэкап репозиториев без остановки сервиса?
Делайте резервные копии файлового тома и используйте логическую репликацию PostgreSQL или pg_dump с периодическими snapshot-ами. Для консистентности можно выполнить краткую остановку записи.
Итог и рекомендации
- Для небольших команд этот стек — быстрый и надёжный способ развернуть приватный Git-хост.
- В продакшене стоит вынести БД на отдельный сервис, хранить секреты в безопасном хранилище и настроить мониторинг и уведомления.
Summary:
- Убедитесь в наличии резервных копий перед обновлением.
- Используйте Docker secrets или внешние хранилища для паролей.
- Регулярно обновляйте образы и систему.
Если у вас возникли вопросы по конкретным шагам — опишите конфигурацию и логи, и мы поможем с отладкой.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента