- 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.
🚀 Ospabhost 8.1
Современная платформа хостинга с поддержкой VPS, S3-хранилищ и системой блогов.
📋 Содержание
- О проекте
- Возможности
- Архитектура
- Технологии
- Быстрый старт
- Развёртывание
- API документация
- Структура проекта
- Разработка
- Вклад в проект
🎯 О проекте
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 серверы с привязкой к ProxmoxTariff- тарифные планы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)
Установка
- Клонирование репозитория
git clone https://github.com/Ospab/ospabhost8.1.git
cd ospabhost8.1/ospabhost
- Настройка 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 # Продакшн
- Настройка Frontend
cd ../frontend
npm install
Создайте .env:
VITE_API_URL=http://localhost:5000
Запустите:
npm run dev # Разработка
npm run build # Сборка для продакшн
- Доступ
- Frontend: http://localhost:5173
- Backend API: http://localhost:5000
- Панель управления: http://localhost:5173/dashboard
Первый пользователь автоматически становится администратором.
🌐 Развёртывание
На сервере
- Подготовка окружения
# Установка 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
- Клонирование и настройка
cd /var/www
git clone https://github.com/Ospab/ospabhost8.1.git ospab-host
cd ospab-host/ospabhost
- 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
- Frontend
cd ../frontend
npm install
cp .env.example .env
# Отредактируйте .env
npm run build
- 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
- 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
Проблема: Изображения не загружаются
Проверьте:
- Права на директорию
backend/uploads/blog(должно быть755) - Nginx раздаёт
/uploads/blog - В логах backend нет ошибок multer
# Проверка прав
ls -la /var/www/ospab-host/ospabhost/backend/uploads/blog
# Проверка логов
pm2 logs ospab-backend --lines 50
🤝 Вклад в проект
Мы приветствуем вклад в развитие проекта! См. CONTRIBUTING.md для деталей.
Процесс
- Форкните репозиторий
- Создайте ветку для фичи (
git checkout -b feature/AmazingFeature) - Закоммитьте изменения (
git commit -m 'feat: add amazing feature') - Запушьте в ветку (
git push origin feature/AmazingFeature) - Откройте 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 - Основатель и главный разработчик
📞 Контакты
- Website: ospab.host
- Email: support@ospab.host
- Telegram: @ospab
🙏 Благодарности
- Proxmox VE - виртуализация
- MinIO - S3-совместимое хранилище
- Prisma - ORM для Node.js
- React - UI библиотека
- Tailwind CSS - CSS фреймворк
- Quill - Rich Text редактор
Версия: 8.1
Последнее обновление: 26 ноября 2025