Compare commits

...

34 Commits

Author SHA1 Message Date
f417091909 fix(ci): rename key to ssh_key in Drone ssh pipeline
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-17 01:31:31 +03:00
9b55f965ff remove varbose build log
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-16 19:05:44 +03:00
65447995e3 chore: use docker compose instead of docker-compose
Some checks failed
continuous-integration/drone/push Build was killed
2026-01-16 17:39:28 +03:00
36c40b611f fix: call checkAuth on app mount to restore session from localStorage
Some checks failed
continuous-integration/drone/push Build was killed
2026-01-16 17:14:37 +03:00
49cbb78774 fix: use :80 instead of domain for internal Caddy (TLS handled externally)
Some checks failed
continuous-integration/drone/push Build was killed
2026-01-16 17:11:15 +03:00
9433a2e655 fix: restructure Caddyfile with proper directive ordering using matchers
Some checks failed
continuous-integration/drone/push Build was killed
2026-01-16 16:54:05 +03:00
40209e4564 fix: use handle instead of handle_path for WebSocket proxy
Some checks failed
continuous-integration/drone/push Build was killed
2026-01-16 16:25:38 +03:00
a482cf3832 fix: add nginx config for SPA routing support
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-16 14:38:37 +03:00
51c5941fe8 add verbose logging for image build
Some checks failed
continuous-integration/drone/push Build was killed
2026-01-14 16:42:18 +03:00
b679b3a15b build: update submodules to fix docker build issues
Some checks failed
continuous-integration/drone/push Build was killed
2026-01-12 17:58:20 +03:00
cc0444b2bb build: fix frontend pipeline steps and bypass backend proxy
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-12 17:24:48 +03:00
0b16a20d83 sync
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-12 17:18:20 +03:00
2ddb1905f2 ci: trigger drone build
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-12 17:14:15 +03:00
a72ae3ab18 ci: trigger drone build 2026-01-12 17:12:17 +03:00
46ba42dc9a ci: trigger drone build 2026-01-12 17:09:00 +03:00
148bac8673 ci: trigger drone build 2026-01-12 17:07:01 +03:00
86b5c0622c ci: trigger drone build 2026-01-12 17:06:07 +03:00
c0e36700a9 ci: use explicit ref trigger for production deployment 2026-01-12 16:57:05 +03:00
53e743578f ci: remove path triggers to ensure builds always run 2026-01-12 16:50:49 +03:00
072ab74231 docs: add webhook configuration instructions to CI_CD.md 2026-01-12 16:47:54 +03:00
c046f5f6c8 update 2026-01-06 20:13:50 +03:00
01b7e707ab docs: update main readme with project overview and links 2026-01-06 19:32:10 +03:00
805e1a2791 docs: add user and admin guide 2026-01-06 19:30:47 +03:00
6d2fab922e docs: add deployment guide 2026-01-06 19:28:39 +03:00
c737595a52 feat: add async modpack import support 2026-01-05 18:07:09 +03:00
ab7bd84859 chore: update backend with operational best practices 2026-01-04 15:06:39 +03:00
7e5f46dca2 feat: add Modrinth importer support 2026-01-04 15:02:26 +03:00
3f3b202d47 feat: add modpack update tracking feature 2026-01-04 14:38:26 +03:00
9cb39e6afb chore: update backend and frontend submodules with session restoration feature 2026-01-04 14:31:51 +03:00
9ed5aa1163 fix(backend): update submodule with robust curseforge importer
Some checks failed
continuous-integration/drone/push Build is failing
2025-06-19 18:10:50 +03:00
8f9ab02c56 fix(backend): update submodule with importer struct fix
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-19 18:00:21 +03:00
936a8b4007 fix(backend): update submodule with improved curseforge importer
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-19 17:46:22 +03:00
22d2b411ab fix(backend): update submodule with correct curseforge importer
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-19 17:27:42 +03:00
7d73669d26 feat(backend, frontend): added curseforge import by url
All checks were successful
continuous-integration/drone/push Build is passing
2025-06-19 17:16:43 +03:00
14 changed files with 371 additions and 85 deletions

View File

@@ -9,8 +9,6 @@ clone:
# Запускать только если были изменения в папке backend/
trigger:
event: [push, pull_request]
path:
- backend/**
steps:
- name: force-init-submodules
@@ -56,8 +54,6 @@ clone:
trigger:
event: [push, pull_request]
path:
- ping-helper/**
steps:
- name: force-init-submodules
@@ -86,45 +82,78 @@ steps:
- ${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
type: ssh
name: deploy-production
# Запускать только при пуше в ветку main
# Запускать только при пуше в ветку master
trigger:
branch: [main]
ref:
- refs/heads/master
event: [push]
# Этот пайплайн зависит от успешного выполнения сборок
depends_on:
- build-backend
- build-ping-helper
- build-frontend
# Настройки подключения к вашему серверу
server:
host: { from_secret: ssh_host }
user: { from_secret: ssh_user }
key: { from_secret: ssh_key }
ssh_key: { from_secret: ssh_key }
# Команды, которые будут выполнены на сервере
# ВАЖНО: Замените /home/user/platform на реальный путь к вашему проекту на сервере
commands:
- echo "--- Starting deployment ---"
- cd /home/user/platform # Переходим в директорию проекта
- cd $DEPLOY_PATH # Переходим в директорию проекта
- echo "1. Updating repository..."
- git pull origin main # Обновляем основной репозиторий
- git pull origin master # Обновляем основной репозиторий
- 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..."
- echo "2. Pulling new Docker images..."
- docker compose pull # Скачиваем свежесобранные образы (backend, frontend, ping-helper)
- echo "3. Restarting services..."
- docker compose up -d --remove-orphans # Перезапускаем все сервисы
- echo "4. Cleaning up old images..."
- docker image prune -f # Удаляем неиспользуемые образы
- echo "--- Deployment finished ---"
environment:
DEPLOY_PATH: { from_secret: deploy_path }

View File

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

View File

@@ -2,22 +2,58 @@
[![Build Status](https://drone.mrixs.me/api/badges/minecraft-platform/platform/status.svg)](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 для пользователей и администраторов.
* `ping-helper/`: Вспомогательный WebSocket-сервис на Go для измерения пинга.
* `launcher/`: Кастомный игровой лаунчер (форк HMCL).
### 📦 Управление Модпаками
- **Автоматический импорт**: Поддержка импорта сборок с **CurseForge** и **Modrinth** (.mrpack).
- **Обновления**: Система версионирования сборок. Автоматическое обновление клиентов.
- **Оптимизация**: Дедупликация файлов для экономии места на сервере.
### Конфигурация
### 🖥️ Веб-интерфейс
- **Личный кабинет**: Управление профилем и скинами.
- **Админ-панель**: Управление пользователями, серверами и модпаками.
- **Мониторинг**: Отображение статуса серверов и онлайн-карты (**BlueMap**).
* `.drone.yml`: Пайплайн для Drone CI.
* `docker-compose.yml`: Описание сервисов для Docker.
* `Caddyfile`: Конфигурация веб-сервера Caddy.
* `scripts/`: Вспомогательные скрипты (миграции, бэкапы).
### ⚙️ Технические особенности
- **Микросервисная архитектура** (Go, Vue.js, PostgreSQL).
- **Асинхронная обработка**: Фоновые задачи для тяжелых операций (импорт сборок) с WebSocket-уведомлениями.
- **Безопасность**: 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
```

Submodule backend updated: 22d54dea63...a1e022e966

View File

@@ -11,11 +11,20 @@ services:
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./data/frontend:/srv/frontend
- ./data/textures:/srv/files/textures
- ./data/modpack_files:/srv/files/modpacks
- caddy_data:/data
- 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:
- platform-net
@@ -58,6 +67,7 @@ volumes:
caddy_data:
caddy_config:
networks:
platform-net:
driver: bridge

52
docs/CI_CD.md Normal file
View 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
View 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
View 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**, появится кнопка "Карта мира", открывающая веб-карту в браузере.

0
scripts/backup.sh Normal file
View File

View 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();

View 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();

View File

@@ -0,0 +1,2 @@
-- Add bluemap_url column to game_servers table
ALTER TABLE game_servers ADD COLUMN bluemap_url VARCHAR(255);