# 🚀 Ospabhost 8.1 - Платформа S3 Объектного Хранилища Современная платформа управления S3-совместимым объектным хранилищем с системой биллинга, блогом и тикетами поддержки. ![Version](https://img.shields.io/badge/version-8.1-blue) ![Node.js](https://img.shields.io/badge/node.js-v24+-green) ![TypeScript](https://img.shields.io/badge/typescript-5.x-blue) [🇬🇧 English version](README.md) --- ## 📋 Содержание - [О проекте](#о-проекте) - [Возможности](#возможности) - [Технологии](#технологии) - [Быстрый старт](#быстрый-старт) - [Развёртывание](#развёртывание) - [Структура проекта](#структура-проекта) - [API документация](#api-документация) - [Участие в разработке](#участие-в-разработке) --- ## 🎯 О проекте **Ospabhost 8.1** — это комплексная платформа управления S3-совместимым объектным хранилищем на базе MinIO, включающая: - 💾 **S3 Хранилище** - Полнофункциональное хранилище на базе MinIO с совместимостью AWS S3 - 📝 **CMS Блога** - Встроенная система управления контентом с Rich Text редактором - 🎫 **Тикеты Поддержки** - Система тикетов с приоритетами и вложениями - 💰 **Биллинг** - Управление балансом с проверкой чеков - 🔐 **Авторизация** - JWT + OAuth (Google, GitHub, Yandex) + QR-авторизация - 🔔 **Уведомления** - Web Push и email уведомления - 🌓 **Тёмная Тема** - Автоматическая тёмная тема с определением системных настроек - 📊 **Админ Панель** - Полная панель администрирования --- ## 🌟 Возможности ### Для пользователей #### S3 Объектное Хранилище - **Управление бакетами** - Создание бакетов с выбором региона - Кастомные тарифные планы (за GB, трафик, запросы) - Контроль публичного/приватного доступа - Версионирование объектов - Presigned URL для временного доступа - **Множественная загрузка файлов** - Drag & Drop интерфейс - Выбор множественных файлов - Загрузка папок с сохранением структуры (webkitdirectory) - Загрузка по URI/URL - Отслеживание прогресса в реальном времени (проценты, скорость в MB/s) - Отмена загрузки - **Доступ к консоли MinIO** - Учётные данные в один клик (генерируются раз в неделю) - Прямое управление бакетами через UI MinIO - Расширенные S3 операции #### Блог - Чтение статей и комментирование - Доступ к статьям по URL - Счётчики просмотров - Поддержка RSS #### Тикеты Поддержки - Создание тикетов с приоритетом (низкий/обычный/высокий/срочный) и категорией - Вложения файлов (до 5 файлов по 10MB) - Обмен сообщениями с операторами в реальном времени - Отслеживание статуса: открыт → в работе → ожидает ответа → решён → закрыт - История тикетов #### Аккаунт и Безопасность - Управление балансом с загрузкой чеков - Управление активными сессиями (отслеживание IP, устройства, браузера) - История входов - QR-авторизация (как в Telegram Web) - Завершение отдельных сессий ### Для операторов - Просмотр и ответы на тикеты - Автоматическое назначение тикетов - Управление приоритетом и статусом - Внутренние заметки (невидимы для пользователей) ### Для администраторов - **Управление пользователями** - Просмотр всех пользователей - Редактирование баланса - Назначение роли оператора - Блокировка/разблокировка аккаунтов - **Управление ценами** - Настройка тарифных планов S3 - Кастомные цены (за GB, трафик, API запросы) - Категории тарифов - **Управление блогом** - Создание/редактирование статей с редактором Quill.js - Загрузка изображений - Модерация комментариев - SEO настройки - **Проверка чеков** - Одобрение/отклонение заявок на пополнение - Просмотр загруженных чеков - **Инструменты тестирования** - Отправка тестовых push-уведомлений - Отправка тестовых email - Мониторинг логов --- ## 🛠️ Технологии ### Backend - **Node.js 24+** с Express.js - **TypeScript 5.x** для типобезопасности - **Prisma ORM** с MySQL 8+ - **MinIO SDK** для S3 операций - **JWT** + **Passport.js** для авторизации - **Multer** для загрузки файлов - **web-push** для уведомлений - **Nodemailer** для email - **PM2** для управления процессами ### Frontend - **React 18** с TypeScript - **Vite 7.x** для быстрой сборки - **React Router 6** для навигации - **Tailwind CSS 3.3** для стилизации - **React Quill** для rich text редактирования - **Axios** для API запросов - **i18next** для локализации (en/ru) - **Service Worker** для push-уведомлений ### Инфраструктура - **MySQL 8+** база данных - **MinIO** S3-совместимое хранилище - **Nginx** reverse proxy - **PM2** менеджер процессов - **Git** (Gitea + GitHub) - **Let's Encrypt** SSL --- ## 🚀 Быстрый старт ### Требования - Node.js 24+ - MySQL 8+ - MinIO сервер ### Установка 1. **Клонирование репозитория** ```bash git clone http://localhost:4000/ospab/ospab.host.git cd ospab.host/ospabhost ``` 2. **Настройка Backend** ```bash cd backend npm install # Скопировать и настроить окружение cp .env.example .env # Отредактировать .env с вашими настройками # Настройка базы данных npx prisma migrate deploy npx prisma generate npx prisma db seed # Запуск dev сервера npm run dev ``` 3. **Настройка Frontend** ```bash cd ../frontend npm install # Скопировать и настроить окружение cp .env.example .env # Отредактировать .env с URL вашего API # Запуск dev сервера npm run dev ``` 4. **Доступ к приложению** - Frontend: http://localhost:5173 - Backend API: http://localhost:5000 - Панель управления: http://localhost:5173/dashboard Первый зарегистрированный пользователь автоматически становится администратором. --- ## 🌐 Развёртывание ### Production установка 1. **Установка зависимостей** ```bash # Node.js 24 curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - sudo apt-get install -y nodejs # MySQL и Nginx sudo apt install mysql-server nginx # PM2 sudo npm install -g pm2 ``` 2. **Развёртывание Backend** ```bash cd /var/www/ospab.host/ospabhost/backend npm install cp .env.example .env # Настроить .env # Создать директории для загрузок mkdir -p uploads/{checks,blog,tickets} chmod 755 uploads/* # Миграции базы данных npx prisma migrate deploy npx prisma generate # Сборка и запуск npm run build pm2 start ecosystem.config.js pm2 save pm2 startup ``` 3. **Сборка Frontend** ```bash cd ../frontend npm install npm run build ``` 4. **Конфигурация Nginx** ```nginx server { listen 80; server_name ospab.host; # 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_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # WebSocket location /ws { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # Статические загрузки location /uploads { alias /var/www/ospab.host/ospabhost/backend/uploads; expires 30d; add_header Cache-Control "public, immutable"; } client_max_body_size 50M; } ``` 5. **SSL сертификат** ```bash sudo certbot --nginx -d ospab.host -d api.ospab.host ``` ### Обновление развёртывания ```bash cd /var/www/ospab.host/ospabhost # Получить последние изменения git pull # Обновление backend cd backend npm install npx prisma generate npm run build pm2 restart all # Обновление frontend cd ../frontend npm install npm run build # Перезагрузить Nginx sudo systemctl reload nginx ``` --- ## 📁 Структура проекта ``` ospab.host/ ├── ospabhost/ │ ├── backend/ │ │ ├── src/ │ │ │ ├── modules/ │ │ │ │ ├── auth/ # Авторизация (JWT, OAuth, QR) │ │ │ │ ├── storage/ # S3 хранилище (MinIO) │ │ │ │ ├── blog/ # CMS блога │ │ │ │ ├── ticket/ # Тикеты поддержки │ │ │ │ ├── check/ # Проверка чеков │ │ │ │ ├── notification/ # Push и Email │ │ │ │ ├── tariff/ # Тарифные планы │ │ │ │ ├── session/ # Управление сессиями │ │ │ │ └── admin/ # Админ панель │ │ │ ├── middleware/ # Express middleware │ │ │ ├── prisma/ # Prisma клиент │ │ │ ├── routes/ # Определения маршрутов │ │ │ ├── utils/ # Утилиты │ │ │ ├── websocket/ # WebSocket сервер │ │ │ ├── index.ts # Главная точка входа │ │ │ └── server.ts # Express сервер │ │ ├── prisma/ │ │ │ ├── schema.prisma # Схема базы данных │ │ │ ├── migrations/ # Миграции БД │ │ │ └── seed.ts # Начальные данные │ │ ├── uploads/ # Загрузки пользователей │ │ ├── package.json │ │ ├── tsconfig.json │ │ └── ecosystem.config.js # PM2 конфиг │ │ │ └── frontend/ │ ├── src/ │ │ ├── pages/ │ │ │ ├── index.tsx # Главная страница │ │ │ ├── login.tsx # Вход │ │ │ ├── register.tsx # Регистрация │ │ │ ├── pricing.tsx # Тарифные планы │ │ │ ├── blog.tsx # Список статей │ │ │ ├── blogpost.tsx # Статья блога │ │ │ └── dashboard/ │ │ │ ├── mainpage.tsx # Главная дашборда │ │ │ ├── summary.tsx # Обзор │ │ │ ├── storage.tsx # Бакеты хранилища │ │ │ ├── storage-bucket.tsx # Управление бакетом │ │ │ ├── tickets/ # Система тикетов │ │ │ ├── billing.tsx # Баланс │ │ │ ├── settings.tsx # Настройки │ │ │ ├── notifications.tsx # Уведомления │ │ │ ├── admin.tsx # Админ панель │ │ │ ├── blogadmin.tsx # Админ блога │ │ │ └── blogeditor.tsx # Редактор статей │ │ ├── components/ │ │ │ ├── header.tsx # Шапка сайта │ │ │ ├── footer.tsx # Футер сайта │ │ │ └── PrivateRoute.tsx # Защищённые маршруты │ │ ├── context/ │ │ │ ├── authcontext.tsx # Состояние авторизации │ │ │ └── ThemeContext.tsx # Состояние темы │ │ ├── services/ │ │ │ └── apiClient.ts # Axios клиент │ │ ├── i18n/ # Локализация │ │ ├── App.tsx │ │ └── main.tsx │ ├── public/ │ │ ├── service-worker.js # Push-уведомления │ │ └── robots.txt │ ├── package.json │ ├── vite.config.ts │ └── tailwind.config.js │ ├── README.md # Английская версия └── README_ru.md # Этот файл (Русский) ``` --- ## 📚 API документация ### Публичные эндпоинты #### Авторизация ```http POST /api/auth/register POST /api/auth/login GET /api/auth/google GET /api/auth/github GET /api/auth/yandex ``` #### QR-авторизация ```http POST /api/qr-auth/generate # Генерация QR-кода GET /api/qr-auth/status/:code # Проверка статуса (polling) POST /api/qr-auth/confirm # Подтверждение входа (мобильный) ``` #### Блог ```http GET /api/blog/posts # Список статей GET /api/blog/posts/:url # Получить статью по URL POST /api/blog/posts/:id/comments # Добавить комментарий ``` #### Тарифные планы ```http GET /api/storage/plans # Список тарифных планов ``` ### Защищённые эндпоинты Все запросы требуют: `Authorization: Bearer ` #### S3 Хранилище ```http 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/upload # Загрузить файл POST /api/storage/buckets/:id/upload-from-uri # Загрузить по URL POST /api/storage/buckets/:id/upload-directory # Загрузить папку DELETE /api/storage/buckets/:id/objects # Удалить объекты POST /api/storage/buckets/:id/presign # Создать presigned URL POST /api/storage/buckets/:id/console-credentials # Получить доступ к консоли ``` #### Тикеты Поддержки ```http GET /api/tickets # Список тикетов пользователя POST /api/tickets # Создать тикет GET /api/tickets/:id # Детали тикета POST /api/tickets/:id/messages # Отправить сообщение PATCH /api/tickets/:id/status # Обновить статус (операторы) POST /api/tickets/:id/assign # Назначить оператора PATCH /api/tickets/:id/close # Закрыть тикет ``` #### Управление сессиями ```http GET /api/sessions # Список активных сессий GET /api/sessions/history # История входов DELETE /api/sessions/:id # Завершить сессию DELETE /api/sessions/others/all # Завершить все другие сессии ``` #### Админ эндпоинты ```http 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 # Обновить тарифный план POST /api/admin/test/push-notification # Тест push POST /api/admin/test/email-notification # Тест email ``` --- ## 🐛 Решение проблем ### Проблемы Backend **Prisma Client не имеет моделей** ```bash cd backend npx prisma generate npm run build pm2 restart all ``` **OAuth возвращает 404** - Проверьте `.env` на наличие `GOOGLE_CLIENT_ID`, `GITHUB_CLIENT_ID`, `YANDEX_CLIENT_ID` - Убедитесь, что `oauthRoutes` импортирован в `index.ts` - Перезапустите сервер **Push-уведомления не работают** - Проверьте VAPID ключи в `.env` - Убедитесь, что `service-worker.js` зарегистрирован - Используйте HTTPS в production ### Проблемы Frontend **Сессия не сохраняется** - Убедитесь, что `login()` в `authcontext.tsx` использует async/await - Проверьте, что JWT токен сохраняется в localStorage - Проверьте, что `bootstrapSession()` вызывается после логина **Тёмная тема не применяется** - Убедитесь, что `ThemeProvider` оборачивает `App` - Проверьте, что в `tailwind.config.js` указан `darkMode: 'class'` - Убедитесь, что компоненты используют классы `dark:` **Загрузка файлов не работает** - Проверьте права директорий: `chmod 755 uploads/*` - Убедитесь, что Nginx раздаёт `/uploads` - Проверьте Nginx `client_max_body_size 50M;` ### Проблемы S3 хранилища **Не удаётся создать бакет** - Проверьте подключение к MinIO - Убедитесь, что MinIO credentials корректны в `.env` - Проверьте, что у пользователя достаточно средств **Учётные данные консоли не работают** - Учётные данные действительны 7 дней - Сгенерируйте новые учётные данные из дашборда - Убедитесь, что MinIO endpoint доступен --- ## 🤝 Участие в разработке Мы приветствуем вклад! Пожалуйста, следуйте этим шагам: 1. Форкните репозиторий 2. Создайте feature ветку: `git checkout -b feature/AmazingFeature` 3. Закоммитьте изменения: `git commit -m 'feat: add amazing feature'` 4. Запушьте в ветку: `git push origin feature/AmazingFeature` 5. Откройте Pull Request ### Соглашение о коммитах Мы используем [Conventional Commits](https://www.conventionalcommits.org/ru/): ```bash feat(storage): добавить поддержку загрузки папок fix(ticket): авто-снятие при закрытии docs: обновить API документацию refactor(auth): улучшить обработку ошибок ``` ### Рабочий процесс разработки ```bash # Разработка Backend cd backend npm run dev # Разработка Frontend cd frontend npm run dev # Миграции базы данных npx prisma migrate dev --name migration_name npx prisma generate # Сборка для production npm run build ``` --- ## 📄 Лицензия MIT License --- ## 📞 Контакты - **Сайт:** [ospab.host](https://ospab.host) - **Email:** support@ospab.host - **Telegram:** [@ospab](https://t.me/ospab) - **Gitea:** http://localhost:4000/ospab/ospab.host - **GitHub:** https://github.com/ospab/ospabhost8.1 --- ## 🙏 Благодарности - [MinIO](https://min.io/) - S3-совместимое объектное хранилище - [Prisma](https://www.prisma.io/) - ORM нового поколения - [React](https://react.dev/) - UI библиотека - [Tailwind CSS](https://tailwindcss.com/) - CSS фреймворк - [Quill](https://quilljs.com/) - Rich text редактор - [Passport.js](https://www.passportjs.org/) - Middleware авторизации --- **Версия:** 8.1 **Обновлено:** 5 января 2026 **Git:** ospab