Установка Gitea на VPS: Легковесний self-hosted Git-сервер з Docker та SSL
TL;DR
У цьому посібнику ми налаштуємо Gitea — легковесний і потужний self-hosted Git-сервер — на вашому VPS, використовуючи Docker та автоматичне отримання SSL-сертифікатів через Caddy. Ви отримаєте повністю функціональну платформу для керування репозиторіями, доступну через доменне ім'я з HTTPS, готову для командної розробки або особистих проєктів.
- Налаштуємо сучасний VPS на базі Ubuntu 24.04 LTS з базовим захистом.
- Встановимо Docker та Docker Compose для зручного керування застосунками.
- Розгорнемо Gitea в контейнері Docker, використовуючи постійні томи для даних.
- Налаштуємо Caddy як зворотний проксі для Gitea, автоматично забезпечуючи HTTPS з Let's Encrypt.
- Підготуємо систему резервного копіювання для захисту ваших даних.
- Отримаємо контроль над власною Git-інфраструктурою, повністю незалежною від сторонніх сервісів.
Що ми налаштовуємо і навіщо
У сучасному світі розробки Git став стандартом де-факто для контролю версій коду. Однак, покладатися на сторонні сервіси, такі як GitHub, GitLab.com або Bitbucket, не завжди оптимально. Для багатьох команд та індивідуальних розробників виникає потреба у власному, повністю контрольованому Git-сервері. Саме це завдання вирішує Gitea.
Gitea — це легковесний, відкритий та самохостинговий (self-hosted) сервіс Git, написаний на Go. Він надає повноцінний функціонал, аналогічний GitHub або GitLab, але при цьому споживає значно менше ресурсів, що робить його ідеальним вибором для розгортання на VPS або навіть на міні-комп'ютері на кшталт Raspberry Pi. Ви отримаєте інтуїтивно зрозумілий веб-інтерфейс для керування репозиторіями, користувачами, командами, запитами на злиття (pull requests), відстеженням завдань (issues) та багатьом іншим.
Що отримає читач у підсумку
Після проходження цього посібника у вас буде повністю налаштований і працюючий Git-сервер Gitea, доступний за вашим доменним ім'ям із захищеним HTTPS-з'єднанням. Ви зможете створювати публічні та приватні репозиторії, запрошувати колег для спільної роботи, керувати доступом та використовувати всі звичні Git-операції через веб-інтерфейс або командний рядок. Ваша інфраструктура буде повністю під вашим контролем, забезпечуючи конфіденційність та незалежність.
Які альтернативи є і чому self-hosted на VPS
Існує кілька основних підходів до хостингу Git-репозиторіїв:
- Cloud-managed сервіси (GitHub, GitLab.com, Bitbucket): Це найпростіший варіант з точки зору обслуговування. Ви просто реєструєтесь і починаєте працювати. Однак, ви залежите від політики та інфраструктури провайдера, можете зіткнутися з обмеженнями безкоштовних планів, а також з питаннями конфіденційності даних, які зберігаються на сторонніх серверах.
- Self-hosted GitLab Community Edition (CE): GitLab CE — це потужне рішення, що пропонує не тільки Git-хостинг, а й повний DevOps-цикл: CI/CD, контейнерний реєстр, моніторинг та багато іншого. Однак, GitLab CE вимагає значно більше ресурсів (мінімум 4 ГБ RAM для комфортної роботи), що робить його менш придатним для невеликих VPS та команд.
- Self-hosted Gitea: Gitea займає нішу між простими хмарними сервісами та ресурсоємним GitLab. Він пропонує багатий функціонал Git-хостингу при мінімальному споживанні ресурсів. Це ідеальний вибір, якщо вам потрібен повноцінний Git-сервер без зайвих функцій та без великих витрат на інфраструктуру. Розгортання на VPS дає вам повний контроль над даними, можливість кастомізації та інтеграції з вашою власною екосистемою. Крім того, Docker значно спрощує розгортання та керування Gitea, ізолюючи його від основної системи та роблячи переносним.
Вибір Gitea на VPS дозволяє об'єднати переваги самохостингу (контроль, приватність) з ефективним використанням ресурсів та простотою розгортання завдяки Docker.
Який VPS-конфіг потрібен для цього завдання
Для встановлення Gitea на VPS з Docker та Caddy, як правило, не потрібні екстремально потужні ресурси. Gitea оптимізований для роботи на скромному обладнанні, але наявність Docker та Caddy додає невеликі накладні витрати. Важливо враховувати, скільки користувачів буде активно працювати з Gitea та скільки репозиторіїв планується розміщувати.
Мінімальні вимоги
- CPU: 1 vCore (наприклад, Intel Xeon E3/E5 або AMD EPYC). Для невеликих команд до 5-10 осіб цього буде достатньо.
- RAM: 2 ГБ. Цього вистачить для операційної системи, Docker-демона, контейнерів Gitea та Caddy. Якщо планується дуже активне використання або інші сервіси на тому ж VPS, краще розглянути 4 ГБ.
- Диск: 40-60 ГБ SSD. SSD критичний для продуктивності Git-операцій. 40 ГБ вистачить для ОС, Docker-образів та кількох десятків репозиторіїв. Якщо репозиторії будуть дуже великими або їх буде багато, розгляньте 80-100 ГБ.
- Мережа: 100 Мбіт/с. Для більшості сценаріїв цього більш ніж достатньо. Важливіше стабільність каналу та низька затримка.
Конкретний VPS-план для завдання (актуально на 2026 рік)
Для комфортної роботи Gitea з Docker та Caddy для команди до 10-20 розробників та десятків репозиторіїв, рекомендується наступна конфігурація VPS:
- CPU: 2 vCore (наприклад, Intel Xeon E5-2690v4 або AMD EPYC 7002 series).
- RAM: 4 ГБ DDR4.
- Диск: 80 ГБ NVMe SSD. NVMe забезпечить максимальну швидкість дискових операцій, що важливо для Git.
- Мережа: 1 Гбіт/с порт з необмеженим трафіком або великим обсягом.
Такий VPS-конфіг забезпечить відмінну продуктивність та запас на майбутнє. Наприклад, можна взяти VPS із зазначеними характеристиками.
Коли потрібен dedicated, а не VPS
Dedicated-сервер варто розглядати, якщо:
- Дуже велика команда: Понад 50-100 активних користувачів.
- Надзвичайно великі репозиторії: Репозиторії з гігабайтами бінарних файлів (LFS).
- Критичні вимоги до продуктивності: Високе навантаження на Git-операції в режимі 24/7.
- Суворі вимоги до безпеки/ізоляції: Повна ізоляція від "сусідів" по гіпервізору.
- Планується багато інших сервісів: Крім Gitea на сервері працюватимуть CI/CD-агенти, бази даних, веб-сервери для інших проєктів тощо.
Для більшості завдань Gitea, особливо для стартапів, невеликих команд та особистих проєктів, VPS буде оптимальним та економічно вигідним рішенням.
Локація: на що впливає
Вибір локації VPS має значення для:
- Затримки (Latency): Чим ближче сервер до вашої команди та основних користувачів, тим меншою буде затримка при виконанні Git-операцій та роботі з веб-інтерфейсом. Це особливо критично для розробників, які знаходяться далеко від сервера.
- Відповідність законодавству: У деяких випадках, особливо для компаній, можуть бути вимоги до зберігання даних у певній юрисдикції.
- Доступність: Обирайте локацію з надійною мережевою інфраструктурою та хорошими каналами зв'язку.
Оптимально обирати дата-центр, розташований географічно близько до більшості ваших користувачів.
Підготовка сервера
Перед тим як приступити до встановлення Gitea, необхідно виконати базове налаштування вашого VPS. Ми будемо використовувати Ubuntu Server 24.04 LTS, оскільки це актуальна та стабільна версія операційної системи на 2026 рік.
Мінімальне налаштування після провізіонінгу
Після отримання доступу до вашого VPS (зазвичай через SSH під користувачем root), насамперед оновіть систему та створіть нового користувача з правами sudo.
# Оновлення списку пакетів та їх оновлення до останніх версій
sudo apt update && sudo apt upgrade -y
# Створення нового користувача (замініть 'ваш_пользователь' на бажане ім'я)
sudo adduser ваш_пользователь
# Додавання користувача до групи sudo для отримання адміністративних прав
sudo usermod -aG sudo ваш_пользователь
Вийдіть із сесії root та увійдіть під новим користувачем:
exit
# Потім увійдіть знову з вашим_пользователем
ssh ваш_пользователь@ваш_ip_сервера
Налаштування SSH-ключів (рекомендується)
Для підвищення безпеки рекомендується використовувати SSH-ключі замість паролів. Згенеруйте ключ на вашій локальній машині (якщо ще немає):
# На вашій локальній машині
ssh-keygen -t ed25519 -C "ваш[email protected]"
Скопіюйте публічний ключ на сервер:
# На вашій локальній машині
ssh-copy-id ваш_пользователь@ваш_ip_сервера
Після цього вимкніть вхід за паролем для SSH (файл /etc/ssh/sshd_config):
# На сервері
sudo nano /etc/ssh/sshd_config
Знайдіть та змініть наступні рядки:
# /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PermitRootLogin no
Перезапустіть SSH-сервер:
sudo systemctl restart sshd
Встановлення Fail2Ban
Fail2Ban захищає ваш сервер від атак методом підбору паролів, блокуючи IP-адреси, з яких відбуваються численні невдалі спроби входу.
# Встановлення Fail2Ban
sudo apt install fail2ban -y
# Копіювання стандартного конфігу для його налаштування
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Відкриття файлу для редагування (опціонально, для більш тонкого налаштування)
sudo nano /etc/fail2ban/jail.local
Зазвичай достатньо дефолтних налаштувань, але ви можете змінити bantime, findtime та maxretry. Переконайтеся, що секція [sshd] увімкнена.
# Приклад вмісту jail.local (переконайтеся, що enabled = true)
[DEFAULT]
bantime = 1d
findtime = 10m
maxretry = 5
[sshd]
enabled = true
mode = aggressive
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
# Перезапуск Fail2Ban для застосування змін
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban
Налаштування Firewall (UFW)
Uncomplicated Firewall (UFW) — це простий у використанні інтерфейс для iptables. Налаштуємо його, щоб дозволити лише необхідні порти.
# Встановлення UFW
sudo apt install ufw -y
# Дозволити SSH (за замовчуванням порт 22)
sudo ufw allow ssh
# Дозволити HTTP (порт 80) та HTTPS (порт 443) для веб-сервера (Caddy)
sudo ufw allow http
sudo ufw allow https
# Увімкнути UFW
sudo ufw enable
Підтвердіть увімкнення, натиснувши y. Перевірити статус фаєрвола можна командою sudo ufw status verbose.
Тепер ваш сервер готовий до встановлення Docker та Gitea.
Встановлення ПЗ — покроково
Ми будемо використовувати Docker та Docker Compose для розгортання Gitea. Це забезпечує ізоляцію застосунку, спрощує керування залежностями та полегшує оновлення.
1. Встановлення Docker Engine
Для встановлення Docker Engine на Ubuntu 24.04 LTS (Noble Numbat) дотримуйтесь офіційних рекомендацій, актуальних на 2026 рік.
# Удаление старых версий Docker, если они есть
for pkg in docker.io docker-doc docker-compose docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; do sudo apt remove $pkg; done
# Обновление списка пакетов
sudo apt update
# Установка необходимых пакетов для работы с репозиториями
sudo apt install ca-certificates curl gnupg -y
# Добавление официального GPG-ключа Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Добавление репозитория Docker в APT-источники
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Обновление списка пакетов после добавления репозитория Docker
sudo apt update
# Установка Docker Engine, Docker CLI, containerd и Docker Compose плагина
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Перевірка встановлення Docker:
# Проверка версии Docker
docker --version
# Проверка статуса Docker-сервиса
sudo systemctl status docker
# Запуск тестового контейнера 'hello-world'
sudo docker run hello-world
Додайте вашого користувача до групи docker, щоб не використовувати sudo для кожної команди Docker:
# Добавление пользователя в группу docker
sudo usermod -aG docker ваш_пользователь
# Примените изменения группы (выйдите и войдите заново или перезагрузите систему)
newgrp docker
2. Створення структури каталогів для Gitea
Ми створимо директорії для зберігання даних Gitea та конфігурації Docker Compose. Це забезпечить персистентність даних та чистоту структури.
# Создание корневой директории для проекта Gitea
mkdir -p ~/gitea
# Переход в созданную директорию
cd ~/gitea
# Создание директории для хранения постоянных данных Gitea
mkdir -p ./data
3. Створення файлу docker-compose.yml для Gitea та Caddy
Цей файл визначить сервіси Gitea та Caddy, їхні залежності, томи та мережеві налаштування. Ми будемо використовувати SQLite як базу даних для простоти, що ідеально для невеликих установок. Для великих проєктів розгляньте PostgreSQL або MySQL.
Створіть файл docker-compose.yml у директорії ~/gitea:
# Создание файла docker-compose.yml
nano docker-compose.yml
Вставте наступний вміст, замінивши your.domain.com на ваш фактичний домен:
# docker-compose.yml
version: "3.8"
services:
gitea:
image: gitea/gitea:1.22.0 # Актуальна версія на 2026 рік, перевірте https://dl.gitea.io/gitea/
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__DATABASE__DB_TYPE=sqlite3 # Використовуємо SQLite для простоти
- GITEA__DATABASE__PATH=/data/gitea.db # Шлях до файлу бази даних SQLite
- GITEA__SERVER__DOMAIN=your.domain.com # Ваш домен
- GITEA__SERVER__SSH_DOMAIN=your.domain.com # Домен для SSH-доступу
- GITEA__SERVER__HTTP_PORT=3000 # Внутрішній порт Gitea
- GITEA__SERVER__APP_DATA_PATH=/data # Шлях для даних Gitea всередині контейнера
- GITEA__SERVER__ROOT_URL=https://your.domain.com/ # Базовий URL для Gitea
- GITEA__SECURITY__INSTALL_LOCK=true # Блокування сторінки встановлення після першого налаштування
- GITEA__SERVICE__DISABLE_REGISTRATION=false # Дозволити реєстрацію нових користувачів (true для приватного сервера)
- GITEA__SERVICE__REQUIRE_SIGNIN_VIEW=false # Вимагати вхід для перегляду репозиторіїв (true для приватного сервера)
- GITEA__SESSION__PROVIDER=db # Використовуємо базу даних для сесій
- GITEA__CACHE__ADAPTER=redis # Рекомендується для продуктивності
- GITEA__CACHE__HOST=redis:6379 # Хост Redis
- GITEA__QUEUE__TYPE=redis # Черга завдань через Redis
- GITEA__QUEUE__CONN_STR=redis://redis:6379/0 # Рядок підключення до Redis
restart: always
volumes:
- ./data:/data # Мапінг локальної директорії даних до контейнера
- /etc/timezone:/etc/timezone:ro # Синхронізація часового поясу
- /etc/localtime:/etc/localtime:ro # Синхронізація локального часу
ports:
- "3000:3000" # Внутрішній HTTP-порт Gitea (для Caddy)
- "2222:22" # SSH-порт Gitea (мапімо на 2222, щоб не конфліктувати з хостом)
networks:
- gitea-network
caddy:
image: caddy:2.7.5 # Актуальна версія Caddy на 2026 рік
container_name: caddy
restart: always
ports:
- "80:80" # HTTP для Let's Encrypt challenge та перенаправлення
- "443:443" # HTTPS
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile # Файл конфігурації Caddy
- ./caddy_data:/data # Сховище Caddy для сертифікатів та стану
environment:
- GITEA_DOMAIN=your.domain.com # Передача домену в Caddyfile через змінну
networks:
- gitea-network
depends_on:
- gitea # Caddy залежить від Gitea
redis:
image: redis:7.2-alpine # Легковажна версія Redis
container_name: redis
restart: always
volumes:
- ./redis_data:/data # Сховище даних Redis
networks:
- gitea-network
command: redis-server --appendonly yes # Увімкнення персистентності даних
networks:
gitea-network:
driver: bridge
Важливо: Замініть your.domain.com на ваш реальний домен. Переконайтеся, що для вашого домену (наприклад, gitea.example.com) створено A-запис, що вказує на IP-адресу вашого VPS.
Примітка щодо версій: Версії gitea/gitea:1.22.0, caddy:2.7.5 та redis:7.2-alpine вказані як актуальні на 2026 рік. Завжди перевіряйте офіційні репозиторії Docker Hub для отримання найсвіжіших та стабільних версій.
4. Створення файлу Caddyfile для Caddy
Caddy автоматично керує SSL-сертифікатами через Let's Encrypt. Створіть файл Caddyfile у тій самій директорії ~/gitea:
# Создание файла Caddyfile
nano Caddyfile
Вставте наступний вміст:
# Caddyfile
{env.GITEA_DOMAIN} {
# Автоматичний HTTPS
tls {
# Використовуємо Let's Encrypt
acme_challenge http
}
# Зворотний проксі для Gitea
reverse_proxy gitea:3000 {
# Проксіюємо заголовки, необхідні Gitea
header_up Host {host}
header_up X-Real-IP {remote_ip}
header_up X-Forwarded-Proto {scheme}
header_up X-Forwarded-For {remote_ip}
}
# Налаштування для великих файлів (Git LFS)
# Gitea сам обробляє LFS, але Caddy повинен пропускати великі запити
# Якщо у вас будуть дуже великі LFS файли, може знадобитися збільшення body_size
# (за замовчуванням Caddy обробляє до 10MB)
# Для Gitea це зазвичай не потрібно, оскільки він сам приймає дані
}
Змінна {env.GITEA_DOMAIN} буде автоматично замінена на значення з docker-compose.yml.
5. Запуск Gitea та Caddy з Docker Compose
Після створення обох файлів, ви готові запустити Gitea.
# Переход в директорию с файлами
cd ~/gitea
# Запуск всех сервисов в фоновом режиме
docker compose up -d
Ця команда завантажить необхідні Docker-образи (Gitea, Caddy, Redis), створить контейнери та запустить їх. Перший запуск може зайняти деякий час, доки завантажуються образи.
Перевірити статус запущених контейнерів можна командою:
# Проверка статуса контейнеров
docker compose ps
Ви повинні побачити, що всі контейнери (gitea, caddy, redis) знаходяться в статусі running.
На цьому етапі встановлення основних компонентів завершено. Тепер перейдемо до фінальної конфігурації.