Гид по технологиям

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

• 9 min read • Инфраструктура • Обновлено 21 Nov 2025
Установка Gitea в Docker на Rocky Linux
Установка Gitea в Docker на Rocky Linux

Логотип Gitea и схема развертывания

О чём эта инструкция

Эта пошаговая инструкция рассчитана на системного администратора или инженера 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.

Структура руководства

  1. Настройка брандмауэра
  2. Установка Docker
  3. Установка Docker Compose
  4. Конфигурация и запуск Gitea
  5. SSL через Let’s Encrypt
  6. Установка и настройка Nginx
  7. Доступ и первоначальная настройка Gitea
  8. Создание репозитория, настройка SSH, первый коммит
  9. Резервное копирование и обновления
  10. Отладка, безопасность и лучшие практики

Шаг 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 для уведомлений — укажите хост, порт, учётные данные.

На странице дополнительных настроек можно отключить саморегистрацию, скрыть адреса электронной почты по умолчанию и настроить интеграции.

Создайте административную учётную запись и завершите установку.

Экран установки Gitea: создание администратора

Если при установке возникает ошибка 502, обновите страницу и проверьте логи Gitea и Nginx.


Шаг 8 — Создание первого репозитория

Через веб-интерфейс нажмите плюс (+) и создайте новый репозиторий — заполните имя, описание, лицензию и выберите ветку по умолчанию.

Кнопка создания репозитория в Gitea

После создания вы попадёте на страницу репозитория с инструкцией по клонированию по 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.

Коммит в Gitea


Шаг 12 — Обновление Gitea (обновление контейнеров)

Порядок обновления:

  1. Остановите и удалите старые контейнеры (данные сохранены на хосте):
$ cd ~/gitea-docker
$ docker-compose down --remove-orphans
  1. Обновите тег образа в docker-compose.yml (например на новую версию) и выполните pull:
$ docker-compose pull
  1. Поднимите сервисы заново:
$ docker-compose up -d
  1. Проверьте логи и состояние контейнеров.

Совет: перед обновлением делайте резервную копию данных и схемы БД.


Практические дополнения и лучшие практики

Резервное копирование и восстановление (SOP)

Резервные объекты:

  • Том Gitea: ~/gitea-docker/gitea
  • Том PostgreSQL: ~/gitea-docker/postgres
  • Конфигурация docker-compose.yml и /etc/nginx/*
  • Сертификаты /etc/letsencrypt

Резервный скрипт (примерная последовательность):

  1. Остановить приложение: docker-compose down
  2. Создать архивы томов:
$ tar -czf gitea-data-$(date +%F).tar.gz gitea/
$ tar -czf postgres-data-$(date +%F).tar.gz postgres/
  1. Скопировать архивы на удалённый бэкап-репозиторий или в S3.
  2. Запустить сервисы: docker-compose up -d

Восстановление:

  1. Остановить сервисы.
  2. Распаковать архивы в соответствующие каталоги.
  3. Запустить контейнеры.

Критерии приёмки:

  • 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.
    • Клонировал репозиторий и выполнил первый коммит.
  • Владелец продукта / Менеджер:

    • Принял критерии приёмки и права доступа.

Мини-методология проверки готовности к продакшену

  1. Функциональная проверка: регистрация, создание репозитория, клонирование, пуш, пулл.
  2. Безопасность: проверка SSL, SSH, права доступа, отсутствие излишних root-привилегий.
  3. Непрерывность: резервирование данных, проверка восстановления из бэкапа.
  4. Наблюдаемость: есть ли логи, метрики, алерты.

Короткий справочник (глоссарий, 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 или внешние хранилища для паролей.
  • Регулярно обновляйте образы и систему.

Если у вас возникли вопросы по конкретным шагам — опишите конфигурацию и логи, и мы поможем с отладкой.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро