update README.md
This commit is contained in:
627
README_ru.md
Normal file
627
README_ru.md
Normal file
@@ -0,0 +1,627 @@
|
||||
# 🚀 Ospabhost 8.1 - Платформа S3 Объектного Хранилища
|
||||
|
||||
Современная платформа управления S3-совместимым объектным хранилищем с системой биллинга, блогом и тикетами поддержки.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
[🇬🇧 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 <JWT_TOKEN>`
|
||||
|
||||
#### 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 <ospab@ospab.host>
|
||||
Reference in New Issue
Block a user