Руководство по развёртыванию TJudge на собственном сервере.
- Требования
- Быстрый старт
- Профили производительности
- Конфигурация
- Бэкапы и восстановление
- Мониторинг
- Устранение проблем
- Обновление
| Ресурс | Минимум | Рекомендуется |
|---|---|---|
| CPU | 2 ядра | 4 ядра |
| RAM | 4 ГБ | 8 ГБ |
| Диск | 20 ГБ | 50 ГБ |
| ОС | Linux, macOS | Ubuntu 22.04+ |
- Docker 24.0+ и Docker Compose v2
- Git для клонирования репозитория
- curl или wget для тестирования
docker --version
docker compose versiongit clone https://github.com/bmstu-itstech/tjudge.git
cd tjudge# Автоопределение профиля по характеристикам сервера
make deployСкрипт автоматически:
- Определит характеристики вашего железа
- Выберет оптимальный профиль
- Инициализирует секреты
- Соберёт и запустит все сервисы
Миграции базы данных выполняются автоматически. В Docker Compose определён сервис migrate, который применяет все миграции перед запуском API и Worker (через condition: service_completed_successfully). Ручной запуск миграций не требуется.
# Для слабого железа (2 ядра, 4 ГБ RAM)
make deploy-weak
# Для среднего железа (4 ядра, 8 ГБ RAM)
make deploy-medium
# Для мощного железа (8+ ядер, 16+ ГБ RAM)
make deploy-strong# Проверить статус сервисов
docker compose -f docker-compose.selfhosted.yml ps
# Проверить API
curl http://localhost:8080/health| Профиль | CPU | RAM | Воркеры | Память/матч | Описание |
|---|---|---|---|---|---|
| weak | 2 | 4 ГБ | 1-3 | 256 MiB | Старый ноутбук, VPS начального уровня |
| medium | 4 | 8 ГБ | 2-5 | 512 MiB | Обычный сервер, рабочая станция |
| strong | 8+ | 16+ ГБ | 5-20 | 1 GiB | Выделенный сервер, production |
Конфигурация config/profiles/weak.env:
WORKER_MIN=1
WORKER_MAX=3
EXECUTOR_MEMORY_LIMIT=268435456 # 256 MiB
EXECUTOR_CPU_QUOTA=50000 # 50% CPU
DB_MAX_CONNECTIONS=20
REDIS_POOL_SIZE=30Ограничения:
- До 3 параллельных матчей
- Матчи выполняются медленнее
- Подходит для турниров до 50 участников
Конфигурация config/profiles/medium.env:
WORKER_MIN=2
WORKER_MAX=5
EXECUTOR_MEMORY_LIMIT=536870912 # 512 MiB
EXECUTOR_CPU_QUOTA=100000 # 100% CPU
DB_MAX_CONNECTIONS=50
REDIS_POOL_SIZE=50Возможности:
- До 5 параллельных матчей
- Стандартная скорость выполнения
- Подходит для турниров до 200 участников
Конфигурация config/profiles/strong.env:
WORKER_MIN=5
WORKER_MAX=20
EXECUTOR_MEMORY_LIMIT=1073741824 # 1 GiB
EXECUTOR_CPU_QUOTA=200000 # 200% CPU
DB_MAX_CONNECTIONS=100
REDIS_POOL_SIZE=100Возможности:
- До 20 параллельных матчей
- Быстрое выполнение сложных программ
- Подходит для крупных турниров 500+ участников
# Показать рекомендуемый профиль
make detect-profileСкопируйте и отредактируйте файл .env:
cp .env.example .env
# Отредактируйте .envКритичные переменные:
| Переменная | Описание | Пример |
|---|---|---|
DB_PASSWORD |
Пароль PostgreSQL | your-secure-password |
JWT_SECRET |
Секрет для JWT (мин. 32 символа) | your-jwt-secret-min-32-chars |
BASE_URL |
Публичный URL приложения | https://tjudge.example.com |
При первом запуске секреты генерируются автоматически в директории secrets/.
Для ручной генерации:
./scripts/init-secrets.sh# Остановить текущие сервисы
docker compose -f docker-compose.selfhosted.yml down
# Развернуть с новым профилем
make deploy-mediumДобавьте в crontab для ежедневных бэкапов:
# Редактировать crontab
crontab -e
# Добавить строку (бэкап в 2:00 ночи)
0 2 * * * /path/to/tjudge/scripts/backup.sh >> /var/log/tjudge-backup.log 2>&1# Создать бэкап
make backup
# Посмотреть список бэкапов
make backup-listБэкапы сохраняются в ./backups/ с именем tjudge_YYYYMMDD_HHMMSS.sql.gz.
# Показать доступные бэкапы
make backup-list
# Восстановить из бэкапа
make restore BACKUP=backups/tjudge_20240115_020000.sql.gzВосстановление остановит API и Worker, создаст резервную копию текущих данных, затем восстановит из указанного файла.
По умолчанию бэкапы хранятся 7 дней. Для изменения:
# В .env или профиле
BACKUP_RETENTION_DAYS=14Рекомендуется также копировать бэкапы на внешнее хранилище (S3, Google Drive и т.п.).
По умолчанию доступны:
| Сервис | URL | Описание |
|---|---|---|
| API Health | http://localhost:8080/health |
Статус API |
| Prometheus | http://localhost:9092 |
Метрики |
| Grafana | http://localhost:3000 |
Дашборды |
Логин в Grafana: admin / admin (смените после первого входа!)
Мониторинг запускается отдельным профилем:
docker compose -f docker-compose.selfhosted.yml --profile monitoring up -dcurl http://localhost:9090/metricsКлючевые метрики:
http_requests_total- количество запросовhttp_request_duration_seconds- время ответаmatches_processed_total- обработано матчейworker_pool_size- размер пула воркеров
# Все логи
docker compose -f docker-compose.selfhosted.yml logs -f
# Только API
docker compose -f docker-compose.selfhosted.yml logs -f api
# Только Worker
docker compose -f docker-compose.selfhosted.yml logs -f worker# Проверить логи
docker compose -f docker-compose.selfhosted.yml logs api
# Проверить статус контейнеров
docker compose -f docker-compose.selfhosted.yml psСимптомы: Контейнеры убиваются, в логах OOM killed.
Решение: Переключитесь на более слабый профиль:
docker compose -f docker-compose.selfhosted.yml down
make deploy-weakИли уменьшите EXECUTOR_MEMORY_LIMIT и WORKER_MAX в профиле.
Симптомы: Матчи долго висят в очереди.
Решение:
- Увеличьте
WORKER_MAX(если позволяет железо) - Уменьшите
EXECUTOR_MEMORY_LIMITдля большего параллелизма - Проверьте нагрузку:
docker stats
# Проверить подключение
docker exec tjudge-postgres psql -U tjudge -d tjudge -c "SELECT 1;"
# Посмотреть активные соединения
docker exec tjudge-postgres psql -U tjudge -d tjudge -c "SELECT count(*) FROM pg_stat_activity;"# Проверить Redis
docker exec tjudge-redis redis-cli ping
# Посмотреть использование памяти
docker exec tjudge-redis redis-cli info memory# Полная остановка
docker compose -f docker-compose.selfhosted.yml down
# Очистка volumes (УДАЛИТ ВСЕ ДАННЫЕ!)
docker compose -f docker-compose.selfhosted.yml down -v
# Чистый запуск
make deploy# Создать бэкап перед обновлением
make backup
# Получить новую версию
git pull origin main
# Пересобрать и перезапустить
docker compose -f docker-compose.selfhosted.yml down
make deploy# Вернуться к предыдущему коммиту
git checkout HEAD~1
# Восстановить бэкап если нужно
make restore BACKUP=backups/tjudge_YYYYMMDD_HHMMSS.sql.gz
# Пересобрать
make deploy# Статус сервисов
docker compose -f docker-compose.selfhosted.yml ps
# Перезапуск сервиса
docker compose -f docker-compose.selfhosted.yml restart api
# Масштабирование (если нужно больше воркеров)
docker compose -f docker-compose.selfhosted.yml up -d --scale worker=2
# Просмотр ресурсов
docker stats
# Очистка неиспользуемых образов
docker system prune -fПри возникновении проблем:
- Проверьте раздел Устранение проблем
- Посмотрите Issues
- Создайте новый Issue с:
- Версией TJudge (
git rev-parse HEAD) - Профилем (
make detect-profile) - Логами (
docker compose logs)
- Версией TJudge (