ospab 9bbf88a8f7 feat: Implement dark mode support across the application
- Added ThemeContext to manage theme state and toggle functionality.
- Updated components to support dark mode styles, including header, dashboard, and home page.
- Enhanced CSS for smooth transitions between light and dark themes.
- Modified authentication context to handle async login operations.
- Improved user experience by preserving theme preference in local storage.
- Refactored login and register pages to handle OAuth tokens and errors more gracefully.
2026-01-05 20:11:22 +03:00
2025-11-01 12:29:46 +03:00
2026-01-01 01:26:23 +03:00
2025-11-01 12:29:46 +03:00
2025-11-01 12:29:46 +03:00

🚀 Ospabhost 8.1

Современная платформа хостинга с поддержкой VPS, S3-хранилищ и системой блогов.

📋 Содержание


🎯 О проекте

Ospabhost 8.1 — полнофункциональная система управления хостингом с интеграцией Proxmox для VPS, MinIO для S3-хранилищ и встроенной CMS для блога.

Ключевые особенности

  • 🖥️ VPS Management - создание и управление виртуальными серверами через Proxmox API
  • 💾 S3 Storage - совместимое с AWS S3 объектное хранилище на базе MinIO
  • 📝 Blog CMS - встроенная система блогов с Rich Text редактором
  • 🎫 Ticketing - система поддержки с авто-назначением операторов
  • 💰 Billing - модуль управления балансом и оплатами
  • 🔐 Auth - JWT авторизация с ролями (пользователь/оператор/администратор)
  • 📊 Admin Panel - полнофункциональная панель администратора

🌟 Возможности

Для пользователей

  • VPS серверы

    • Создание серверов с выбором ОС и тарифа
    • Управление (старт/стоп/рестарт/удаление)
    • Смена root-пароля
    • Изменение ресурсов (resize)
    • Создание и восстановление снапшотов
    • Мониторинг статуса и статистики
  • S3 хранилища

    • Создание бакетов с выбором региона и класса хранения
    • Кастомный тариф с оплатой за GB
    • Загрузка/скачивание файлов
    • Управление публичным доступом
    • Версионирование объектов
    • Presigned URL для временного доступа
    • Web-консоль для управления
  • Блог

    • Чтение статей и комментирование
    • Просмотр статей по URL-адресу
    • Счётчик просмотров
  • Тикеты

    • Создание обращений в поддержку
    • Переписка с операторами
    • Загрузка скриншотов
    • Отслеживание статуса
  • Баланс

    • Пополнение через загрузку чека
    • История транзакций
    • Автоматическая проверка чеков администратором

Для операторов

  • Просмотр и ответ на тикеты
  • Автоматическое назначение новых тикетов
  • Авто-снятие с тикета при закрытии пользователем

Для администраторов

  • Управление пользователями

    • Просмотр всех пользователей
    • Редактирование баланса
    • Назначение роли оператора
    • Блокировка/разблокировка
  • Управление тарифами

    • Редактирование цен на VPS
    • Настройка S3 тарифов
    • Управление кастомным тарифом (цена за GB, трафик, операции)
  • Управление блогом

    • Создание/редактирование статей
    • Rich Text редактор с загрузкой изображений
    • Модерация комментариев
    • Управление статусами (черновик/опубликовано/архив)
  • Проверка чеков

    • Одобрение/отклонение заявок на пополнение
    • Просмотр загруженных чеков
  • Тестирование

    • Отправка push-уведомлений
    • Отправка email-уведомлений
    • Логирование результатов

🏗️ Архитектура

Монорепозиторий

Проект состоит из двух основных частей:

ospabhost/
├── backend/      # Express + TypeScript + Prisma
└── frontend/     # React + Vite + TypeScript

Backend модули

backend/src/modules/
├── auth/         # Авторизация и JWT
├── server/       # VPS управление (Proxmox)
├── storage/      # S3 хранилища (MinIO)
├── blog/         # Система блогов
├── ticket/       # Тикеты поддержки
├── check/        # Проверка чеков
├── notification/ # Уведомления
├── tariff/       # Тарифы
├── os/           # Операционные системы
└── admin/        # Админ панель

База данных

Используется MySQL с ORM Prisma:

  • User - пользователи с ролями
  • Server - VPS серверы с привязкой к Proxmox
  • Tariff - тарифные планы
  • OS - операционные системы
  • StoragePlan - тарифы S3 (с полями pricePerGb, bandwidthPerGb, requestsPerGb)
  • StorageBucket - S3 бакеты пользователей
  • Post - статьи блога
  • Comment - комментарии к статьям
  • Ticket - тикеты поддержки
  • TicketMessage - сообщения в тикетах
  • Check - чеки для пополнения
  • Notification - уведомления пользователей

🛠️ Технологии

Backend

  • Node.js 18+
  • Express.js - веб-фреймворк
  • TypeScript - типизация
  • Prisma ORM - работа с БД
  • MySQL - база данных
  • JWT - авторизация
  • Multer - загрузка файлов
  • Axios - HTTP клиент для Proxmox API
  • bcrypt - хеширование паролей
  • MinIO SDK - работа с S3

Frontend

  • React 18 - UI библиотека
  • TypeScript - типизация
  • Vite - сборщик
  • React Router - маршрутизация
  • Tailwind CSS - стилизация
  • React Icons - иконки
  • React Quill - Rich Text редактор
  • Axios - HTTP клиент

DevOps

  • PM2 - процесс-менеджер
  • Nginx - веб-сервер и прокси
  • Git - контроль версий

🚀 Быстрый старт

Требования

  • Node.js 18+
  • MySQL 8+
  • Proxmox VE (для VPS)
  • MinIO (для S3)

Установка

  1. Клонирование репозитория
git clone https://github.com/Ospab/ospabhost8.1.git
cd ospabhost8.1/ospabhost
  1. Настройка Backend
cd backend
npm install

Создайте .env:

DATABASE_URL="mysql://user:password@localhost:3306/ospabhost"
JWT_SECRET="your-secret-key"
PORT=5000

# Proxmox
PROXMOX_HOST="your-proxmox-host"
PROXMOX_USER="root@pam"
PROXMOX_PASSWORD="your-password"
PROXMOX_NODE="pve"

# MinIO
MINIO_ENDPOINT="localhost"
MINIO_PORT=9000
MINIO_ACCESS_KEY="your-access-key"
MINIO_SECRET_KEY="your-secret-key"
MINIO_BUCKET_PREFIX="ospab"

Примените миграции:

npx prisma migrate deploy
npx prisma generate
npx prisma db seed

Запустите:

npm run dev  # Разработка
npm run build && npm start  # Продакшн
  1. Настройка Frontend
cd ../frontend
npm install

Создайте .env:

VITE_API_URL=http://localhost:5000

Запустите:

npm run dev  # Разработка
npm run build  # Сборка для продакшн
  1. Доступ

Первый пользователь автоматически становится администратором.


🌐 Развёртывание

На сервере

  1. Подготовка окружения
# Установка Node.js 18
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# Установка MySQL
sudo apt install mysql-server

# Установка PM2
sudo npm install -g pm2

# Установка Nginx
sudo apt install nginx
  1. Клонирование и настройка
cd /var/www
git clone https://github.com/Ospab/ospabhost8.1.git ospab-host
cd ospab-host/ospabhost
  1. Backend
cd backend
npm install
cp .env.example .env
# Отредактируйте .env

npx prisma migrate deploy
npx prisma generate
npm run build

pm2 start dist/index.js --name ospab-backend
pm2 save
pm2 startup
  1. Frontend
cd ../frontend
npm install
cp .env.example .env
# Отредактируйте .env

npm run build
  1. Nginx
server {
    listen 80;
    server_name your-domain.com;

    # Frontend
    location / {
        root /var/www/ospab-host/ospabhost/frontend/dist;
        try_files $uri $uri/ /index.html;
    }

    # Backend API
    location /api {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    # Uploads (чеки, изображения блога)
    location /uploads {
        alias /var/www/ospab-host/ospabhost/backend/uploads;
        access_log off;
        expires 30d;
    }
}
sudo nginx -t
sudo systemctl reload nginx
  1. SSL (Let's Encrypt)
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com

Развёртывание блога

См. подробную инструкцию в BLOG_DEPLOYMENT.md и быстрый старт в BLOG_QUICKSTART.md.


📚 API документация

Публичные эндпоинты

Авторизация

POST /api/auth/register
Content-Type: application/json

{
  "username": "user",
  "email": "user@example.com",
  "password": "password"
}
POST /api/auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "password"
}

Блог

GET /api/blog/posts
# Список опубликованных статей

GET /api/blog/posts/:url
# Статья по URL

POST /api/blog/posts/:postId/comments
# Добавить комментарий (требуется авторизация или имя гостя)

S3 Storage

GET /api/storage/plans
# Список тарифов

POST /api/storage/checkout
# Создать корзину для оплаты

Защищённые эндпоинты

Все запросы требуют заголовок:

Authorization: Bearer YOUR_JWT_TOKEN

Серверы (VPS)

GET /api/servers
# Список серверов пользователя

POST /api/servers
# Создать сервер

POST /api/servers/:id/start
# Запустить сервер

POST /api/servers/:id/stop
# Остановить сервер

POST /api/servers/:id/restart
# Перезагрузить сервер

DELETE /api/servers/:id
# Удалить сервер

POST /api/servers/:id/change-password
# Сменить root пароль

PUT /api/servers/:id/resize
# Изменить ресурсы

POST /api/servers/:id/snapshot
# Создать снапшот

GET /api/servers/:id/snapshots
# Список снапшотов

POST /api/servers/:id/rollback
# Откатиться к снапшоту

DELETE /api/servers/:id/snapshots/:snapshotName
# Удалить снапшот

S3 Buckets

GET /api/storage/buckets
# Список бакетов

POST /api/storage/buckets
# Создать бакет

GET /api/storage/buckets/:id
# Информация о бакете

DELETE /api/storage/buckets/:id
# Удалить бакет

PUT /api/storage/buckets/:id
# Обновить настройки

GET /api/storage/buckets/:id/objects
# Список объектов

POST /api/storage/buckets/:id/presign
# Создать presigned URL

DELETE /api/storage/buckets/:id/objects
# Удалить объекты

POST /api/storage/buckets/:id/console-credentials
# Создать учётные данные для web-консоли

Тикеты

GET /api/tickets
# Список тикетов

POST /api/tickets
# Создать тикет

GET /api/tickets/:id
# Информация о тикете

POST /api/tickets/:id/messages
# Отправить сообщение

PATCH /api/tickets/:id/close
# Закрыть тикет

Администратор

GET /api/admin/users
# Список всех пользователей

PUT /api/admin/users/:id
# Редактировать пользователя

GET /api/admin/checks
# Список всех чеков

PUT /api/admin/checks/:id
# Одобрить/отклонить чек

GET /api/blog/admin/posts
# Все статьи блога

POST /api/blog/admin/posts
# Создать статью

PUT /api/blog/admin/posts/:id
# Обновить статью

DELETE /api/blog/admin/posts/:id
# Удалить статью

POST /api/blog/admin/upload-image
# Загрузить изображение

GET /api/blog/admin/comments
# Все комментарии

PATCH /api/blog/admin/comments/:id
# Модерировать комментарий

DELETE /api/blog/admin/comments/:id
# Удалить комментарий

PUT /api/storage/plans/:id
# Редактировать тариф S3 (включая pricePerGb, bandwidthPerGb, requestsPerGb)

POST /api/admin/test/push-notification
# Тест push-уведомлений

POST /api/admin/test/email-notification
# Тест email-уведомлений

📁 Структура проекта

ospabhost8.1/
├── ospabhost/
│   ├── backend/
│   │   ├── src/
│   │   │   ├── modules/
│   │   │   │   ├── auth/
│   │   │   │   │   ├── auth.controller.ts
│   │   │   │   │   ├── auth.routes.ts
│   │   │   │   │   └── auth.middleware.ts
│   │   │   │   ├── server/
│   │   │   │   │   ├── server.controller.ts
│   │   │   │   │   ├── server.routes.ts
│   │   │   │   │   └── proxmoxApi.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── storage.service.ts
│   │   │   │   │   └── storage.routes.ts
│   │   │   │   ├── blog/
│   │   │   │   │   ├── blog.controller.ts
│   │   │   │   │   ├── blog.routes.ts
│   │   │   │   │   └── upload.controller.ts
│   │   │   │   ├── admin/
│   │   │   │   │   ├── admin.controller.ts
│   │   │   │   │   └── admin.routes.ts
│   │   │   │   ├── ticket/
│   │   │   │   ├── check/
│   │   │   │   ├── notification/
│   │   │   │   ├── tariff/
│   │   │   │   └── os/
│   │   │   ├── prisma/
│   │   │   │   └── client.ts
│   │   │   ├── index.ts
│   │   │   └── server.ts
│   │   ├── prisma/
│   │   │   ├── schema.prisma
│   │   │   ├── migrations/
│   │   │   ├── seed.ts
│   │   │   └── seed_os.ts
│   │   ├── uploads/
│   │   │   ├── checks/
│   │   │   └── blog/
│   │   ├── package.json
│   │   └── tsconfig.json
│   │
│   └── frontend/
│       ├── src/
│       │   ├── pages/
│       │   │   ├── index.tsx
│       │   │   ├── login.tsx
│       │   │   ├── pricing.tsx
│       │   │   ├── blog.tsx
│       │   │   ├── blogpost.tsx
│       │   │   └── dashboard/
│       │   │       ├── mainpage.tsx
│       │   │       ├── servers.tsx
│       │   │       ├── storage.tsx
│       │   │       ├── tickets.tsx
│       │   │       ├── balance.tsx
│       │   │       ├── admin.tsx
│       │   │       └── blogadmin.tsx
│       │   ├── components/
│       │   │   ├── Navbar.tsx
│       │   │   ├── Footer.tsx
│       │   │   ├── AdminPricingTab.tsx
│       │   │   └── AdminTestingTab.tsx
│       │   ├── context/
│       │   │   └── authcontext.tsx
│       │   ├── hooks/
│       │   │   ├── useAuth.ts
│       │   │   └── useToast.ts
│       │   ├── utils/
│       │   │   └── apiClient.ts
│       │   ├── config/
│       │   │   └── api.ts
│       │   ├── App.tsx
│       │   └── main.tsx
│       ├── package.json
│       ├── vite.config.ts
│       └── tailwind.config.js
│
├── README.md
├── CONTRIBUTING.md
├── BLOG_DEPLOYMENT.md
└── BLOG_QUICKSTART.md

💻 Разработка

Установка зависимостей

# Backend
cd ospabhost/backend
npm install

# Frontend
cd ospabhost/frontend
npm install

Запуск в режиме разработки

# Backend (порт 5000)
cd backend
npm run dev

# Frontend (порт 5173)
cd frontend
npm run dev

Линтинг и форматирование

# Frontend
npm run lint

Работа с БД

# Создать миграцию
npx prisma migrate dev --name migration_name

# Применить миграции
npx prisma migrate deploy

# Открыть Prisma Studio
npx prisma studio

# Сгенерировать Prisma Client
npx prisma generate

# Заполнить БД начальными данными
npx prisma db seed

Сборка

# Backend
npm run build

# Frontend
npm run build
npm run preview  # Предпросмотр production сборки

🐛 Известные проблемы и решения

Backend

Проблема: "post and comment are not properties of PrismaClient"

Решение:

cd backend
npx prisma generate
npm run build
pm2 restart ospab-backend

Проблема: 404 ошибки на /api/admin/test/*

Решение:

  • Проверьте порядок middleware в admin.routes.ts (test endpoints должны быть BEFORE requireAdmin)
  • Перезапустите dev-server

Проблема: Кастомный тариф не возвращает pricePerGb

Решение:

  • Убедитесь что функция serializePlan в storage.service.ts включает поля pricePerGb, bandwidthPerGb, requestsPerGb
  • Пересоберите backend: npm run build

Frontend

Проблема: Не отображается вкладка "📝 Блог"

Решение:

  • Убедитесь что пользователь имеет isAdmin: true
  • Пересоберите frontend: npm run build

Проблема: Rich Text редактор не загружается

Решение:

cd frontend
npm install react-quill quill --legacy-peer-deps
npm run build

Проблема: Не могу изменить цену за GB в кастомном тарифе

Решение:

  • UI уже реализован в AdminPricingTab.tsx
  • Backend должен возвращать эти поля через serializePlan
  • Перезапустите оба сервиса

S3 Storage

Проблема: Изображения не загружаются

Проверьте:

  1. Права на директорию backend/uploads/blog (должно быть 755)
  2. Nginx раздаёт /uploads/blog
  3. В логах backend нет ошибок multer
# Проверка прав
ls -la /var/www/ospab-host/ospabhost/backend/uploads/blog

# Проверка логов
pm2 logs ospab-backend --lines 50

🤝 Вклад в проект

Мы приветствуем вклад в развитие проекта! См. CONTRIBUTING.md для деталей.

Процесс

  1. Форкните репозиторий
  2. Создайте ветку для фичи (git checkout -b feature/AmazingFeature)
  3. Закоммитьте изменения (git commit -m 'feat: add amazing feature')
  4. Запушьте в ветку (git push origin feature/AmazingFeature)
  5. Откройте Pull Request

Стандарты коммитов

Используем Conventional Commits:

feat(storage): add custom tariff pricing
fix(ticket): auto-unassign operator on user close
docs: update API endpoints in README
refactor(auth): remove any types from middleware

📄 Лицензия

Этот проект является частной разработкой. Все права защищены.


👥 Команда

  • Ospab - Основатель и главный разработчик

📞 Контакты


🙏 Благодарности

  • Proxmox VE - виртуализация
  • MinIO - S3-совместимое хранилище
  • Prisma - ORM для Node.js
  • React - UI библиотека
  • Tailwind CSS - CSS фреймворк
  • Quill - Rich Text редактор

Версия: 8.1
Последнее обновление: 26 ноября 2025

Description
No description provided
Readme 224 MiB
Languages
TypeScript 97%
Shell 1.2%
JavaScript 0.7%
HTML 0.5%
CSS 0.5%