Инструкция по установке Gitea с Docker и HTTPS

Pavel 15.12.2025 16:11 31 просмотров

Требования

  • Docker Engine 20.10+
  • Docker Compose v2
  • Минимум 2-4 GB RAM и 2-4 cores CPU для команды до 10 пользователей
  • Доменное имя, указывающее на ваш сервер
  • Для Let's Encrypt: открытый доступ на порт 80

Базовая установка

1. Создание структуры проекта

Создайте директорию для Gitea и перейдите в неё:

mkdir gitea && cd gitea

HTTPS с Let's Encrypt

2. Генерация SSL сертификата с Certbot

Для Debian/Ubuntu:

sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

Для CentOS/RHEL 7/8/9:

# CentOS 7
sudo yum install epel-release
sudo yum install certbot python-certbot-nginx

# CentOS 8/9 / RHEL 8/9
sudo dnf install certbot python3-certbot-nginx

Генерация сертификата (для обеих ОС)

Замените your-domain.com на ваше доменное имя:

sudo certbot certonly --standalone -d your-domain.com

Certbot сохранит сертификаты в /etc/letsencrypt/live/your-domain.com/.

3. Скопируйте сертификаты в проект

Для Debian/Ubuntu:

sudo mkdir -p ./certs
sudo cp /etc/letsencrypt/live/your-domain.com/fullchain.pem ./certs/
sudo cp /etc/letsencrypt/live/your-domain.com/privkey.pem ./certs/
sudo chown -R $(id -u):$(id -g) ./certs

Для CentOS/RHEL:

sudo mkdir -p ./certs
sudo cp /etc/letsencrypt/live/your-domain.com/fullchain.pem ./certs/
sudo cp /etc/letsencrypt/live/your-domain.com/privkey.pem ./certs/
sudo chown -R $(id -u):$(id -g) ./certs
sudo chmod 644 ./certs/fullchain.pem
sudo chmod 640 ./certs/privkey.pem

Установка Docker и Docker Compose

Для Debian/Ubuntu:

# Установка Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Добавление пользователя в группу docker
sudo usermod -aG docker $USER
newgrp docker

# Установка Docker Compose v2
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Для CentOS/RHEL:

# CentOS 7
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io

# CentOS 8/9 / RHEL 8/9
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io

# Запуск Docker демона
sudo systemctl start docker
sudo systemctl enable docker

# Добавление пользователя в группу docker
sudo usermod -aG docker $USER
newgrp docker

# Установка Docker Compose v2
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Docker Compose конфигурация с HTTPS

Конфигурация с PostgreSQL и HTTPS

Создайте файл docker-compose.yml:

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: docker.gitea.com/gitea:1.25.1
    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
      - GITEA__server__PROTOCOL=https
      - GITEA__server__DOMAIN=your-domain.com
      - GITEA__server__ROOT_URL=https://your-domain.com/
      - GITEA__server__CERT_FILE=/data/certs/fullchain.pem
      - GITEA__server__KEY_FILE=/data/certs/privkey.pem
      - GITEA__server__HTTP_PORT=3000
      - GITEA__server__HTTPS_PORT=443
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - ./certs:/data/certs:ro
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "80:3000"
      - "443:3000"
      - "222:22"
    depends_on:
      - db

  db:
    image: docker.io/library/postgres:14
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=gitea
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - ./postgres:/var/lib/postgresql/data

Конфигурация с Nginx Reverse Proxy (рекомендуется для production)

Для лучшей гибкости рекомендуется использовать Nginx как reverse proxy:

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: docker.gitea.com/gitea:1.25.1
    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
      - GITEA__server__PROTOCOL=http
      - GITEA__server__DOMAIN=your-domain.com
      - GITEA__server__ROOT_URL=https://your-domain.com/
      - GITEA__server__HTTP_PORT=3000
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    expose:
      - "3000"
    depends_on:
      - db

  nginx:
    image: nginx:latest
    container_name: gitea-nginx
    restart: always
    networks:
      - gitea
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/nginx/certs:ro
    depends_on:
      - server

  db:
    image: docker.io/library/postgres:14
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=gitea
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - ./postgres:/var/lib/postgresql/data

Конфигурация Nginx

Создайте файл nginx.conf:

events {
    worker_connections 1024;
}

http {
    upstream gitea {
        server server:3000;
    }

    # Редирект с HTTP на HTTPS
    server {
        listen 80;
        server_name your-domain.com;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl http2;
        server_name your-domain.com;

        # SSL сертификаты
        ssl_certificate /etc/nginx/certs/fullchain.pem;
        ssl_certificate_key /etc/nginx/certs/privkey.pem;

        # SSL конфигурация
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        # Заголовки безопасности
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-XSS-Protection "1; mode=block" always;

        client_max_body_size 512M;

        location / {
            proxy_pass http://gitea;
            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;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Port $server_port;

            # WebSocket поддержка
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_connect_timeout 600s;
            proxy_send_timeout 600s;
            proxy_read_timeout 600s;
        }
    }
}

Запуск и управление

Запуск контейнеров

docker-compose up -d

Проверка статуса

docker-compose ps

Просмотр логов

docker-compose logs

Остановка

docker-compose down

Конфигурация брандмауэра

Для Debian/Ubuntu (UFW):

# Открытие портов
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 222/tcp
sudo ufw enable

Для CentOS/RHEL (FirewallD):

# CentOS 7
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=222/tcp
sudo firewall-cmd --reload

# CentOS 8/9 / RHEL 8/9
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=222/tcp
sudo firewall-cmd --reload

Первоначальная настройка

После запуска откройте в браузере https://your-domain.com и завершите установку через веб-интерфейс. При использовании PostgreSQL в настройках базы данных укажите db как хост базы данных.

Настройка портов

При использовании Nginx reverse proxy: - Порт 80 для HTTP (автоматический редирект на HTTPS) - Порт 443 для HTTPS - Порт 222 для SSH (маппится на хост-порт 222)

Для изменения SSH портов отредактируйте секцию ports в docker-compose.yml:

ports:
  - "80:80"
  - "443:443"
  - "2221:22"  # SSH на нестандартном порту

Переменные окружения

Базовые параметры

  • USER_UID=1000 — UID пользователя внутри контейнера
  • USER_GID=1000 — GID пользователя внутри контейнера

Параметры для HTTPS

  • GITEA__server__PROTOCOL=https — протокол (https или http)
  • GITEA__server__DOMAIN=your-domain.com — доменное имя
  • GITEA__server__ROOT_URL=https://your-domain.com/ — корневой URL
  • GITEA__server__CERT_FILE=/data/certs/fullchain.pem — путь к сертификату (при прямом HTTPS в Gitea)
  • GITEA__server__KEY_FILE=/data/certs/privkey.pem — путь к приватному ключу (при прямом HTTPS в Gitea)

Настройка SMTP (опционально)

environment:
  - GITEA__mailer__ENABLED=true
  - GITEA__mailer__FROM=gitea@your-domain.com
  - GITEA__mailer__PROTOCOL=smtps
  - GITEA__mailer__SMTP_ADDR=smtp.example.com
  - GITEA__mailer__SMTP_PORT=465
  - GITEA__mailer__USER=your-email@example.com
  - GITEA__mailer__PASSWD=your-password

Генерация секретов

Перед первым запуском рекомендуется сгенерировать секретные ключи:

docker run -it --rm docker.gitea.com/gitea:1 gitea generate secret SECRET_KEY
docker run -it --rm docker.gitea.com/gitea:1 gitea generate secret INTERNAL_TOKEN

Добавьте их в docker-compose.yml:

environment:
  - GITEA__security__SECRET_KEY=<generated_secret_key>
  - GITEA__security__INTERNAL_TOKEN=<generated_internal_token>

Автоматическое обновление сертификатов Let's Encrypt

Создание скрипта обновления

Создайте скрипт для автоматического обновления сертификатов:

Для Debian/Ubuntu и CentOS/RHEL:

cat > /usr/local/bin/renew-gitea-certs.sh << 'EOF'
#!/bin/bash

# Путь к проекту Gitea
GITEA_PATH="/path/to/gitea"

# Обновление сертификата
certbot renew --quiet

# Копирование обновленных сертификатов
cp /etc/letsencrypt/live/your-domain.com/fullchain.pem $GITEA_PATH/certs/
cp /etc/letsencrypt/live/your-domain.com/privkey.pem $GITEA_PATH/certs/

# Перезагрузка контейнеров (если использует прямой HTTPS в Gitea)
cd $GITEA_PATH
docker-compose restart server

# Или перезагрузка Nginx (если использует Nginx reverse proxy)
# docker-compose restart nginx

EOF

sudo chmod +x /usr/local/bin/renew-gitea-certs.sh

Добавление в crontab (выполнять ежедневно в 02:00)

Для Debian/Ubuntu:

sudo crontab -e

Добавьте строку:

0 2 * * * /usr/local/bin/renew-gitea-certs.sh

Для CentOS/RHEL:

sudo crontab -e

Добавьте строку:

0 2 * * * /usr/local/bin/renew-gitea-certs.sh

Или используйте systemd timer (CentOS 8/9, RHEL 8/9):

cat > /etc/systemd/system/renew-gitea-certs.timer << 'EOF'
[Unit]
Description=Daily renewal of Gitea SSL certificates
Requires=renew-gitea-certs.service

[Timer]
OnCalendar=daily
OnCalendar=02:00

[Install]
WantedBy=timers.target
EOF

cat > /etc/systemd/system/renew-gitea-certs.service << 'EOF'
[Unit]
Description=Renew Gitea SSL certificates

[Service]
Type=oneshot
ExecStart=/usr/local/bin/renew-gitea-certs.sh
EOF

sudo systemctl daemon-reload
sudo systemctl enable renew-gitea-certs.timer
sudo systemctl start renew-gitea-certs.timer

Обновление

Для обновления Gitea на новую версию:

Для Debian/Ubuntu и CentOS/RHEL:

  1. Создайте резервную копию:
docker-compose down
tar -czf gitea-backup-$(date +%Y%m%d).tar.gz gitea/ postgres/
  1. Обновите версию образа в docker-compose.yml
  2. Выполните команды:
docker-compose pull
docker-compose up -d

Использование Named Volumes

Для автоматического управления правами доступа можно использовать именованные тома:

version: "3"

networks:
  gitea:
    external: false

volumes:
  gitea:
    driver: local
  postgres:
    driver: local

services:
  server:
    image: docker.gitea.com/gitea:1.25.1
    volumes:
      - gitea:/data
      - ./certs:/data/certs:ro
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

  db:
    image: docker.io/library/postgres:14
    volumes:
      - postgres:/var/lib/postgresql/data

Best Practices

Безопасность

  • Используйте сильные пароли для базы данных
  • Включите 2FA для администраторов
  • Используйте non-standard SSH порт (например, 2221)
  • Регулярно обновляйте SSL сертификаты
  • Ограничьте доступ на SSH только необходимым пользователям
  • Используйте SELinux на CentOS/RHEL для дополнительной безопасности

Бэкапы

  • Регулярно создавайте резервные копии директорий ./gitea и ./postgres
  • Храните бэкапы на отдельном сервере
  • Тестируйте восстановление из бэкапов
  • Используйте утилиту tar для сжатия бэкапов

Мониторинг

  • Следите за использованием ресурсов через docker stats
  • Настройте мониторинг логов и уведомления об ошибках
  • Используйте инструменты типа Grafana + Prometheus для метрик
  • На CentOS/RHEL используйте SELinux аудиты

Production окружение

  • Используйте PostgreSQL вместо SQLite
  • Тестируйте новые версии на staging перед обновлением production
  • Настройте резервное копирование и восстановление
  • Используйте Nginx reverse proxy для дополнительной безопасности
  • Включите логирование всех операций
  • На CentOS/RHEL используйте FirewallD для управления трафиком

Кастомизация

Файл конфигурации будет сохранён в /data/gitea/conf/app.ini после установки. Для кастомизации:

  1. Создайте директорию /data/gitea/public
  2. Разместите там свои файлы (например, robots.txt, favicon.ico)
  3. Перезагрузите контейнер

SSH Доступ (опционально)

Docker Shell (рекомендуется для обеих ОС)

Создайте shell-скрипт для git пользователя:

Для Debian/Ubuntu и CentOS/RHEL:

cat <<'EOF' | sudo tee /home/git/docker-shell
#!/bin/sh
/usr/bin/docker exec -i -u git --env SSH_ORIGINAL_COMMAND="$SSH_ORIGINAL_COMMAND" gitea sh "$@"
EOF

sudo chmod +x /home/git/docker-shell
sudo usermod -s /home/git/docker-shell git

Убедитесь, что git пользователь имеет права на запуск docker exec.

Проверка SSL сертификата

# Проверка сертификата
openssl x509 -in ./certs/fullchain.pem -text -noout

# Проверка дня истечения сертификата
openssl x509 -in ./certs/fullchain.pem -noout -dates

# Проверка с помощью online инструмента
openssl s_client -connect your-domain.com:443 -tls1_2

Диагностика проблем

Проверка логов Docker

# Логи всех контейнеров
docker-compose logs

# Логи Gitea
docker-compose logs server

# Логи Nginx
docker-compose logs nginx

# Логи PostgreSQL
docker-compose logs db

# Реальное время логирование
docker-compose logs -f server

Проверка доступа к портам

Для Debian/Ubuntu:

# Проверка открытых портов
sudo ss -tlnp | grep docker

# Альтернатива
sudo netstat -tlnp | grep docker

Для CentOS/RHEL:

# Проверка открытых портов
sudo ss -tlnp | grep docker

# Альтернатива
sudo netstat -tlnp | grep docker

# Проверка FirewallD
sudo firewall-cmd --list-all

Проверка размера дискового пространства

# Общее использование Docker
docker system df

# Использование контейнеров
docker-compose ps -a

# Размер томов
docker volume ls -f dangling=false

Важные замечания

  • Убедитесь, что дирректория ./gitea имеет правильные права доступа (UID/GID 1000)
  • Никогда не потеряйте SECRET_KEY — зашифрованные данные не смогут быть расшифрованы после его изменения
  • Регулярно обновляйте образ Gitea для получения патчей безопасности
  • При использовании Let's Encrypt убедитесь, что порт 80 открыт для проверки доменов
  • Сохраняйте копию приватного ключа SSL сертификата в безопасном месте
  • Проверяйте логи Gitea и Nginx для диагностики проблем: docker-compose logs -f
  • На CentOS/RHEL убедитесь, что SELinux не блокирует работу Docker (если используется)
  • Убедитесь, что Docker демон запущен и включен в автозагрузку (sudo systemctl status docker)

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

Для добавления комментария необходимо войти в аккаунт

Войти / Зарегистрироваться