Compare commits
43 Commits
25192d3f1b
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f417091909 | |||
| 9b55f965ff | |||
| 65447995e3 | |||
| 36c40b611f | |||
| 49cbb78774 | |||
| 9433a2e655 | |||
| 40209e4564 | |||
| a482cf3832 | |||
| 51c5941fe8 | |||
| b679b3a15b | |||
| cc0444b2bb | |||
| 0b16a20d83 | |||
| 2ddb1905f2 | |||
| a72ae3ab18 | |||
| 46ba42dc9a | |||
| 148bac8673 | |||
| 86b5c0622c | |||
| c0e36700a9 | |||
| 53e743578f | |||
| 072ab74231 | |||
| c046f5f6c8 | |||
| 01b7e707ab | |||
| 805e1a2791 | |||
| 6d2fab922e | |||
| c737595a52 | |||
| ab7bd84859 | |||
| 7e5f46dca2 | |||
| 3f3b202d47 | |||
| 9cb39e6afb | |||
| 9ed5aa1163 | |||
| 8f9ab02c56 | |||
| 936a8b4007 | |||
| 22d2b411ab | |||
| 7d73669d26 | |||
| 8d3f0387a1 | |||
| 76ceb3618d | |||
| 80a9fb3d90 | |||
| d582c0b449 | |||
| e772d1758a | |||
| 0c28acc796 | |||
| 2cc1b6774c | |||
| 9ebdd0daeb | |||
| 3c47e73c94 |
73
.drone.yml
73
.drone.yml
@@ -9,8 +9,6 @@ clone:
|
|||||||
# Запускать только если были изменения в папке backend/
|
# Запускать только если были изменения в папке backend/
|
||||||
trigger:
|
trigger:
|
||||||
event: [push, pull_request]
|
event: [push, pull_request]
|
||||||
path:
|
|
||||||
- backend/**
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: force-init-submodules
|
- name: force-init-submodules
|
||||||
@@ -56,8 +54,6 @@ clone:
|
|||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
event: [push, pull_request]
|
event: [push, pull_request]
|
||||||
path:
|
|
||||||
- ping-helper/**
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: force-init-submodules
|
- name: force-init-submodules
|
||||||
@@ -86,45 +82,78 @@ steps:
|
|||||||
- ${DRONE_COMMIT_SHA:0:7}
|
- ${DRONE_COMMIT_SHA:0:7}
|
||||||
|
|
||||||
---
|
---
|
||||||
# --- Пайплайн №3: Развертывание на продакшен-сервере ---
|
# --- Пайплайн №3: Сборка Docker-образа для frontend ---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: build-frontend
|
||||||
|
|
||||||
|
clone:
|
||||||
|
depth: 0
|
||||||
|
recursive: true
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
event: [push, pull_request]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: force-init-submodules
|
||||||
|
image: alpine/git
|
||||||
|
commands:
|
||||||
|
- git submodule deinit --all --force
|
||||||
|
- git submodule sync --recursive
|
||||||
|
- git submodule update --init --recursive --force
|
||||||
|
- echo "Submodule status after forced update:"
|
||||||
|
- git submodule status
|
||||||
|
- name: build-and-publish-frontend
|
||||||
|
image: plugins/docker
|
||||||
|
settings:
|
||||||
|
repo: gitea.mrixs.me/minecraft-platform/frontend
|
||||||
|
registry: gitea.mrixs.me
|
||||||
|
dockerfile: frontend/Dockerfile
|
||||||
|
context: frontend
|
||||||
|
username: { from_secret: gitea_username }
|
||||||
|
password: { from_secret: gitea_password }
|
||||||
|
tags:
|
||||||
|
- latest
|
||||||
|
- ${DRONE_COMMIT_SHA:0:7}
|
||||||
|
|
||||||
|
---
|
||||||
|
# --- Пайплайн №4: Развертывание на продакшен-сервере ---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: ssh
|
type: ssh
|
||||||
name: deploy-production
|
name: deploy-production
|
||||||
|
|
||||||
# Запускать только при пуше в ветку main
|
# Запускать только при пуше в ветку master
|
||||||
trigger:
|
trigger:
|
||||||
branch: [main]
|
ref:
|
||||||
|
- refs/heads/master
|
||||||
event: [push]
|
event: [push]
|
||||||
|
|
||||||
# Этот пайплайн зависит от успешного выполнения сборок
|
# Этот пайплайн зависит от успешного выполнения сборок
|
||||||
depends_on:
|
depends_on:
|
||||||
- build-backend
|
- build-backend
|
||||||
- build-ping-helper
|
- build-ping-helper
|
||||||
|
- build-frontend
|
||||||
|
|
||||||
# Настройки подключения к вашему серверу
|
# Настройки подключения к вашему серверу
|
||||||
server:
|
server:
|
||||||
host: { from_secret: ssh_host }
|
host: { from_secret: ssh_host }
|
||||||
user: { from_secret: ssh_user }
|
user: { from_secret: ssh_user }
|
||||||
key: { from_secret: ssh_key }
|
ssh_key: { from_secret: ssh_key }
|
||||||
|
|
||||||
# Команды, которые будут выполнены на сервере
|
# Команды, которые будут выполнены на сервере
|
||||||
# ВАЖНО: Замените /home/user/platform на реальный путь к вашему проекту на сервере
|
|
||||||
commands:
|
commands:
|
||||||
- echo "--- Starting deployment ---"
|
- echo "--- Starting deployment ---"
|
||||||
- cd /home/user/platform # Переходим в директорию проекта
|
- cd $DEPLOY_PATH # Переходим в директорию проекта
|
||||||
- echo "1. Updating repository..."
|
- echo "1. Updating repository..."
|
||||||
- git pull origin main # Обновляем основной репозиторий
|
- git pull origin master # Обновляем основной репозиторий
|
||||||
- git submodule update --init --recursive # Обновляем все субмодули
|
- git submodule update --init --recursive # Обновляем все субмодули
|
||||||
- echo "2. Building frontend static files..."
|
- echo "2. Pulling new Docker images..."
|
||||||
# Запускаем одноразовый контейнер для сборки фронтенда
|
- docker compose pull # Скачиваем свежесобранные образы (backend, frontend, ping-helper)
|
||||||
- docker run --rm -v $(pwd)/frontend:/app -v /app/node_modules -w /app node:18-alpine sh -c "npm install && npm run build"
|
- echo "3. Restarting services..."
|
||||||
# Перемещаем собранную статику в папку data/frontend, которую использует Caddy
|
- docker compose up -d --remove-orphans # Перезапускаем все сервисы
|
||||||
- rm -rf ./data/frontend/*
|
- echo "4. Cleaning up old images..."
|
||||||
- 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 # Удаляем неиспользуемые образы
|
- docker image prune -f # Удаляем неиспользуемые образы
|
||||||
- echo "--- Deployment finished ---"
|
- echo "--- Deployment finished ---"
|
||||||
|
|
||||||
|
environment:
|
||||||
|
DEPLOY_PATH: { from_secret: deploy_path }
|
||||||
|
|||||||
58
Caddyfile
58
Caddyfile
@@ -1,52 +1,34 @@
|
|||||||
# Глобальный блок настроек
|
# Внутренний Caddy (TLS обрабатывается внешним)
|
||||||
{
|
:80 {
|
||||||
# Email для получения SSL-сертификатов от Let's Encrypt
|
# --- Заголовки безопасности ---
|
||||||
acme_email mrixs@mrixs.me
|
header {
|
||||||
|
X-Frame-Options "SAMEORIGIN"
|
||||||
|
X-Content-Type-Options "nosniff"
|
||||||
|
Strict-Transport-Security "max-age=31536000;"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Основной блок для вашего домена
|
# --- Маршрутизация запросов (route для явного порядка) ---
|
||||||
mc.mrixs.me {
|
route {
|
||||||
# Включаем сжатие для ускорения загрузки
|
|
||||||
encode zstd gzip
|
|
||||||
|
|
||||||
# --- Маршрутизация запросов ---
|
|
||||||
|
|
||||||
# 1. API бэкенда (Yggdrasil, Web, Admin)
|
# 1. API бэкенда (Yggdrasil, Web, Admin)
|
||||||
handle_path /api/* /authserver/* /sessionserver/* {
|
reverse_proxy /api/* backend:8080
|
||||||
reverse_proxy backend:8080
|
reverse_proxy /authserver/* backend:8080
|
||||||
}
|
reverse_proxy /sessionserver/* backend:8080
|
||||||
|
|
||||||
# 2. WebSocket для измерения пинга
|
# 2. WebSocket для измерения пинга
|
||||||
handle_path /ws/ping* {
|
reverse_proxy /ws/ping ping-helper:8081
|
||||||
reverse_proxy ping-helper:8081
|
|
||||||
}
|
|
||||||
|
|
||||||
# 3. Раздача файлов (скины, модпаки)
|
# 3. Раздача файлов (скины, модпаки)
|
||||||
handle_path /files/* {
|
@files path /files/*
|
||||||
# Указываем корень, где лежат папки textures и modpacks
|
handle @files {
|
||||||
|
uri strip_prefix /files
|
||||||
root * /srv
|
root * /srv
|
||||||
# Включаем файловый сервер
|
|
||||||
file_server
|
file_server
|
||||||
}
|
}
|
||||||
|
|
||||||
# 4. Раздача статики фронтенда (Vue.js SPA)
|
# 4. Фронтенд (Vue.js SPA) - все остальные запросы
|
||||||
# Этот блок обрабатывает все остальные запросы
|
reverse_proxy frontend:80
|
||||||
handle {
|
|
||||||
root * /srv/frontend
|
|
||||||
# Если файл не найден, отдаем index.html (стандартное поведение для SPA)
|
|
||||||
try_files {path} /index.html
|
|
||||||
file_server
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# --- Заголовки безопасности (рекомендация из ТЗ) ---
|
# Включаем сжатие
|
||||||
header {
|
encode zstd gzip
|
||||||
# Запрещает встраивать сайт в iframe на других доменах
|
|
||||||
X-Frame-Options "SAMEORIGIN"
|
|
||||||
# Защита от MIME-сниффинга
|
|
||||||
X-Content-Type-Options "nosniff"
|
|
||||||
# Включает HSTS, заставляя браузеры использовать только HTTPS
|
|
||||||
Strict-Transport-Security "max-age=31536000;"
|
|
||||||
# Базовая политика безопасности контента
|
|
||||||
# Content-Security-Policy "..."
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
62
README.md
62
README.md
@@ -2,22 +2,58 @@
|
|||||||
|
|
||||||
[](https://drone.mrixs.me/minecraft-platform/platform)
|
[](https://drone.mrixs.me/minecraft-platform/platform)
|
||||||
|
|
||||||
Этот репозиторий является центральной точкой для проекта "Платформа Minecraft". Он объединяет все компоненты системы с помощью Git-субмодулей и содержит основную конфигурацию для развертывания и CI/CD.
|
Единая платформа для создания, управления и распространения сборок Minecraft. Включает в себя систему авторизации (совместимую с Authlib Injector), управление модпаками, скинами и мониторинг игровых серверов.
|
||||||
|
|
||||||
## Архитектура
|
---
|
||||||
|
|
||||||
Проект построен на микросервисной архитектуре с использованием Docker и Docker Compose. Автоматическая сборка и развертывание осуществляется с помощью Drone CI.
|
## Возможности
|
||||||
|
|
||||||
### Компоненты (субмодули)
|
### 🔐 Авторизация и Лаунчер
|
||||||
|
- **Yggdrasil API**: Полная совместимость с лаунчерами, поддерживающими Authlib Injector APIs (HMCL, Prism Launcher и др.).
|
||||||
|
- **Система профилей**: Поддержка скинов (загрузка через веб-интерфейс).
|
||||||
|
- **Восстановление сессий**: Лаунчер запоминает вход пользователя.
|
||||||
|
|
||||||
* `backend/`: Основной бэкенд-сервер на Go. Реализует Yggdrasil API, Web API и Admin API.
|
### 📦 Управление Модпаками
|
||||||
* `frontend/`: Веб-интерфейс на Vue.js для пользователей и администраторов.
|
- **Автоматический импорт**: Поддержка импорта сборок с **CurseForge** и **Modrinth** (.mrpack).
|
||||||
* `ping-helper/`: Вспомогательный WebSocket-сервис на Go для измерения пинга.
|
- **Обновления**: Система версионирования сборок. Автоматическое обновление клиентов.
|
||||||
* `launcher/`: Кастомный игровой лаунчер (форк HMCL).
|
- **Оптимизация**: Дедупликация файлов для экономии места на сервере.
|
||||||
|
|
||||||
### Конфигурация
|
### 🖥️ Веб-интерфейс
|
||||||
|
- **Личный кабинет**: Управление профилем и скинами.
|
||||||
|
- **Админ-панель**: Управление пользователями, серверами и модпаками.
|
||||||
|
- **Мониторинг**: Отображение статуса серверов и онлайн-карты (**BlueMap**).
|
||||||
|
|
||||||
* `.drone.yml`: Пайплайн для Drone CI.
|
### ⚙️ Технические особенности
|
||||||
* `docker-compose.yml`: Описание сервисов для Docker.
|
- **Микросервисная архитектура** (Go, Vue.js, PostgreSQL).
|
||||||
* `Caddyfile`: Конфигурация веб-сервера Caddy.
|
- **Асинхронная обработка**: Фоновые задачи для тяжелых операций (импорт сборок) с WebSocket-уведомлениями.
|
||||||
* `scripts/`: Вспомогательные скрипты (миграции, бэкапы).
|
- **Безопасность**: JWT авторизация, Rate Limiting, защита паролей (Argon2/Bcrypt).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Документация
|
||||||
|
|
||||||
|
Вся детальная документация находится в папке `docs/`:
|
||||||
|
|
||||||
|
* [🚀 Руководство по развертыванию](docs/DEPLOYMENT.md): Инструкции по установке, настройке Docker Compose и переменных окружения.
|
||||||
|
* [📖 Руководство пользователя и администратора](docs/USER_GUIDE.md): Инструкции по работе с сайтом, лаунчером и администрированию платформы.
|
||||||
|
* [🔌 OpenAPI Specification](backend/internal/api/openapi.yaml): Описание API для разработчиков.
|
||||||
|
|
||||||
|
## Быстрый старт (Dev)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Клонирование репозитория
|
||||||
|
git clone --recursive https://git.mrixs.me/minecraft-platform/platform.git
|
||||||
|
cd platform
|
||||||
|
|
||||||
|
# 2. Настройка переменных окружения
|
||||||
|
cp .env.example .env
|
||||||
|
# (Отредактируйте .env)
|
||||||
|
|
||||||
|
# 3. Генерация ключей
|
||||||
|
mkdir -p secrets
|
||||||
|
openssl genrsa -out secrets/private_key.pem 2048
|
||||||
|
openssl rsa -in secrets/private_key.pem -pubout -out secrets/public_key.pem
|
||||||
|
|
||||||
|
# 4. Запуск
|
||||||
|
docker-compose up -d --build
|
||||||
|
```
|
||||||
|
|||||||
2
backend
2
backend
Submodule backend updated: 5e609017f0...a1e022e966
@@ -1,48 +1,48 @@
|
|||||||
# Версия синтаксиса Docker Compose
|
|
||||||
version: "3.8"
|
version: "3.8"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# 1. Веб-сервер и реверс-прокси Caddy
|
|
||||||
caddy:
|
caddy:
|
||||||
image: caddy:2-alpine
|
image: caddy:2-alpine
|
||||||
container_name: platform-caddy
|
container_name: platform-caddy
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
# Публикуем стандартные порты для веб-трафика
|
|
||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
- "443:443"
|
||||||
- "443:443/udp" # Для HTTP/3
|
- "443:443/udp"
|
||||||
volumes:
|
volumes:
|
||||||
# Подключаем наш файл конфигурации Caddy
|
|
||||||
- ./Caddyfile:/etc/caddy/Caddyfile
|
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
# Подключаем папки с файлами, которые Caddy будет раздавать
|
- ./data/textures:/srv/files/textures
|
||||||
- ./data/frontend:/srv/frontend # Статика фронтенда
|
- ./data/modpack_files:/srv/files/modpacks
|
||||||
- ./data/textures:/srv/files/textures # Скины и плащи
|
|
||||||
- ./data/modpack_files:/srv/files/modpacks # Файлы модпаков
|
|
||||||
# Именованные тома для персистентных данных Caddy (SSL-сертификаты и т.д.)
|
|
||||||
- caddy_data:/data
|
- caddy_data:/data
|
||||||
- caddy_config:/config
|
- caddy_config:/config
|
||||||
|
depends_on:
|
||||||
|
- frontend
|
||||||
|
- backend
|
||||||
|
networks:
|
||||||
|
- platform-net
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
image: gitea.mrixs.me/minecraft-platform/frontend:latest
|
||||||
|
container_name: platform-frontend
|
||||||
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- platform-net
|
- platform-net
|
||||||
|
|
||||||
# 2. Бэкенд-сервер на Go
|
|
||||||
backend:
|
backend:
|
||||||
# Образ будет собираться и публиковаться в Gitea Registry нашим CI/CD
|
|
||||||
image: gitea.mrixs.me/minecraft-platform/backend:latest
|
image: gitea.mrixs.me/minecraft-platform/backend:latest
|
||||||
container_name: platform-backend
|
container_name: platform-backend
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres # Запускать только после старта базы данных
|
- postgres
|
||||||
env_file:
|
env_file:
|
||||||
- .env # Подключаем файл с секретными переменными (пароли, ключи)
|
- .env
|
||||||
volumes: # <--- ДОБАВЬТЕ ЭТОТ РАЗДЕЛ
|
volumes:
|
||||||
# Монтируем ключ в контейнер по пути, указанному в .env
|
- ./secrets/private.pem:/app/private.pem:ro
|
||||||
- ./secrets/private.pem:/app/private.pem:ro # :ro - только для чтения
|
|
||||||
- ./data/textures:/data/textures
|
- ./data/textures:/data/textures
|
||||||
|
- ./data/modpack_files:/data/modpacks
|
||||||
networks:
|
networks:
|
||||||
- platform-net
|
- platform-net
|
||||||
|
|
||||||
# 3. Вспомогательный сервис для измерения пинга
|
|
||||||
ping-helper:
|
ping-helper:
|
||||||
image: gitea.mrixs.me/minecraft-platform/ping-helper:latest
|
image: gitea.mrixs.me/minecraft-platform/ping-helper:latest
|
||||||
container_name: platform-ping-helper
|
container_name: platform-ping-helper
|
||||||
@@ -50,28 +50,24 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- platform-net
|
- platform-net
|
||||||
|
|
||||||
# 4. База данных PostgreSQL
|
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:16-alpine
|
image: postgres:16-alpine
|
||||||
container_name: platform-postgres
|
container_name: platform-postgres
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
# Именованный том для хранения данных БД
|
|
||||||
- postgres_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
# Монтируем папку со скриптами миграций для возможного ручного запуска
|
|
||||||
- ./scripts/migrations:/docker-entrypoint-initdb.d
|
- ./scripts/migrations:/docker-entrypoint-initdb.d
|
||||||
env_file:
|
env_file:
|
||||||
- .env # Пароли и имя БД также берем из .env
|
- .env
|
||||||
networks:
|
networks:
|
||||||
- platform-net
|
- platform-net
|
||||||
|
|
||||||
# Определяем именованные тома для хранения данных между перезапусками контейнеров
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
caddy_data:
|
caddy_data:
|
||||||
caddy_config:
|
caddy_config:
|
||||||
|
|
||||||
# Определяем общую сеть для взаимодействия контейнеров по именам сервисов
|
|
||||||
networks:
|
networks:
|
||||||
platform-net:
|
platform-net:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|||||||
52
docs/CI_CD.md
Normal file
52
docs/CI_CD.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# Настройка CI/CD (Drone CI)
|
||||||
|
|
||||||
|
Проект настроен для автоматической сборки Docker-образов и их развертывания с помощью Drone CI.
|
||||||
|
|
||||||
|
## Обзор пайплайна (.drone.yml)
|
||||||
|
|
||||||
|
Конфигурация состоит из 4-х пайплайнов:
|
||||||
|
|
||||||
|
1. **build-backend**: Собирает образ `backend`, тегирует его (latest + commit SHA) и пушит в Docker Registry.
|
||||||
|
2. **build-frontend**: Многоэтапная сборка (Node.js build -> Nginx image), пуш в Registry.
|
||||||
|
3. **build-ping-helper**: Сборка микросервиса `ping-helper`.
|
||||||
|
4. **deploy-production**: Запускается только при пуше в `master` после успешного завершения всех сборок. Подключается к серверу по SSH, обновляет код, скачивает новые образы и перезапускает контейнеры.
|
||||||
|
|
||||||
|
## Настройка интеграции (Gitea + Drone)
|
||||||
|
|
||||||
|
1. **Активация репозитория**:
|
||||||
|
* Зайдите в ваш Drone CI.
|
||||||
|
* Найдите репозиторий `minecraft-platform/platform` и нажмите "Activate".
|
||||||
|
|
||||||
|
2. **Настройка секретов (Secrets)**:
|
||||||
|
В настройках репозитория в Drone добавьте следующие секреты:
|
||||||
|
|
||||||
|
| Имя Секрета | Описание |
|
||||||
|
| :--- | :--- |
|
||||||
|
| `gitea_username` | Логин пользователя Gitea, от имени которого будут пушиться образы в Registry. |
|
||||||
|
| `gitea_password` | Пароль (или токен) этого пользователя. |
|
||||||
|
| `ssh_host` | IP адрес или домен вашего продакшен-сервера. |
|
||||||
|
| `ssh_user` | Имя пользователя на сервере (например, `root` или `ubuntu`). |
|
||||||
|
| `ssh_key` | **Приватный** SSH ключ для доступа к серверу (Private Key, который соответствует Public Key в `~/.ssh/authorized_keys` на сервере). |
|
||||||
|
|
||||||
|
3. **Docker Registry**:
|
||||||
|
Убедитесь, что `gitea.mrixs.me` поддерживает Docker Registry и у пользователя есть права на запись в пакеты `minecraft-platform/backend`, `frontend`, `ping-helper`.
|
||||||
|
|
||||||
|
4. **Настройка Вебхука (Webhooks)**:
|
||||||
|
Чтобы Drone автоматически запускал сборку при пуше (push):
|
||||||
|
* В Gitea перейдите в **Settings** (Настройки) репозитория -> **Webhooks**.
|
||||||
|
* Проверьте, есть ли там вебхук для Drone. Если нет, он должен был создаться автоматически при активации репозитория в Drone.
|
||||||
|
* Если вебхука нет, добавьте его вручную:
|
||||||
|
* **Target URL**: `https://drone.mrixs.me/hook` (адрес вашего Drone сервера)
|
||||||
|
* **HTTP Method**: `POST`
|
||||||
|
* **Content Type**: `application/json`
|
||||||
|
* **Trigger On**: `All Events` (или как минимум Push и Pull Request)
|
||||||
|
* Нажмите "Test Delivery", чтобы проверить связь. Обратите внимание на код ответа (должен быть 200 OK).
|
||||||
|
|
||||||
|
## Процесс развертывания
|
||||||
|
|
||||||
|
1. Сделайте изменения в коде.
|
||||||
|
2. Закоммитьте и запушьте в ветку `master`.
|
||||||
|
3. Drone автоматически:
|
||||||
|
* Соберет новые образы.
|
||||||
|
* Запушит их в Registry.
|
||||||
|
* Зайдет на сервер, сделает `docker-compose pull` и `docker-compose up -d`.
|
||||||
102
docs/DEPLOYMENT.md
Normal file
102
docs/DEPLOYMENT.md
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# Руководство по развертыванию
|
||||||
|
|
||||||
|
## Предварительные требования
|
||||||
|
|
||||||
|
Для запуска платформы вам потребуются:
|
||||||
|
- **Docker** и **Docker Compose**
|
||||||
|
- **Git**
|
||||||
|
- Сгенерированная пара RSA ключей для подписи профилей (private.pem, public.pem)
|
||||||
|
- Доменное имя (для корректной работы SSL и Yggdrasil API)
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
Проект использует Git Submodules. После клонирования репозитория необходимо инициализировать подмодули:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone --recursive https://git.mrixs.me/minecraft-platform/platform.git
|
||||||
|
# Или если уже склонировали:
|
||||||
|
git submodule update --init --recursive
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
### 1. Переменные окружения (.env)
|
||||||
|
|
||||||
|
Создайте файл `.env` в корне проекта на основе примера. Основные переменные:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
APP_DOMAIN=yourdomain.com
|
||||||
|
DATABASE_URL=postgres://user:password@db:5432/platform?sslmode=disable
|
||||||
|
JWT_SECRET_KEY=super_secret_key_change_me
|
||||||
|
CURSEFORGE_API_KEY=your_curseforge_api_key_here
|
||||||
|
RSA_PRIVATE_KEY_PATH=/app/secrets/private_key.pem
|
||||||
|
MODPACKS_STORAGE_PATH=/app/data/modpacks
|
||||||
|
SKINS_STORAGE_PATH=/app/data/skins
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. RSA Ключи
|
||||||
|
|
||||||
|
Сгенерируйте ключи для подписи профилей Yggdrasil:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p secrets
|
||||||
|
openssl genrsa -out secrets/private_key.pem 2048
|
||||||
|
openssl rsa -in secrets/private_key.pem -pubout -out secrets/public_key.pem
|
||||||
|
```
|
||||||
|
|
||||||
|
Файл `private_key.pem` должен быть доступен бэкенду (см. `docker-compose.yml`).
|
||||||
|
|
||||||
|
### 3. База данных
|
||||||
|
|
||||||
|
При первом запуске необходимо применить миграции. Скрипты миграций находятся в `backend/scripts/migrations/`.
|
||||||
|
|
||||||
|
Если вы используете Docker Compose, миграции можно применить вручную или добавить init-контейнер. Для ручного применения (пример с `psql`):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Подключение к контейнеру БД
|
||||||
|
docker-compose exec db psql -U user -d platform
|
||||||
|
|
||||||
|
# Внутри psql примените SQL файлы из backend/scripts/migrations/
|
||||||
|
```
|
||||||
|
|
||||||
|
*Примечание: в будущих версиях планируется автоматическая миграция.*
|
||||||
|
|
||||||
|
## Запуск в Docker Compose
|
||||||
|
|
||||||
|
Сборка и запуск всех сервисов:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
Сервисы:
|
||||||
|
- **frontend**: Статика и UI (доступен по http://localhost:80 или через Caddy)
|
||||||
|
- **backend**: API сервер (http://backend:8080)
|
||||||
|
- **db**: PostgreSQL
|
||||||
|
- **caddy**: Reverse Proxy (автоматический HTTPS)
|
||||||
|
|
||||||
|
## Настройка Caddy (Reverse Proxy)
|
||||||
|
|
||||||
|
В корне проекта находится `Caddyfile`. Отредактируйте его, указав ваш домен:
|
||||||
|
|
||||||
|
```caddyfile
|
||||||
|
yourdomain.com {
|
||||||
|
reverse_proxy /api/* backend:8080
|
||||||
|
reverse_proxy /authserver/* backend:8080
|
||||||
|
reverse_proxy /sessionserver/* backend:8080
|
||||||
|
|
||||||
|
# Frontend files
|
||||||
|
root * /srv
|
||||||
|
file_server
|
||||||
|
try_files {path} /index.html
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Обновление
|
||||||
|
|
||||||
|
Для обновления версий (после `git pull`):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git submodule update --remote --merge
|
||||||
|
docker-compose up -d --build
|
||||||
|
```
|
||||||
54
docs/USER_GUIDE.md
Normal file
54
docs/USER_GUIDE.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Руководство пользователя и администратора
|
||||||
|
|
||||||
|
## Для Пользователей
|
||||||
|
|
||||||
|
### Регистрация и Вход
|
||||||
|
1. Перейдите на страницу регистрации.
|
||||||
|
2. Введите имя пользователя, email и пароль.
|
||||||
|
3. После регистрации используйте email и пароль для входа.
|
||||||
|
|
||||||
|
### Управление профилем (Скины)
|
||||||
|
1. В личном кабинете вы можете загрузить **Скин** для вашего персонажа.
|
||||||
|
2. Поддерживаются стандартные PNG файлы скинов.
|
||||||
|
3. Загруженный скин будет автоматически отображаться в игре на серверах платформы.
|
||||||
|
|
||||||
|
### Использование Лаунчера
|
||||||
|
1. Скачайте наш кастомный лаунчер (на базе HMCL).
|
||||||
|
2. Запустите лаунчер.
|
||||||
|
3. Выберите метод авторизации: **Authlib Injector** (или Yggdrasil).
|
||||||
|
4. Введите адрес API платформы (например, `https://yourdomain.com/api/yggdrasil` - уточните у администратора).
|
||||||
|
5. Введите ваши Email и Пароль от платформы.
|
||||||
|
6. Выберите нужный модпак из списка и нажмите "Играть".
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Для Администраторов
|
||||||
|
|
||||||
|
Административный интерфейс доступен пользователям с ролью `admin`.
|
||||||
|
|
||||||
|
### Управление Модпаками
|
||||||
|
|
||||||
|
В разделе "Модпаки" вы можете добавлять новые сборки и обновлять существующие.
|
||||||
|
|
||||||
|
#### Импорт нового модпака
|
||||||
|
1. Нажмите "Импорт модпака".
|
||||||
|
2. Выберите тип импортера:
|
||||||
|
- **Simple ZIP**: Обычный архив с файлами игры.
|
||||||
|
- **CurseForge**: Импорт по ссылке или файлу манифеста CurseForge.
|
||||||
|
- **Modrinth**: Импорт `.mrpack` файлов.
|
||||||
|
3. Загрузите файл или укажите URL (для CurseForge).
|
||||||
|
4. Система запустит фоновую задачу по скачиванию и обработке файлов. Следите за прогресс-баром.
|
||||||
|
|
||||||
|
#### Обновление модпака
|
||||||
|
1. В списке модпаков нажмите кнопку "Обновить" напротив нужной сборки.
|
||||||
|
2. В модальном окне выберите новый файл обновления (например, новую версию `.mrpack` или ZIP).
|
||||||
|
3. При желании измените версию Minecraft.
|
||||||
|
4. После подтверждения, система удалит старые файлы сборки и загрузит новые. Клиенты получат обновление автоматически при следующем запуске лаунчера.
|
||||||
|
|
||||||
|
### Управление Пользователями
|
||||||
|
1. В разделе "Пользователи" отображается список всех зарегистрированных игроков.
|
||||||
|
2. Вы можете менять роли пользователей (например, выдать права администратора) через меню действий.
|
||||||
|
|
||||||
|
### Игровые Сервера и Карта
|
||||||
|
1. В разделе "Сервера" отображается статус подключенных игровых серверов (онлайн, игроки).
|
||||||
|
2. Если для сервера настроен **BlueMap**, появится кнопка "Карта мира", открывающая веб-карту в браузере.
|
||||||
2
frontend
2
frontend
Submodule frontend updated: f9e0c068f4...635941f635
Submodule ping-helper updated: 3f1e4942dd...59d64a724a
0
scripts/backup.sh
Normal file
0
scripts/backup.sh
Normal file
6
scripts/migrations/002_modpacks_updated_at.sql
Normal file
6
scripts/migrations/002_modpacks_updated_at.sql
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
ALTER TABLE modpacks ADD COLUMN updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW();
|
||||||
|
|
||||||
|
CREATE TRIGGER set_timestamp_modpacks
|
||||||
|
BEFORE UPDATE ON modpacks
|
||||||
|
FOR EACH ROW
|
||||||
|
EXECUTE FUNCTION trigger_set_timestamp();
|
||||||
13
scripts/migrations/003_modpack_import_jobs.sql
Normal file
13
scripts/migrations/003_modpack_import_jobs.sql
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
CREATE TABLE modpack_import_jobs (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
status VARCHAR(50) NOT NULL DEFAULT 'pending',
|
||||||
|
progress INT NOT NULL DEFAULT 0,
|
||||||
|
error_message TEXT,
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TRIGGER set_timestamp_import_jobs
|
||||||
|
BEFORE UPDATE ON modpack_import_jobs
|
||||||
|
FOR EACH ROW
|
||||||
|
EXECUTE FUNCTION trigger_set_timestamp();
|
||||||
2
scripts/migrations/004_add_bluemap_url.sql
Normal file
2
scripts/migrations/004_add_bluemap_url.sql
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
-- Add bluemap_url column to game_servers table
|
||||||
|
ALTER TABLE game_servers ADD COLUMN bluemap_url VARCHAR(255);
|
||||||
Reference in New Issue
Block a user