Gogs: полный гайд по self-hosting Git-сервера
Пошаговый гайд по самостоятельному развертыванию приватного Git-сервера Gogs на Docker. Настройка, доступ, интеграция с CI/CD и безопасность для вашего homelab.
Подготовка сервера и установка Docker
Обновите системные пакеты и установите Docker и Docker Compose для управления контейнерами.
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp dockerСоздание директории и файла docker-compose.yml
Создайте отдельную директорию для Gogs и создайте в ней файл docker-compose.yml с настройками контейнеров Gogs и опциональной базы данных PostgreSQL.
mkdir gogs && cd gogs
# Создать файл docker-compose.yml со следующим содержимым:
version: "3.8"
services:
gogs:
image: gogs/gogs:latest
container_name: gogs
restart: unless-stopped
ports:
- "3000:3000"
- "2222:22"
volumes:
- ./gogs_data:/data
environment:
- USER_UID=1000
- USER_GID=1000
networks:
- gogs-net
postgres:
image: postgres:14-alpine
container_name: gogs_db
restart: unless-stopped
environment:
- POSTGRES_USER=gogs
- POSTGRES_PASSWORD=gogs_password
- POSTGRES_DB=gogs
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
- gogs-net
networks:
gogs-net:
driver: bridgeЗапуск контейнеров
Запустите контейнеры в фоновом режиме и проверьте их статус.
docker compose up -d
docker compose psПервоначальная настройка в веб-интерфейсе
Откройте браузер по адресу http://<IP-сервера>:3000. Выберите базу данных (SQLite по умолчанию или PostgreSQL, указав параметры из docker-compose.yml), создайте учетную запись администратора и нажмите 'Install Gogs'.
http://<IP-сервера>:3000Настройка SSH для доступа к репозиториям
Сгенерируйте SSH-ключ на клиенте, добавьте публичный ключ в настройки Gogs (SSH и GPG-ключи) и используйте специальный порт для клонирования.
# Генерация ключа (если нет)
ssh-keygen -t ed25519 -C "your_email@example.com"
# Клонирование репозитория через SSH
git clone ssh://git@<IP-сервера>:2222/username/repo.gitНастройка бэкапа данных
Создайте скрипт для резервного копирования данных контейнера (репозитории, база данных, конфигурация) и добавьте его в cron для автоматического выполнения.
# Пример скрипта backup_script.sh
#!/bin/bash
BACKUP_DIR="/path/to/backups/gogs"
DATE=$(date +%Y%m%d_%H%M%S)
# Бэкап данных контейнера
docker compose exec gogs tar czf /tmp/gogs_backup.tar.gz /data
# Копирование на хост
docker compose cp gogs:/tmp/gogs_backup.tar.gz $BACKUP_DIR/gogs_backup_$DATE.tar.gz
# Очистка старых бэкапов
find $BACKUP_DIR -name "gogs_backup_*.tar.gz" -mtime +30 -delete
# Добавление в crontab (ежедневно в 02:00)
0 2 * * * /path/to/backup_script.shНастройка обратного прокси (Nginx) и SSL
Установите Nginx и Certbot. Создайте конфигурацию Nginx для проксирования трафика на Gogs и получите SSL-сертификат Let's Encrypt. Обновите настройки Gogs, указав внешний домен и HTTPS.
# Установка
sudo apt install nginx certbot python3-certbot-nginx
# Конфигурация Nginx (/etc/nginx/sites-available/gogs.conf)
server {
listen 80;
server_name git.example.com;
location / {
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;
}
}
# Включение конфигурации и перезагрузка
sudo ln -s /etc/nginx/sites-available/gogs.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# Получение SSL сертификата
sudo certbot --nginx -d git.example.comУглубленная конфигурация (app.ini)
При необходимости отредактируйте конфигурационный файл app.ini, расположенный в ./gogs_data/gogs/conf/app.ini (на хосте) или внутри контейнера по пути /data/app.ini. Пример настройки почты, лимитов репозиториев и внешнего URL.
[server]
DOMAIN = git.example.com
HTTP_PORT = 3000
ROOT_URL = https://git.example.com/
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = true
DISABLE_REGISTRATION = false
REQUIRE_SIGNIN_VIEW = true
[mail]
ENABLED = true
PROTOCOL = smtp
SMTP_ADDR = smtp.gmail.com
SMTP_PORT = 587
USER = your.email@gmail.com
PASSWD = ваш_пароль_приложения
FROM = your.email@gmail.com
[repository]
MAX_SIZE = 50
# После изменения файла перезапустите контейнер
docker compose restart gogsКак самостоятельно развернуть Gogs — безболезненный self-hosted Git-сервис
Введение
Самостоятельный Git-сервер предоставляет полный контроль над кодом, гарантирует приватность данных и освобождает от зависимости от внешних SaaS-сервисов. Gogs (Go Git Service) — это легковесное open-source решение для хостинга репозиториев с минимальными требованиями к ресурсам и простым интерфейсом, совместимым с GitHub.
Представление Gogs
Преимущества Gogs:
- Легковесность: написан на Go, не требует Java или сложных зависимостей.
- Простота: минимальная настройка, работа из коробки.
- Open Source: лицензия MIT, активное сообщество.
- Производительность: занимает <50 MB RAM, работает даже на Raspberry Pi.
Альтернативы:
- Gitea: форк Gogs с более частыми обновлениями и расширенными функциями.
- GitLab: полноценная платформа с CI/CD, но требует значительных ресурсов.
Требования и подготовка
Минимальные требования:
- ОС: Linux (Ubuntu/Debian рекомендуется), Windows или macOS.
- Ресурсы: 1 CPU core, 512 MB RAM, 5 GB свободного места.
- Docker: версия 20.10+ (если используется Docker-версия).
- Доступ к порту 80/443 (для веб) и 22 (для SSH).
Подготовка сервера:
- Обновите систему:
sudo apt update && sudo apt upgrade -y - Установите Docker и Docker Compose:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER newgrp docker
Шаг 1: Выбор окружения
Рекомендация: Docker-версия — изолированная среда, легкое обновление, отсутствие конфликтов зависимостей.
Альтернатива: нативная установка — для специфических требований (например, использование системной PostgreSQL). Инструкции по нативной установке доступны на официальном сайте Gogs.
Шаг 2: Развертывание через Docker Compose
Создайте директорию для проекта:
mkdir gogs && cd gogs
Создайте файл docker-compose.yml:
version: "3.8"
services:
gogs:
image: gogs/gogs:latest
container_name: gogs
restart: unless-stopped
ports:
- "3000:3000" # Веб-интерфейс
- "2222:22" # SSH (опционально, если не используется хостовый SSH)
volumes:
- ./gogs_data:/data
environment:
- USER_UID=1000
- USER_GID=1000
networks:
- gogs-net
# Внешняя база данных (опционально, SQLite используется по умолчанию)
postgres:
image: postgres:14-alpine
container_name: gogs_db
restart: unless-stopped
environment:
- POSTGRES_USER=gogs
- POSTGRES_PASSWORD=gogs_password
- POSTGRES_DB=gogs
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
- gogs-net
networks:
gogs-net:
driver: bridge
Примечания:
- Для простоты используется SQLite (база данных в файле), PostgreSQL добавляется при необходимости.
- Порт
2222пробрасывается для SSH, если хостовый SSH занят портом 22.
Запустите контейнеры:
docker compose up -d
Проверьте статус:
docker compose ps
Шаг 3: Первоначальная настройка
Откройте в браузере: http://<IP-сервера>:3000 (или http://localhost:3000 если на локальной машине).
Конфигурация веб-интерфейса:
- База данных: Выберите SQLite (по умолчанию) или подключение к PostgreSQL (указать параметры из
docker-compose.yml). - Администратор: Создайте учетную запись администратора (логин, email, пароль).
- Сервер: Оставьте настройки по умолчанию (путь к репозиториям:
/data/git/repositories, SSH-порт: 2222). - Email (опционально): Настройте SMTP для уведомлений (например, через Gmail или самосервер).
Нажмите "Install Gogs". После установки войдите как администратор.
Шаг 4: Создание первого репозитория и настройка SSH/HTTPS
Создание репозитория:
- В интерфейсе Gogs нажмите "Новый репозиторий".
- Заполните имя, описание, выберите публичный или приватный доступ.
- Создайте репозиторий.
Настройка SSH:
- Сгенерируйте SSH-ключи на клиентской машине (если их нет):
ssh-keygen -t ed25519 -C "your_email@example.com" - В интерфейсе Gogs перейдите в "Настройки" → "SSH и GPG-ключи".
- Добавьте публичный ключ (из
~/.ssh/id_ed25519.pub). - Для клонирования через SSH используйте адрес:
git clone ssh://git@<IP-сервера>:2222/username/repo.git
Настройка HTTPS:
- Создайте токен доступа в "Настройки" → "Токены доступа".
- Клонируйте через HTTPS:
git clone https://git:<token>@<IP-сервера>:3000/username/repo.git
Шаг 5: Интеграция с CI/CD
Вариант 1: Gitea Actions (для Gitea, но Gogs поддерживает Webhooks) Gogs не имеет встроенного CI/CD, но поддерживает Webhooks для интеграции с внешними системами.
Вариант 2: Drone CI Drone — легковесный CI-сервер, интегрируемый с Gogs.
-
Добавьте в
docker-compose.ymlсервис Drone:drone: image: drone/drone:latest container_name: drone restart: unless-stopped ports: - "8080:8080" environment: - DRONE_SERVER_HOST=<IP-сервера>:8080 - DRONE_RPC_SECRET=<генерированный секрет> - DRONE_GOGS=true - DRONE_GOGS_URL=http://<IP-сервера>:3000 - DRONE_GOGS_SKIP_VERIFY=false volumes: - ./drone_data:/data networks: - gogs-net -
Создайте Webhook в Gogs для репозитория: "Настройки" → "Webhooks" → "Добавить webhook" (URL Drone, секрет).
Альтернатива: GitLab Runner или Jenkins для сложных сценариев.
Шаг 6: Настройка бэкапа данных
Данные для бэкапа:
- База данных (если SQLite: файл
/data/gogs.dbв контейнере; PostgreSQL: том./postgres_data). - Хранилище репозиториев (
/data/git/repositories). - Конфигурация (
/data/app.ini).
Пример скрипта бэкапа (добавить в crontab):
#!/bin/bash
BACKUP_DIR="/path/to/backups/gogs"
DATE=$(date +%Y%m%d_%H%M%S)
# Бэкап данных контейнера
docker compose exec gogs tar czf /tmp/gogs_backup.tar.gz /data
# Копирование на хост
docker compose cp gogs:/tmp/gogs_backup.tar.gz $BACKUP_DIR/gogs_backup_$DATE.tar.gz
# Очистка старых бэкапов (старше 30 дней)
find $BACKUP_DIR -name "gogs_backup_*.tar.gz" -mtime +30 -delete
Расписание: Добавьте в crontab:
0 2 * * * /path/to/backup_script.sh
Шаг 7: Настройка reverse proxy (Nginx) и SSL
Установка Nginx:
sudo apt install nginx
Конфигурация Nginx (файл /etc/nginx/sites-available/gogs.conf):
server {
listen 80;
server_name git.example.com; # Замените на ваш домен
location / {
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;
proxy_set_header X-Forwarded-Host $host;
}
}
Включите конфигурацию:
sudo ln -s /etc/nginx/sites-available/gogs.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
SSL от Let's Encrypt (через Certbot):
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d git.example.com
Certbot автоматически обновит Nginx-конфигурацию с SSL.
Обновление Gogs для использования обратного прокси:
В настройках Gogs (Настройки сервера → Адрес сервера) укажите:
Серверный URL:https://git.example.comHTTP(S) порт: 443Протокол: HTTPS
Шаг 8: Углубленная конфигурация
Настройки сервера (файл app.ini в /data/ контейнера):
[server]
DOMAIN = git.example.com
HTTP_PORT = 3000
ROOT_URL = https://git.example.com/
ENABLE_LOG_ROTATION = true
ENABLE_STATIC_MODE = false
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = true
DISABLE_REGISTRATION = false
REQUIRE_SIGNIN_VIEW = true
SHOW_REGISTRATION_BUTTON = false
SHOW_MIRRORS = true
SHOW_FORGE_PULLED_MERGE = true
SHOW_FORGE_PULL_MERGE = true
SHOW_FORGEPushPullMerge = true
[mail]
ENABLED = true
PROTOCOL = smtp
SMTP_ADDR = smtp.gmail.com
SMTP_PORT = 587
USER = your.email@gmail.com
PASSWD = ваш_пароль_приложения
FROM = your.email@gmail.com
Лимиты (защита от DoS):
[repository]
MAX_SIZE = 50 # Макс. размер репозитория в МБ
MAX_TICKETS = 1000
MAX_FILES = 10000
[lfs]
ENABLED = true
MAX_SIZE = 50
Перезапуск контейнера после изменений:
docker compose restart gogs
Заключение
Вы развернули полноценный self-hosted Git-сервер Gogs с базовой CI/CD, бэкапами и SSL. Сервис готов к использованию для командной разработки.
Полезные ссылки:
Призыв к действию: Начните с простого репозитория, протестируйте workflows, а затем расширяйте функционал под ваши задачи. Удачи!