commit f85203a76ecc7bf549e260249a5bcffa007f0aa9 Author: Vladimir Zagainov Date: Sat Jun 14 19:59:25 2025 +0300 feat: configure docker-compose, caddy and drone-ci diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..7659ec9 --- /dev/null +++ b/.drone.yml @@ -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 ---" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17a4e53 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/data/ +.env diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..24aba72 --- /dev/null +++ b/Caddyfile @@ -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 "..." + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..78cbb62 --- /dev/null +++ b/docker-compose.yml @@ -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