feat: configure docker-compose, caddy and drone-ci
This commit is contained in:
99
.drone.yml
Normal file
99
.drone.yml
Normal 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
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/data/
|
||||||
|
.env
|
||||||
52
Caddyfile
Normal file
52
Caddyfile
Normal 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
73
docker-compose.yml
Normal 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
|
||||||
Reference in New Issue
Block a user