Инструкция по установке Gitea с Docker и HTTPS
Требования
- 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/— корневой URLGITEA__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:
- Создайте резервную копию:
docker-compose down
tar -czf gitea-backup-$(date +%Y%m%d).tar.gz gitea/ postgres/
- Обновите версию образа в
docker-compose.yml - Выполните команды:
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 после установки. Для кастомизации:
- Создайте директорию
/data/gitea/public - Разместите там свои файлы (например,
robots.txt,favicon.ico) - Перезагрузите контейнер
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)