feat: configure docker-compose, caddy and drone-ci

This commit is contained in:
2025-06-14 19:59:25 +03:00
commit f85203a76e
4 changed files with 226 additions and 0 deletions

99
.drone.yml Normal file
View File

@@ -0,0 +1,99 @@
# --- Пайплайн №1: Сборка Docker-образа для backend ---
kind: pipeline
type: docker
name: build-backend
# Запускать только если были изменения в папке backend/
trigger:
event: [push, pull_request]
path:
- backend/**
steps:
- name: build-and-publish-backend
image: plugins/docker
settings:
# Имя репозитория в Docker Registry вашего Gitea
repo: gitea.mrixs.me/minecraft-platform/backend
# Адрес вашего Docker Registry
registry: gitea.mrixs.me
# Путь к Dockerfile внутри клонированного репозитория
dockerfile: backend/Dockerfile
# Контекст сборки
context: backend
# Логин и пароль для пуша в Gitea Registry (нужно настроить в секретах Drone)
username: { from_secret: gitea_username }
password: { from_secret: gitea_password }
# Теги для образа: latest и короткий хеш коммита
tags:
- latest
- ${DRONE_COMMIT_SHA:0:7}
---
# --- Пайплайн №2: Сборка Docker-образа для ping-helper ---
kind: pipeline
type: docker
name: build-ping-helper
trigger:
event: [push, pull_request]
path:
- ping-helper/**
steps:
- name: build-and-publish-ping-helper
image: plugins/docker
settings:
repo: gitea.mrixs.me/minecraft-platform/ping-helper
registry: gitea.mrixs.me
dockerfile: ping-helper/Dockerfile
context: ping-helper
username: { from_secret: gitea_username }
password: { from_secret: gitea_password }
tags:
- latest
- ${DRONE_COMMIT_SHA:0:7}
---
# --- Пайплайн №3: Развертывание на продакшен-сервере ---
kind: pipeline
type: ssh
name: deploy-production
# Запускать только при пуше в ветку main
trigger:
branch: [main]
event: [push]
# Этот пайплайн зависит от успешного выполнения сборок
depends_on:
- build-backend
- build-ping-helper
# Настройки подключения к вашему серверу
server:
host: { from_secret: ssh_host }
user: { from_secret: ssh_user }
key: { from_secret: ssh_key }
# Команды, которые будут выполнены на сервере
# ВАЖНО: Замените /home/user/platform на реальный путь к вашему проекту на сервере
commands:
- echo "--- Starting deployment ---"
- cd /home/user/platform # Переходим в директорию проекта
- echo "1. Updating repository..."
- git pull origin main # Обновляем основной репозиторий
- git submodule update --init --recursive # Обновляем все субмодули
- echo "2. Building frontend static files..."
# Запускаем одноразовый контейнер для сборки фронтенда
- docker run --rm -v $(pwd)/frontend:/app -v /app/node_modules -w /app node:18-alpine sh -c "npm install && npm run build"
# Перемещаем собранную статику в папку data/frontend, которую использует Caddy
- rm -rf ./data/frontend/*
- mv ./frontend/dist/* ./data/frontend/
- echo "3. Pulling new Docker images..."
- docker-compose pull # Скачиваем свежесобранные образы backend и ping-helper
- echo "4. Restarting services..."
- docker-compose up -d # Перезапускаем все сервисы в фоновом режиме
- echo "5. Cleaning up old images..."
- docker image prune -f # Удаляем неиспользуемые образы
- echo "--- Deployment finished ---"

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/data/
.env

52
Caddyfile Normal file
View File

@@ -0,0 +1,52 @@
# Глобальный блок настроек
{
# Email для получения SSL-сертификатов от Let's Encrypt
acme_email mrixs@mrixs.me
}
# Основной блок для вашего домена
mc.mrixs.me {
# Включаем сжатие для ускорения загрузки
encode zstd gzip
# --- Маршрутизация запросов ---
# 1. API бэкенда (Yggdrasil, Web, Admin)
handle_path /api/* /authserver/* /sessionserver/* {
reverse_proxy backend:8080
}
# 2. WebSocket для измерения пинга
handle_path /ws/ping* {
reverse_proxy ping-helper:8081
}
# 3. Раздача файлов (скины, модпаки)
handle_path /files/* {
# Указываем корень, где лежат папки textures и modpacks
root * /srv
# Включаем файловый сервер
file_server
}
# 4. Раздача статики фронтенда (Vue.js SPA)
# Этот блок обрабатывает все остальные запросы
handle {
root * /srv/frontend
# Если файл не найден, отдаем index.html (стандартное поведение для SPA)
try_files {path} /index.html
file_server
}
# --- Заголовки безопасности (рекомендация из ТЗ) ---
header {
# Запрещает встраивать сайт в iframe на других доменах
X-Frame-Options "SAMEORIGIN"
# Защита от MIME-сниффинга
X-Content-Type-Options "nosniff"
# Включает HSTS, заставляя браузеры использовать только HTTPS
Strict-Transport-Security "max-age=31536000;"
# Базовая политика безопасности контента
# Content-Security-Policy "..."
}
}

73
docker-compose.yml Normal file
View File

@@ -0,0 +1,73 @@
# Версия синтаксиса Docker Compose
version: "3.8"
services:
# 1. Веб-сервер и реверс-прокси Caddy
caddy:
image: caddy:2-alpine
container_name: platform-caddy
restart: unless-stopped
ports:
# Публикуем стандартные порты для веб-трафика
- "80:80"
- "443:443"
- "443:443/udp" # Для HTTP/3
volumes:
# Подключаем наш файл конфигурации Caddy
- ./Caddyfile:/etc/caddy/Caddyfile
# Подключаем папки с файлами, которые Caddy будет раздавать
- ./data/frontend:/srv/frontend # Статика фронтенда
- ./data/textures:/srv/files/textures # Скины и плащи
- ./data/modpack_files:/srv/files/modpacks # Файлы модпаков
# Именованные тома для персистентных данных Caddy (SSL-сертификаты и т.д.)
- caddy_data:/data
- caddy_config:/config
networks:
- platform-net
# 2. Бэкенд-сервер на Go
backend:
# Образ будет собираться и публиковаться в Gitea Registry нашим CI/CD
image: gitea.mrixs.me/minecraft-platform/backend:latest
container_name: platform-backend
restart: unless-stopped
depends_on:
- postgres # Запускать только после старта базы данных
env_file:
- .env # Подключаем файл с секретными переменными (пароли, ключи)
networks:
- platform-net
# 3. Вспомогательный сервис для измерения пинга
ping-helper:
image: gitea.mrixs.me/minecraft-platform/ping-helper:latest
container_name: platform-ping-helper
restart: unless-stopped
networks:
- platform-net
# 4. База данных PostgreSQL
postgres:
image: postgres:16-alpine
container_name: platform-postgres
restart: unless-stopped
volumes:
# Именованный том для хранения данных БД
- postgres_data:/var/lib/postgresql/data
# Монтируем папку со скриптами миграций для возможного ручного запуска
- ./scripts/migrations:/docker-entrypoint-initdb.d
env_file:
- .env # Пароли и имя БД также берем из .env
networks:
- platform-net
# Определяем именованные тома для хранения данных между перезапусками контейнеров
volumes:
postgres_data:
caddy_data:
caddy_config:
# Определяем общую сеть для взаимодействия контейнеров по именам сервисов
networks:
platform-net:
driver: bridge