From 501e858c06dbc487e292674be948cbe19a2edb22 Mon Sep 17 00:00:00 2001 From: ospab Date: Mon, 5 Jan 2026 20:30:26 +0300 Subject: [PATCH] update README.md --- .github/copilot-instructions.md | 38 - BLOG_DEPLOYMENT.md | 460 -- BLOG_QUICKSTART.md | 76 - BLOG_SUMMARY.md | 236 - CONTRIBUTING.md | 1023 ----- DEPLOY_INSTRUCTIONS.md | 128 - DESIGN-SYSTEM.md | 436 -- NEW_FEATURES.md | 244 -- OAUTH_DEPLOY.md | 96 - QR-AUTH-SECURITY.md | 236 - README.md | 1154 ++--- README_ru.md | 627 +++ TARIFF_CATEGORIES_SETUP.md | 162 - node_modules/@pkgjs/parseargs/CHANGELOG.md | 147 - node_modules/accepts/HISTORY.md | 250 -- node_modules/arg/LICENSE.md | 21 - .../available-typed-arrays/CHANGELOG.md | 100 - node_modules/balanced-match/LICENSE.md | 21 - node_modules/body-parser/HISTORY.md | 731 ---- node_modules/buffer/AUTHORS.md | 73 - node_modules/bytes/History.md | 97 - .../c12/node_modules/dotenv/CHANGELOG.md | 520 --- .../c12/node_modules/dotenv/README-es.md | 411 -- .../c12/node_modules/dotenv/SECURITY.md | 1 - .../call-bind-apply-helpers/CHANGELOG.md | 30 - node_modules/call-bind/CHANGELOG.md | 106 - node_modules/call-bound/CHANGELOG.md | 42 - node_modules/color-convert/CHANGELOG.md | 54 - node_modules/commander/CHANGELOG.md | 436 -- node_modules/content-disposition/HISTORY.md | 66 - node_modules/content-type/HISTORY.md | 29 - node_modules/cookie-signature/History.md | 70 - node_modules/cookie/SECURITY.md | 25 - node_modules/cors/CONTRIBUTING.md | 33 - node_modules/cors/HISTORY.md | 58 - node_modules/deepmerge-ts/CHANGELOG.md | 390 -- .../define-data-property/CHANGELOG.md | 70 - node_modules/define-properties/CHANGELOG.md | 91 - node_modules/depd/History.md | 103 - node_modules/dotenv/CHANGELOG.md | 592 --- node_modules/dotenv/README-es.md | 405 -- node_modules/dotenv/SECURITY.md | 1 - node_modules/dunder-proto/CHANGELOG.md | 24 - node_modules/es-define-property/CHANGELOG.md | 29 - node_modules/es-errors/CHANGELOG.md | 40 - node_modules/es-object-atoms/CHANGELOG.md | 37 - node_modules/etag/HISTORY.md | 83 - node_modules/express/History.md | 3858 ----------------- node_modules/fast-check/CHANGELOG.md | 1039 ----- .../node_modules/glob-parent/CHANGELOG.md | 110 - node_modules/fastq/SECURITY.md | 15 - node_modules/finalhandler/HISTORY.md | 233 - node_modules/for-each/.github/SECURITY.md | 3 - node_modules/for-each/CHANGELOG.md | 107 - node_modules/forwarded/HISTORY.md | 21 - node_modules/fresh/HISTORY.md | 80 - .../function-bind/.github/SECURITY.md | 3 - node_modules/function-bind/CHANGELOG.md | 136 - node_modules/get-intrinsic/CHANGELOG.md | 186 - node_modules/get-proto/CHANGELOG.md | 21 - node_modules/gopd/CHANGELOG.md | 45 - .../has-property-descriptors/CHANGELOG.md | 35 - node_modules/has-symbols/CHANGELOG.md | 91 - node_modules/has-tostringtag/CHANGELOG.md | 42 - node_modules/hasown/CHANGELOG.md | 40 - node_modules/http-errors/HISTORY.md | 180 - .../node_modules/statuses/HISTORY.md | 82 - node_modules/iconv-lite/Changelog.md | 212 - node_modules/is-arguments/CHANGELOG.md | 201 - node_modules/is-callable/CHANGELOG.md | 158 - node_modules/is-core-module/CHANGELOG.md | 218 - .../is-generator-function/CHANGELOG.md | 237 - node_modules/is-nan/CHANGELOG.md | 56 - node_modules/is-regex/CHANGELOG.md | 233 - node_modules/is-typed-array/CHANGELOG.md | 166 - node_modules/jackspeak/LICENSE.md | 55 - node_modules/jws/CHANGELOG.md | 34 - node_modules/math-intrinsics/CHANGELOG.md | 24 - node_modules/media-typer/HISTORY.md | 50 - node_modules/mime-db/HISTORY.md | 541 --- node_modules/mime-types/HISTORY.md | 421 -- node_modules/ms/license.md | 21 - node_modules/mz/HISTORY.md | 66 - node_modules/negotiator/HISTORY.md | 114 - node_modules/object-inspect/CHANGELOG.md | 424 -- node_modules/object-is/CHANGELOG.md | 175 - node_modules/object-keys/CHANGELOG.md | 232 - node_modules/object.assign/CHANGELOG.md | 246 -- node_modules/on-finished/HISTORY.md | 98 - .../package-json-from-dist/LICENSE.md | 63 - node_modules/pako/CHANGELOG.md | 164 - node_modules/parseurl/HISTORY.md | 58 - node_modules/path-browserify/CHANGELOG.md | 20 - node_modules/path-browserify/security.md | 10 - node_modules/path-scurry/LICENSE.md | 55 - node_modules/picomatch/CHANGELOG.md | 136 - .../possible-typed-array-names/CHANGELOG.md | 29 - node_modules/postcss-selector-parser/API.md | 872 ---- .../postcss-selector-parser/CHANGELOG.md | 549 --- node_modules/proxy-addr/HISTORY.md | 161 - node_modules/pure-rand/CHANGELOG.md | 94 - node_modules/qs/CHANGELOG.md | 622 --- node_modules/qs/LICENSE.md | 29 - node_modules/range-parser/HISTORY.md | 56 - node_modules/raw-body/HISTORY.md | 333 -- node_modules/raw-body/SECURITY.md | 24 - .../node_modules/iconv-lite/Changelog.md | 236 - node_modules/readable-stream/CONTRIBUTING.md | 38 - node_modules/readable-stream/GOVERNANCE.md | 136 - node_modules/resolve/SECURITY.md | 3 - node_modules/reusify/SECURITY.md | 15 - node_modules/router/HISTORY.md | 228 - node_modules/safe-regex-test/CHANGELOG.md | 55 - node_modules/safer-buffer/Porting-Buffer.md | 268 -- node_modules/send/HISTORY.md | 580 --- node_modules/serve-static/HISTORY.md | 516 --- node_modules/set-function-length/CHANGELOG.md | 70 - node_modules/side-channel-list/CHANGELOG.md | 15 - node_modules/side-channel-map/CHANGELOG.md | 22 - .../side-channel-weakmap/CHANGELOG.md | 28 - node_modules/side-channel/CHANGELOG.md | 110 - node_modules/statuses/HISTORY.md | 87 - node_modules/stream-browserify/CHANGELOG.md | 8 - node_modules/stream-browserify/security.md | 10 - .../CHANGELOG.md | 22 - node_modules/tailwindcss/CHANGELOG.md | 2474 ----------- .../node_modules/glob-parent/CHANGELOG.md | 110 - node_modules/thenify-all/History.md | 11 - node_modules/thenify/History.md | 11 - node_modules/toidentifier/HISTORY.md | 9 - node_modules/type-is/HISTORY.md | 292 -- node_modules/typescript/SECURITY.md | 41 - node_modules/unpipe/HISTORY.md | 4 - node_modules/util-deprecate/History.md | 16 - node_modules/vary/HISTORY.md | 39 - node_modules/which-typed-array/CHANGELOG.md | 261 -- node_modules/which/CHANGELOG.md | 166 - ospabhost/CONTRIBUTIONS.md | 443 -- ospabhost/METRICS_GUIDE.md | 308 -- ospabhost/NGINX_DEPLOY.md | 154 - ospabhost/PUSH_NOTIFICATIONS_FIX.md | 259 -- ospabhost/TEST_PUSH_NOTIFICATION.md | 264 -- ospabhost/TROUBLESHOOTING_PUSH.md | 374 -- ospabhost/backend/NETWORK_STORAGE_CONFIG.md | 139 - ospabhost/backend/PM2_CHEATSHEET.md | 132 - ospabhost/backend/PM2_QUICKSTART.md | 186 - ospabhost/backend/PM2_SETUP.md | 257 -- ospabhost/backend/prisma/FOREIGN_KEY_FIX.md | 65 - .../backend/test-scripts/FIX_501_ERROR.md | 149 - .../test-scripts/LOAD_TEST_COMMANDS.md | 144 - .../test-scripts/PASSWORD_CHANGE_TESTING.md | 168 - 151 files changed, 1084 insertions(+), 31525 deletions(-) delete mode 100644 .github/copilot-instructions.md delete mode 100644 BLOG_DEPLOYMENT.md delete mode 100644 BLOG_QUICKSTART.md delete mode 100644 BLOG_SUMMARY.md delete mode 100644 CONTRIBUTING.md delete mode 100644 DEPLOY_INSTRUCTIONS.md delete mode 100644 DESIGN-SYSTEM.md delete mode 100644 NEW_FEATURES.md delete mode 100644 OAUTH_DEPLOY.md delete mode 100644 QR-AUTH-SECURITY.md create mode 100644 README_ru.md delete mode 100644 TARIFF_CATEGORIES_SETUP.md delete mode 100644 node_modules/@pkgjs/parseargs/CHANGELOG.md delete mode 100644 node_modules/accepts/HISTORY.md delete mode 100644 node_modules/arg/LICENSE.md delete mode 100644 node_modules/available-typed-arrays/CHANGELOG.md delete mode 100644 node_modules/balanced-match/LICENSE.md delete mode 100644 node_modules/body-parser/HISTORY.md delete mode 100644 node_modules/buffer/AUTHORS.md delete mode 100644 node_modules/bytes/History.md delete mode 100644 node_modules/c12/node_modules/dotenv/CHANGELOG.md delete mode 100644 node_modules/c12/node_modules/dotenv/README-es.md delete mode 100644 node_modules/c12/node_modules/dotenv/SECURITY.md delete mode 100644 node_modules/call-bind-apply-helpers/CHANGELOG.md delete mode 100644 node_modules/call-bind/CHANGELOG.md delete mode 100644 node_modules/call-bound/CHANGELOG.md delete mode 100644 node_modules/color-convert/CHANGELOG.md delete mode 100644 node_modules/commander/CHANGELOG.md delete mode 100644 node_modules/content-disposition/HISTORY.md delete mode 100644 node_modules/content-type/HISTORY.md delete mode 100644 node_modules/cookie-signature/History.md delete mode 100644 node_modules/cookie/SECURITY.md delete mode 100644 node_modules/cors/CONTRIBUTING.md delete mode 100644 node_modules/cors/HISTORY.md delete mode 100644 node_modules/deepmerge-ts/CHANGELOG.md delete mode 100644 node_modules/define-data-property/CHANGELOG.md delete mode 100644 node_modules/define-properties/CHANGELOG.md delete mode 100644 node_modules/depd/History.md delete mode 100644 node_modules/dotenv/CHANGELOG.md delete mode 100644 node_modules/dotenv/README-es.md delete mode 100644 node_modules/dotenv/SECURITY.md delete mode 100644 node_modules/dunder-proto/CHANGELOG.md delete mode 100644 node_modules/es-define-property/CHANGELOG.md delete mode 100644 node_modules/es-errors/CHANGELOG.md delete mode 100644 node_modules/es-object-atoms/CHANGELOG.md delete mode 100644 node_modules/etag/HISTORY.md delete mode 100644 node_modules/express/History.md delete mode 100644 node_modules/fast-check/CHANGELOG.md delete mode 100644 node_modules/fast-glob/node_modules/glob-parent/CHANGELOG.md delete mode 100644 node_modules/fastq/SECURITY.md delete mode 100644 node_modules/finalhandler/HISTORY.md delete mode 100644 node_modules/for-each/.github/SECURITY.md delete mode 100644 node_modules/for-each/CHANGELOG.md delete mode 100644 node_modules/forwarded/HISTORY.md delete mode 100644 node_modules/fresh/HISTORY.md delete mode 100644 node_modules/function-bind/.github/SECURITY.md delete mode 100644 node_modules/function-bind/CHANGELOG.md delete mode 100644 node_modules/get-intrinsic/CHANGELOG.md delete mode 100644 node_modules/get-proto/CHANGELOG.md delete mode 100644 node_modules/gopd/CHANGELOG.md delete mode 100644 node_modules/has-property-descriptors/CHANGELOG.md delete mode 100644 node_modules/has-symbols/CHANGELOG.md delete mode 100644 node_modules/has-tostringtag/CHANGELOG.md delete mode 100644 node_modules/hasown/CHANGELOG.md delete mode 100644 node_modules/http-errors/HISTORY.md delete mode 100644 node_modules/http-errors/node_modules/statuses/HISTORY.md delete mode 100644 node_modules/iconv-lite/Changelog.md delete mode 100644 node_modules/is-arguments/CHANGELOG.md delete mode 100644 node_modules/is-callable/CHANGELOG.md delete mode 100644 node_modules/is-core-module/CHANGELOG.md delete mode 100644 node_modules/is-generator-function/CHANGELOG.md delete mode 100644 node_modules/is-nan/CHANGELOG.md delete mode 100644 node_modules/is-regex/CHANGELOG.md delete mode 100644 node_modules/is-typed-array/CHANGELOG.md delete mode 100644 node_modules/jackspeak/LICENSE.md delete mode 100644 node_modules/jws/CHANGELOG.md delete mode 100644 node_modules/math-intrinsics/CHANGELOG.md delete mode 100644 node_modules/media-typer/HISTORY.md delete mode 100644 node_modules/mime-db/HISTORY.md delete mode 100644 node_modules/mime-types/HISTORY.md delete mode 100644 node_modules/ms/license.md delete mode 100644 node_modules/mz/HISTORY.md delete mode 100644 node_modules/negotiator/HISTORY.md delete mode 100644 node_modules/object-inspect/CHANGELOG.md delete mode 100644 node_modules/object-is/CHANGELOG.md delete mode 100644 node_modules/object-keys/CHANGELOG.md delete mode 100644 node_modules/object.assign/CHANGELOG.md delete mode 100644 node_modules/on-finished/HISTORY.md delete mode 100644 node_modules/package-json-from-dist/LICENSE.md delete mode 100644 node_modules/pako/CHANGELOG.md delete mode 100644 node_modules/parseurl/HISTORY.md delete mode 100644 node_modules/path-browserify/CHANGELOG.md delete mode 100644 node_modules/path-browserify/security.md delete mode 100644 node_modules/path-scurry/LICENSE.md delete mode 100644 node_modules/picomatch/CHANGELOG.md delete mode 100644 node_modules/possible-typed-array-names/CHANGELOG.md delete mode 100644 node_modules/postcss-selector-parser/API.md delete mode 100644 node_modules/postcss-selector-parser/CHANGELOG.md delete mode 100644 node_modules/proxy-addr/HISTORY.md delete mode 100644 node_modules/pure-rand/CHANGELOG.md delete mode 100644 node_modules/qs/CHANGELOG.md delete mode 100644 node_modules/qs/LICENSE.md delete mode 100644 node_modules/range-parser/HISTORY.md delete mode 100644 node_modules/raw-body/HISTORY.md delete mode 100644 node_modules/raw-body/SECURITY.md delete mode 100644 node_modules/raw-body/node_modules/iconv-lite/Changelog.md delete mode 100644 node_modules/readable-stream/CONTRIBUTING.md delete mode 100644 node_modules/readable-stream/GOVERNANCE.md delete mode 100644 node_modules/resolve/SECURITY.md delete mode 100644 node_modules/reusify/SECURITY.md delete mode 100644 node_modules/router/HISTORY.md delete mode 100644 node_modules/safe-regex-test/CHANGELOG.md delete mode 100644 node_modules/safer-buffer/Porting-Buffer.md delete mode 100644 node_modules/send/HISTORY.md delete mode 100644 node_modules/serve-static/HISTORY.md delete mode 100644 node_modules/set-function-length/CHANGELOG.md delete mode 100644 node_modules/side-channel-list/CHANGELOG.md delete mode 100644 node_modules/side-channel-map/CHANGELOG.md delete mode 100644 node_modules/side-channel-weakmap/CHANGELOG.md delete mode 100644 node_modules/side-channel/CHANGELOG.md delete mode 100644 node_modules/statuses/HISTORY.md delete mode 100644 node_modules/stream-browserify/CHANGELOG.md delete mode 100644 node_modules/stream-browserify/security.md delete mode 100644 node_modules/supports-preserve-symlinks-flag/CHANGELOG.md delete mode 100644 node_modules/tailwindcss/CHANGELOG.md delete mode 100644 node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent/CHANGELOG.md delete mode 100644 node_modules/thenify-all/History.md delete mode 100644 node_modules/thenify/History.md delete mode 100644 node_modules/toidentifier/HISTORY.md delete mode 100644 node_modules/type-is/HISTORY.md delete mode 100644 node_modules/typescript/SECURITY.md delete mode 100644 node_modules/unpipe/HISTORY.md delete mode 100644 node_modules/util-deprecate/History.md delete mode 100644 node_modules/vary/HISTORY.md delete mode 100644 node_modules/which-typed-array/CHANGELOG.md delete mode 100644 node_modules/which/CHANGELOG.md delete mode 100644 ospabhost/CONTRIBUTIONS.md delete mode 100644 ospabhost/METRICS_GUIDE.md delete mode 100644 ospabhost/NGINX_DEPLOY.md delete mode 100644 ospabhost/PUSH_NOTIFICATIONS_FIX.md delete mode 100644 ospabhost/TEST_PUSH_NOTIFICATION.md delete mode 100644 ospabhost/TROUBLESHOOTING_PUSH.md delete mode 100644 ospabhost/backend/NETWORK_STORAGE_CONFIG.md delete mode 100644 ospabhost/backend/PM2_CHEATSHEET.md delete mode 100644 ospabhost/backend/PM2_QUICKSTART.md delete mode 100644 ospabhost/backend/PM2_SETUP.md delete mode 100644 ospabhost/backend/prisma/FOREIGN_KEY_FIX.md delete mode 100644 ospabhost/backend/test-scripts/FIX_501_ERROR.md delete mode 100644 ospabhost/backend/test-scripts/LOAD_TEST_COMMANDS.md delete mode 100644 ospabhost/backend/test-scripts/PASSWORD_CHANGE_TESTING.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index 2d6d49b..0000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,38 +0,0 @@ -# Copilot Instructions for Ospabhost - -## Architecture Overview -- **Monorepo**: Backend (Express + TypeScript + Prisma) and Frontend (React + Vite + TypeScript). -- **Backend Entry**: `ospabhost/backend/src/index.ts` - Express server with CORS, rate limiting, WebSocket, and module routes (`/api/*`). -- **Modules**: Organized in `ospabhost/backend/src/modules/*` (auth, storage, ticket, blog, etc.), each exporting routes and services. -- **Database**: MySQL via Prisma (`ospabhost/backend/prisma/schema.prisma`), models like User, StorageBucket, Ticket with string statuses (`pending`, `approved`, `active`). -- **Frontend Dashboard**: `ospabhost/frontend/src/pages/dashboard/mainpage.tsx` - dynamic sidebar tabs based on user roles (`operator`, `isAdmin`). - -## Key Patterns & Conventions -- **API Routes**: All backend routes prefixed with `/api/`, authenticated via JWT in localStorage. -- **Status Fields**: Use string enums (e.g., Check: `pending`/`approved`/`rejected`; Ticket: `open`/`in_progress`/`resolved`). -- **MinIO Integration**: S3-compatible storage via MinIO SDK, configs from `.env`, buckets per user with quotas. -- **Localization**: ru/en support via `useTranslation` hook, URLs like `/en/dashboard`. -- **WebSocket**: Real-time updates via `/ws`, initialized in `ospabhost/backend/src/websocket/server.ts`. -- **Security**: Rate limiting (1000 req/15min global, 10 req/15min auth), CORS from `PUBLIC_APP_ORIGIN`, helmet middleware. -- **Static Files**: Check uploads in `ospabhost/backend/uploads/checks`, served at `/uploads/checks`. -- **Notifications**: Email/push via `web-push`, templates in `ospabhost/backend/src/modules/notification/email.service.ts`. - -## Development Workflows -- **Backend**: `npm run dev` (ts-node-dev hot-reload), `npm run build` (TypeScript), PM2 for production (`npm run pm2:start`). -- **Frontend**: `npm run dev` (Vite), `npm run build`, `npm run preview`. -- **Database**: Prisma migrations in `ospabhost/backend/prisma/migrations/`, seed scripts for plans/promocodes. -- **OAuth**: Google/GitHub/VK/Yandex via Passport.js, configs in `ospabhost/backend/src/modules/auth/passport.config.ts`. -- **Blog**: Rich text via Quill, statuses `draft`/`published`/`archived`. - -## Integration Points -- **Frontend ↔ Backend**: Axios API client, JWT auth, WebSocket for real-time. -- **MinIO**: All S3 ops through `storage.service.ts`, console credentials generated weekly. -- **Push Notifications**: Web Push API, subscriptions in PushSubscription model. -- **QR Auth**: Temporary codes (60s TTL), statuses `pending`/`confirmed`/`expired`. - -## Examples -- Add new module: Create `ospabhost/backend/src/modules/newmodule/` with `routes.ts` and `service.ts`, import in `index.ts`. -- Update user data: Dispatch `userDataUpdate` event to refresh dashboard. -- Storage bucket: Create via `StorageBucket` model, link to `StoragePlan` for pricing. - -Reference: `ospabhost/backend/src/index.ts`, `ospabhost/backend/prisma/schema.prisma`, `ospabhost/frontend/src/pages/dashboard/mainpage.tsx`. \ No newline at end of file diff --git a/BLOG_DEPLOYMENT.md b/BLOG_DEPLOYMENT.md deleted file mode 100644 index 96301fb..0000000 --- a/BLOG_DEPLOYMENT.md +++ /dev/null @@ -1,460 +0,0 @@ -# 📝 Развёртывание системы блогов - Ospabhost 8.1 - -## Обзор изменений - -Добавлена полная система блогов с: -- Публичными страницами (`/blog`, `/blog/:url`) -- Админской панелью управления (`/dashboard/blog`) -- Rich Text редактором (Quill.js) -- Системой комментариев с модерацией -- Загрузкой изображений - ---- - -## 🗂 Структура новых файлов - -### Backend - -``` -backend/ -├── src/ -│ └── modules/ -│ └── blog/ -│ ├── blog.controller.ts # API эндпоинты (посты, комментарии) -│ ├── blog.routes.ts # Маршруты + multer для загрузки -│ └── upload.controller.ts # Загрузка/удаление изображений -├── uploads/ -│ └── blog/ # Директория для изображений блога -└── prisma/ - └── schema.prisma # Обновлено: модели Post, Comment -``` - -### Frontend - -``` -frontend/ -├── src/ -│ └── pages/ -│ ├── blog.tsx # Публичная страница списка статей -│ ├── blogpost.tsx # Публичная страница статьи -│ └── dashboard/ -│ ├── blogadmin.tsx # Админ-панель блога -│ └── mainpage.tsx # Обновлено: добавлена вкладка "📝 Блог" -└── package.json # Обновлено: react-quill, quill -``` - ---- - -## 🚀 Шаги развёртывания на сервере - -### 1. Подготовка локального окружения - -```bash -# В корне проекта -cd ospabhost/frontend -npm install # Установка react-quill и зависимостей -npm run build - -cd ../backend -npm install -``` - -### 2. Создание директории для изображений - -На сервере создайте директорию: - -```bash -mkdir -p /var/www/ospab-host/ospabhost/backend/uploads/blog -chmod 755 /var/www/ospab-host/ospabhost/backend/uploads/blog -``` - -### 3. Применение миграции базы данных - -**На сервере** выполните: - -```bash -cd /var/www/ospab-host/ospabhost/backend - -# Применить миграции -npx prisma migrate deploy - -# Регенерировать Prisma Client -npx prisma generate -``` - -### 4. Обновление кода на сервере - -Загрузите обновленные файлы через Git или SFTP: - -**Новые файлы:** -- `backend/src/modules/blog/blog.controller.ts` -- `backend/src/modules/blog/blog.routes.ts` -- `backend/src/modules/blog/upload.controller.ts` -- `frontend/src/pages/blog.tsx` -- `frontend/src/pages/blogpost.tsx` -- `frontend/src/pages/dashboard/blogadmin.tsx` - -**Изменённые файлы:** -- `backend/src/index.ts` (добавлены маршруты `/api/blog`, раздача `/uploads/blog`) -- `backend/prisma/schema.prisma` (модели Post, Comment) -- `frontend/src/App.tsx` (маршруты `/blog`, `/blog/:url`) -- `frontend/src/pages/dashboard/mainpage.tsx` (вкладка "📝 Блог") - -### 5. Сборка backend - -```bash -cd /var/www/ospab-host/ospabhost/backend -npm run build -``` - -### 6. Перезапуск backend - -```bash -pm2 restart ospab-backend -pm2 logs ospab-backend # Проверка логов -``` - -### 7. Сборка и деплой frontend - -```bash -cd /var/www/ospab-host/ospabhost/frontend -npm run build - -# Копирование в директорию Nginx -cp -r dist/* /var/www/ospab-host/frontend/ -``` - -### 8. Проверка прав доступа - -```bash -# Права на директорию uploads -chown -R www-data:www-data /var/www/ospab-host/ospabhost/backend/uploads/blog -chmod -R 755 /var/www/ospab-host/ospabhost/backend/uploads/blog - -# Права на frontend -chown -R www-data:www-data /var/www/ospab-host/frontend/ -``` - ---- - -## ✅ Проверка работоспособности - -### 1. Проверка API эндпоинтов - -```bash -# Проверка публичного списка постов (должно вернуть пустой массив) -curl https://ospab.host:5000/api/blog/posts - -# Проверка админского доступа (требуется токен) -curl -H "Authorization: Bearer YOUR_TOKEN" \ - https://ospab.host:5000/api/blog/admin/posts -``` - -### 2. Проверка frontend - -Откройте в браузере: -- `https://ospab.host/blog` - список статей -- `https://ospab.host/dashboard/blog` - админ-панель (требуется вход как админ) - -### 3. Проверка загрузки изображений - -1. Войдите как супер-админ -2. Откройте `/dashboard/blog` -3. Нажмите "➕ Создать статью" -4. В редакторе нажмите кнопку изображения -5. Загрузите изображение -6. Проверьте, что изображение вставилось в редактор - ---- - -## 🔧 Настройка Nginx (если требуется) - -Если раздача изображений не работает, добавьте в конфиг Nginx: - -```nginx -location /uploads/blog { - alias /var/www/ospab-host/ospabhost/backend/uploads/blog; - access_log off; - expires 30d; - add_header Cache-Control "public, immutable"; -} -``` - -После изменений: - -```bash -nginx -t -systemctl reload nginx -``` - ---- - -## 📊 Структура базы данных - -### Модель Post - -```prisma -model Post { - id Int @id @default(autoincrement()) - title String - content String @db.Text - excerpt String? @db.Text - coverImage String? - url String @unique - status String @default("draft") - views Int @default(0) - authorId Int - author User @relation(fields: [authorId], references: [id]) - comments Comment[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - publishedAt DateTime? -} -``` - -### Модель Comment - -```prisma -model Comment { - id Int @id @default(autoincrement()) - postId Int - post Post @relation(fields: [postId], references: [id], onDelete: Cascade) - userId Int? - user User? @relation(fields: [userId], references: [id]) - authorName String? - content String @db.Text - status String @default("pending") - createdAt DateTime @default(now()) -} -``` - ---- - -## 🎯 Функциональность - -### Публичная часть - -- **`/blog`** - Список опубликованных статей с превью -- **`/blog/:url`** - Полная статья с комментариями -- Отправка комментариев (авторизованные и гости) -- Счётчик просмотров - -### Админ-панель (`/dashboard/blog`) - -#### Вкладка "Статьи" -- Список всех статей (черновики, опубликованные, архив) -- Создание новой статьи -- Редактирование существующих -- Удаление с подтверждением -- Rich Text редактор с: - - Форматирование текста (жирный, курсив, подчёркнутый, зачёркнутый) - - Заголовки (H1-H6) - - Выбор шрифта и размера - - Цвет текста и фона - - Списки (маркированные, нумерованные) - - Выравнивание - - Ссылки, изображения, видео -- Загрузка обложки (URL) -- Загрузка изображений в контент (через кнопку в редакторе) -- Выбор кастомного URL (не автоматический slug) -- Управление статусом (черновик/опубликовано/архив) - -#### Вкладка "Комментарии" -- Список всех комментариев -- Модерация (одобрение/отклонение) -- Удаление спама -- Показ связанной статьи -- Отображение автора (зарегистрированный или гость) - ---- - -## 🔒 Права доступа - -- **Публичные страницы** - доступны всем -- **Отправка комментариев** - доступна всем (гости вводят имя) -- **Админ-панель блога** - только для `user.isAdmin === true` -- **Модерация комментариев** - только для админов -- **Создание/редактирование постов** - только для админов - ---- - -## 📝 Использование - -### Создание первой статьи - -1. Войдите как супер-админ -2. Откройте `/dashboard/blog` -3. Нажмите "➕ Создать статью" -4. Заполните: - - **Заголовок**: "Добро пожаловать в наш блог!" - - **URL**: `welcome` (статья будет доступна по `/blog/welcome`) - - **Краткое описание**: "Первая статья нашего блога" - - **Обложка**: `https://images.unsplash.com/photo-1499750310107-5fef28a66643` - - **Содержание**: Напишите текст, используя Rich Text редактор - - **Статус**: "Опубликовано" -5. Нажмите "Создать статью" - -### Модерация комментариев - -1. Откройте `/dashboard/blog` -2. Перейдите на вкладку "Комментарии" -3. Комментарии со статусом "На модерации" можно: - - ✅ Одобрить (появятся на сайте) - - ❌ Отклонить (скрыты, но не удалены) - - 🗑️ Удалить (полное удаление) - ---- - -## 🐛 Возможные проблемы - -### Проблема: "post and comment are not properties of PrismaClient" - -**Решение:** -```bash -cd /var/www/ospab-host/ospabhost/backend -npx prisma generate -npm run build -pm2 restart ospab-backend -``` - -### Проблема: Изображения не загружаются - -**Проверьте:** -1. Права на директорию `backend/uploads/blog` (должно быть `755`) -2. Nginx раздаёт `/uploads/blog` (см. конфиг выше) -3. В логах backend нет ошибок multer - -**Проверка:** -```bash -# Проверка прав -ls -la /var/www/ospab-host/ospabhost/backend/uploads/blog - -# Проверка логов -pm2 logs ospab-backend --lines 50 -``` - -### Проблема: Вкладка "📝 Блог" не появляется в админ-панели - -**Причины:** -- Пользователь не является супер-админом (`isAdmin !== true`) -- Frontend не пересобран после изменений - -**Решение:** -```bash -cd /var/www/ospab-host/ospabhost/frontend -npm run build -cp -r dist/* /var/www/ospab-host/frontend/ -``` - -### Проблема: Rich Text редактор не загружается - -**Причина:** `react-quill` не установлен - -**Решение:** -```bash -cd /var/www/ospab-host/ospabhost/frontend -npm install react-quill quill --legacy-peer-deps -npm run build -``` - ---- - -## 📦 Зависимости - -### Backend -- `multer` (уже установлен) -- `express` (уже установлен) -- `prisma` (уже установлен) - -### Frontend -- `react-quill@2.0.0` ✅ УСТАНОВЛЕНО -- `quill` ✅ УСТАНОВЛЕНО - ---- - -## 🎨 Кастомизация - -### Изменение лимита размера изображений - -В `backend/src/modules/blog/blog.routes.ts`: - -```typescript -const upload = multer({ - storage: storage, - limits: { - fileSize: 10 * 1024 * 1024 // Измените на нужное значение (в байтах) - }, - // ... -}); -``` - -### Добавление поддержки других форматов - -В `backend/src/modules/blog/blog.routes.ts`: - -```typescript -fileFilter: function (req, file, cb) { - const allowedTypes = /jpeg|jpg|png|gif|webp|svg/; // Добавьте нужные форматы - // ... -} -``` - -### Настройка панели инструментов Quill - -В `frontend/src/pages/dashboard/blogadmin.tsx` (переменная `quillModules`): - -```typescript -const quillModules = { - toolbar: { - container: [ - // Добавьте/удалите нужные кнопки - [{ 'header': [1, 2, 3, false] }], - ['bold', 'italic', 'underline'], - // ... - ], - // ... - } -}; -``` - ---- - -## 📚 API эндпоинты - -### Публичные - -- `GET /api/blog/posts` - Список опубликованных постов -- `GET /api/blog/posts/:url` - Пост по URL -- `POST /api/blog/posts/:postId/comments` - Добавить комментарий - -### Админские (требуется токен + isAdmin) - -- `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` - Загрузить изображение -- `DELETE /api/blog/admin/images/:filename` - Удалить изображение -- `GET /api/blog/admin/comments` - Все комментарии -- `PATCH /api/blog/admin/comments/:id` - Модерировать комментарий -- `DELETE /api/blog/admin/comments/:id` - Удалить комментарий - ---- - -## ✨ Готово! - -После выполнения всех шагов система блогов будет полностью функциональной. Если возникнут проблемы, проверьте логи: - -```bash -# Логи backend -pm2 logs ospab-backend - -# Логи Nginx -tail -f /var/log/nginx/error.log -``` - ---- - -**Дата создания:** 01.11.2025 -**Версия:** 1.0.0 -**Автор:** GitHub Copilot diff --git a/BLOG_QUICKSTART.md b/BLOG_QUICKSTART.md deleted file mode 100644 index 9c01805..0000000 --- a/BLOG_QUICKSTART.md +++ /dev/null @@ -1,76 +0,0 @@ -# 🚀 Быстрый старт - Развёртывание блога - -## На сервере выполните последовательно: - -```bash -# 1. Создать директорию для изображений -mkdir -p /var/www/ospab-host/ospabhost/backend/uploads/blog -chmod 755 /var/www/ospab-host/ospabhost/backend/uploads/blog - -# 2. Применить миграции базы данных -cd /var/www/ospab-host/ospabhost/backend -npx prisma migrate deploy -npx prisma generate - -# 3. Собрать backend -npm run build - -# 4. Перезапустить backend -pm2 restart ospab-backend - -# 5. Собрать frontend -cd /var/www/ospab-host/ospabhost/frontend -npm run build -cp -r dist/* /var/www/ospab-host/frontend/ - -# 6. Установить права -chown -R www-data:www-data /var/www/ospab-host/ospabhost/backend/uploads/blog -chown -R www-data:www-data /var/www/ospab-host/frontend/ - -# 7. Проверить -pm2 logs ospab-backend -``` - -## Проверка работы - -1. Откройте `https://ospab.host/blog` - должна загрузиться страница блога -2. Войдите как админ и откройте `https://ospab.host/dashboard/blog` -3. Создайте тестовую статью - -## Если что-то не работает - -```bash -# Регенерировать Prisma Client -cd /var/www/ospab-host/ospabhost/backend -npx prisma generate -npm run build -pm2 restart ospab-backend - -# Проверить логи -pm2 logs ospab-backend --lines 100 -tail -f /var/log/nginx/error.log -``` - -## Созданные файлы (для загрузки на сервер) - -**Backend:** -- `backend/src/modules/blog/blog.controller.ts` -- `backend/src/modules/blog/blog.routes.ts` -- `backend/src/modules/blog/upload.controller.ts` -- `backend/src/index.ts` (изменён) -- `backend/prisma/schema.prisma` (изменён) - -**Frontend:** -- `frontend/src/pages/blog.tsx` -- `frontend/src/pages/blogpost.tsx` -- `frontend/src/pages/dashboard/blogadmin.tsx` -- `frontend/src/pages/dashboard/mainpage.tsx` (изменён) -- `frontend/src/App.tsx` (изменён) - -**Документация:** -- `BLOG_DEPLOYMENT.md` (полная инструкция) -- `BLOG_QUICKSTART.md` (эта памятка) - ---- - -📖 **Полная инструкция:** `BLOG_DEPLOYMENT.md` diff --git a/BLOG_SUMMARY.md b/BLOG_SUMMARY.md deleted file mode 100644 index 183765b..0000000 --- a/BLOG_SUMMARY.md +++ /dev/null @@ -1,236 +0,0 @@ -# ✅ Реализация блога - Итоговая сводка - -## Статус: ГОТОВО ✅ - -Система блогов для Ospabhost 8.1 полностью реализована и готова к развёртыванию. - ---- - -## 📋 Что реализовано - -### Backend API (100% ✅) - -**Файлы:** -- ✅ `backend/src/modules/blog/blog.controller.ts` (286 строк) - - 11 эндпоинтов (публичные + админские) - - CRUD для постов - - Система комментариев с модерацией - - Счётчик просмотров - - Валидация URL на уникальность - -- ✅ `backend/src/modules/blog/blog.routes.ts` (65 строк) - - Настройка multer для загрузки изображений - - Middleware для авторизации - - Ограничение размера файлов (10MB) - - Фильтрация типов файлов (jpeg, jpg, png, gif, webp) - -- ✅ `backend/src/modules/blog/upload.controller.ts` (59 строк) - - Загрузка изображений - - Удаление изображений - - Генерация уникальных имен файлов - -- ✅ `backend/src/index.ts` (обновлён) - - Подключены маршруты `/api/blog` - - Раздача статических файлов `/uploads/blog` - -- ✅ `backend/prisma/schema.prisma` (обновлён) - - Модель `Post` (14 полей) - - Модель `Comment` (8 полей) - - Связи с `User` - -- ✅ `backend/uploads/blog/` (директория создана) - -### Frontend (100% ✅) - -**Публичные страницы:** -- ✅ `frontend/src/pages/blog.tsx` (155 строк) - - Адаптивная сетка (1/2/3 колонки) - - Карточки постов с превью - - Обложка + заголовок + excerpt - - Мета-информация (автор, просмотры, комментарии) - - Дата на русском языке - - Hover эффекты - -- ✅ `frontend/src/pages/blogpost.tsx` (289 строк) - - Полная статья с HTML-контентом - - Отображение обложки - - Список одобренных комментариев - - Форма отправки комментариев (авторизованные + гости) - - Уведомление о модерации - - Навигация назад - -**Админ-панель:** -- ✅ `frontend/src/pages/dashboard/blogadmin.tsx` (598 строк) - - Две вкладки: "Статьи" и "Комментарии" - - Таблица постов со статусами - - Rich Text редактор (Quill.js) - - Загрузка изображений через редактор - - Форма создания/редактирования постов - - Кастомный выбор URL - - Управление статусами (черновик/опубликовано/архив) - - Модерация комментариев (одобрение/отклонение/удаление) - - Модальное окно подтверждения удаления - - Toast уведомления - -- ✅ `frontend/src/pages/dashboard/mainpage.tsx` (обновлён) - - Добавлена вкладка "📝 Блог" для супер-админов - - Маршрут `/dashboard/blog` - -- ✅ `frontend/src/App.tsx` (обновлён) - - Маршрут `/blog` → Blog list - - Маршрут `/blog/:url` → Article page - -**Зависимости:** -- ✅ `react-quill@2.0.0` (установлено с `--legacy-peer-deps`) -- ✅ `quill` (установлено) - -### Документация (100% ✅) - -- ✅ `BLOG_DEPLOYMENT.md` (370 строк) - - Полное руководство по развёртыванию - - Структура БД - - API эндпоинты - - Решение проблем - - Кастомизация - -- ✅ `BLOG_QUICKSTART.md` (60 строк) - - Быстрая памятка для деплоя - - Команды для копипаста - -- ✅ `BLOG_SUMMARY.md` (этот файл) - - Итоговая сводка - ---- - -## 🎯 Функциональность - -### Публичная часть -- ✅ Список опубликованных статей -- ✅ Полная статья с комментариями -- ✅ Отправка комментариев (гости + авторизованные) -- ✅ Счётчик просмотров -- ✅ Адаптивный дизайн - -### Админ-панель -- ✅ Создание/редактирование/удаление постов -- ✅ Rich Text редактор (Quill.js) -- ✅ Загрузка изображений в контент -- ✅ Загрузка обложки (URL) -- ✅ Кастомный выбор URL (не auto-slug) -- ✅ Управление статусами (draft/published/archived) -- ✅ Модерация комментариев -- ✅ Просмотр всех комментариев -- ✅ Одобрение/отклонение комментариев -- ✅ Удаление комментариев -- ✅ Toast уведомления -- ✅ Модальные окна подтверждения - -### Редактор (Quill.js) -- ✅ Заголовки (H1-H6) -- ✅ Форматирование текста (жирный, курсив, подчёркнутый, зачёркнутый) -- ✅ Выбор шрифта -- ✅ Размер текста -- ✅ Цвет текста и фона -- ✅ Списки (маркированные, нумерованные) -- ✅ Выравнивание текста -- ✅ Вставка ссылок -- ✅ Загрузка изображений (до 10MB) -- ✅ Вставка видео -- ✅ Очистка форматирования - ---- - -## 📊 Статистика - -### Код -- **Backend:** 3 новых файла + 2 изменённых (410+ строк нового кода) -- **Frontend:** 3 новых файла + 2 изменённых (1042+ строк нового кода) -- **База данных:** 2 новые модели -- **API эндпоинты:** 13 эндпоинтов -- **Документация:** 3 файла (500+ строк) - -### Время разработки -- Проектирование: ~10 минут -- Backend API: ~20 минут -- Frontend (публичные страницы): ~15 минут -- Frontend (админ-панель): ~25 минут -- Интеграция редактора: ~15 минут -- Исправление ошибок: ~10 минут -- Документация: ~15 минут -- **Итого:** ~110 минут - ---- - -## 🚀 Готовность к деплою - -### Локальное тестирование -- ⏳ **НЕ ПРОТЕСТИРОВАНО** (требуется запуск dev сервера) -- ℹ️ Рекомендуется протестировать локально перед деплоем - -### Серверное развёртывание -- ✅ Инструкции готовы (`BLOG_QUICKSTART.md`) -- ✅ Все файлы созданы -- ✅ Код без ошибок компиляции -- ⚠️ Требуется: - 1. Применить миграции БД - 2. Пересобрать backend - 3. Пересобрать frontend - 4. Создать директорию `/uploads/blog` - 5. Перезапустить PM2 - ---- - -## 🔒 Безопасность - -- ✅ Авторизация через JWT токен -- ✅ Проверка прав админа (middleware) -- ✅ Ограничение размера файлов (10MB) -- ✅ Фильтрация типов файлов -- ✅ Уникальность URL постов -- ✅ Модерация комментариев -- ✅ XSS защита через модерацию HTML -- ⚠️ **Рекомендация:** Добавить санитизацию HTML (библиотека `sanitize-html`) - ---- - -## 📝 Что нужно сделать дальше - -### Обязательно -1. ✅ Применить миграции на сервере -2. ✅ Пересобрать backend -3. ✅ Пересобрать frontend -4. ✅ Перезапустить PM2 - -### Опционально (улучшения) -- ⏳ Добавить санитизацию HTML (`sanitize-html`) -- ⏳ Добавить SEO мета-теги -- ⏳ Добавить RSS ленту -- ⏳ Добавить категории/теги -- ⏳ Добавить поиск по блогу -- ⏳ Добавить пагинацию -- ⏳ Добавить автосохранение черновиков -- ⏳ Добавить preview режим - ---- - -## ✨ Заключение - -Система блогов для Ospabhost 8.1 **полностью реализована** и готова к развёртыванию. Все требования выполнены: - -1. ✅ Публичная страница `/blog` со списком статей -2. ✅ Страница статьи `/blog/:url` (не `:slug` - кастомный URL) -3. ✅ Админ-редактор на странице супер-админа -4. ✅ Rich Text редактор с настройками -5. ✅ Загрузка изображений -6. ✅ Выбор шрифтов и форматирование -7. ✅ Система комментариев с модерацией -8. ✅ Управление статусами -9. ✅ Кастомный выбор URL - -**Следующий шаг:** Развёртывание на сервере по инструкции `BLOG_QUICKSTART.md` - ---- - -**Дата:** 01.11.2025 -**Версия:** 1.0.0 -**Статус:** Production Ready ✅ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 42718ec..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,1023 +0,0 @@ -# 🤝 Руководство по внесению вклада в Ospabhost 8.1 - -Спасибо за интерес к улучшению проекта! Этот документ описывает процесс внесения изменений. - ---- - -## 📋 Содержание - -- [Кодекс поведения](#кодекс-поведения) -- [С чего начать](#с-чего-начать) -- [Процесс разработки](#процесс-разработки) -- [Стандарты кода](#стандарты-кода) -- [Коммиты](#коммиты) -- [Pull Requests](#pull-requests) -- [Архитектурные решения](#архитектурные-решения) -- [Тестирование](#тестирование) -- [Документация](#документация) - ---- - -## 📜 Кодекс поведения - -### Наши обязательства - -- Уважительное отношение ко всем участникам -- Конструктивная критика -- Фокус на улучшении проекта -- Помощь новичкам - -### Недопустимое поведение - -- Оскорбления и агрессия -- Троллинг и спам -- Дискриминация любого рода -- Публикация личной информации без разрешения - ---- - -## 🚀 С чего начать - -### Для новичков - -Ищите issues с метками: -- `good first issue` - простые задачи для начинающих -- `help wanted` - задачи, где нужна помощь -- `documentation` - улучшение документации - -### Подготовка окружения - -1. **Форк репозитория** - -Нажмите кнопку "Fork" на GitHub. - -2. **Клонирование** - -```bash -git clone https://github.com/YOUR_USERNAME/ospabhost8.1.git -cd ospabhost8.1/ospabhost -``` - -3. **Добавление upstream** - -```bash -git remote add upstream https://github.com/Ospab/ospabhost8.1.git -``` - -4. **Установка зависимостей** - -```bash -# Backend -cd backend -npm install -cp .env.example .env -# Настройте .env - -# Миграции -npx prisma migrate dev -npx prisma generate -npx prisma db seed - -# Frontend -cd ../frontend -npm install -cp .env.example .env -``` - -5. **Запуск** - -```bash -# Terminal 1: Backend -cd backend -npm run dev - -# Terminal 2: Frontend -cd frontend -npm run dev -``` - ---- - -## 🔄 Процесс разработки - -### 1. Синхронизация с upstream - -```bash -git checkout main -git fetch upstream -git merge upstream/main -git push origin main -``` - -### 2. Создание ветки - -```bash -git checkout -b feature/your-feature-name -``` - -**Префиксы веток:** -- `feature/` - новая функциональность -- `fix/` - исправление бага -- `refactor/` - рефакторинг кода -- `docs/` - изменения в документации -- `test/` - добавление тестов -- `chore/` - рутинные задачи - -**Примеры:** -```bash -git checkout -b feature/add-user-notifications -git checkout -b fix/ticket-assignment-bug -git checkout -b docs/update-api-documentation -``` - -### 3. Разработка - -Внесите изменения, следуя [стандартам кода](#стандарты-кода). - -### 4. Коммиты - -```bash -git add . -git commit -m "feat: add user notifications" -``` - -См. [раздел о коммитах](#коммиты) для подробностей. - -### 5. Пуш - -```bash -git push origin feature/your-feature-name -``` - -### 6. Pull Request - -Откройте PR на GitHub, следуя [шаблону](#pull-requests). - ---- - -## 📝 Стандарты кода - -### TypeScript/JavaScript - -#### Общие правила - -- ✅ Используйте TypeScript везде -- ✅ Строгая типизация (`strict: true`) -- ❌ Избегайте `any` (используйте `unknown` при необходимости) -- ✅ Используйте `const` и `let`, не `var` -- ✅ Предпочитайте стрелочные функции -- ✅ Асинхронный код через `async/await` - -#### Именование - -```typescript -// ✅ Хорошо -const userName = 'John'; -const getUserById = async (id: number) => { ... }; -class UserService { ... } -interface UserData { ... } -type UserId = number; - -// ❌ Плохо -const username = 'John'; // camelCase для переменных -const get_user_by_id = () => { ... }; // не snake_case -class userService { ... } // PascalCase для классов -``` - -#### Функции и методы - -```typescript -// ✅ Хорошо -async function getUserById(id: number): Promise { - try { - const user = await prisma.user.findUnique({ where: { id } }); - return user; - } catch (error) { - console.error('Error fetching user:', error); - throw new Error('Failed to fetch user'); - } -} - -// ❌ Плохо -function getUserById(id: any) { // any запрещён - const user = prisma.user.findUnique({ where: { id } }); // нет await - return user; // нет обработки ошибок -} -``` - -#### Обработка ошибок - -```typescript -// ✅ Хорошо -try { - const result = await riskyOperation(); - return res.json(result); -} catch (error) { - console.error('[Module] Error:', error); - const message = error instanceof Error - ? error.message - : 'Unknown error'; - return res.status(500).json({ error: message }); -} - -// ❌ Плохо -try { - const result = await riskyOperation(); - return res.json(result); -} catch (error) { - return res.status(500).json({ error: error }); // может быть не Error -} -``` - -#### Express Controllers - -```typescript -// ✅ Хорошо -export async function createServer(req: Request, res: Response) { - try { - const userId = (req as any).user?.id; - if (!userId) { - return res.status(401).json({ error: 'Unauthorized' }); - } - - const { osId, tariffId } = req.body; - if (!osId || !tariffId) { - return res.status(400).json({ error: 'Missing required fields' }); - } - - const server = await serverService.createServer({ - userId, - osId: Number(osId), - tariffId: Number(tariffId), - }); - - return res.json({ server }); - } catch (error) { - console.error('[Server] Create error:', error); - const message = error instanceof Error ? error.message : 'Server creation failed'; - return res.status(500).json({ error: message }); - } -} -``` - -### React/Frontend - -#### Компоненты - -```typescript -// ✅ Хорошо - функциональный компонент с типизацией -interface UserCardProps { - user: User; - onEdit: (userId: number) => void; -} - -const UserCard: React.FC = ({ user, onEdit }) => { - const [isLoading, setIsLoading] = useState(false); - - const handleEdit = useCallback(() => { - onEdit(user.id); - }, [user.id, onEdit]); - - return ( -
-

{user.name}

- -
- ); -}; - -export default UserCard; -``` - -#### Hooks - -```typescript -// ✅ Хорошо - кастомный хук с типизацией -interface UseUserDataReturn { - user: User | null; - loading: boolean; - error: string | null; - refetch: () => Promise; -} - -export const useUserData = (userId: number): UseUserDataReturn => { - const [user, setUser] = useState(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - const fetchUser = useCallback(async () => { - try { - setLoading(true); - const response = await apiClient.get(`/users/${userId}`); - setUser(response.data); - setError(null); - } catch (err) { - setError(err instanceof Error ? err.message : 'Unknown error'); - } finally { - setLoading(false); - } - }, [userId]); - - useEffect(() => { - fetchUser(); - }, [fetchUser]); - - return { user, loading, error, refetch: fetchUser }; -}; -``` - -### Prisma - -#### Схема - -```prisma -// ✅ Хорошо - явные типы и связи -model User { - id Int @id @default(autoincrement()) - email String @unique - username String @unique - password String - balance Float @default(0) - isAdmin Boolean @default(false) - operator Boolean @default(false) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - servers Server[] - tickets Ticket[] - posts Post[] - comments Comment[] - - @@index([email]) - @@index([username]) -} -``` - -#### Запросы - -```typescript -// ✅ Хорошо - типизированные запросы с обработкой -async function getServerWithRelations(id: number, userId: number) { - const server = await prisma.server.findFirst({ - where: { - id, - userId, // Проверка владельца - }, - include: { - os: true, - tariff: true, - user: { - select: { - id: true, - username: true, - email: true, - }, - }, - }, - }); - - if (!server) { - throw new Error('Server not found or access denied'); - } - - return server; -} -``` - -### SQL/Миграции - -```sql --- ✅ Хорошо - явные имена, индексы, значения по умолчанию -CREATE TABLE `StoragePlan` ( - `id` INTEGER NOT NULL AUTO_INCREMENT, - `code` VARCHAR(191) NOT NULL, - `name` VARCHAR(191) NOT NULL, - `price` DECIMAL(10, 2) NOT NULL DEFAULT 0, - `pricePerGb` DECIMAL(10, 2) NULL, - `bandwidthPerGb` DECIMAL(10, 2) NULL, - `requestsPerGb` INTEGER NULL, - `quotaGb` INTEGER NOT NULL DEFAULT 0, - `bandwidthGb` INTEGER NOT NULL DEFAULT 0, - `requestLimit` VARCHAR(191) NOT NULL DEFAULT '0', - `description` TEXT NULL, - `order` INTEGER NOT NULL DEFAULT 0, - `isActive` BOOLEAN NOT NULL DEFAULT true, - `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updatedAt` DATETIME(3) NOT NULL, - - UNIQUE INDEX `StoragePlan_code_key`(`code`), - INDEX `StoragePlan_isActive_idx`(`isActive`), - INDEX `StoragePlan_order_idx`(`order`), - PRIMARY KEY (`id`) -) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -``` - ---- - -## 📝 Коммиты - -### Conventional Commits - -Используем формат: `(): ` - -**Types:** -- `feat` - новая функциональность -- `fix` - исправление бага -- `docs` - изменения в документации -- `style` - форматирование, отступы (не CSS) -- `refactor` - рефакторинг без изменения функциональности -- `perf` - улучшение производительности -- `test` - добавление тестов -- `chore` - обновление зависимостей, настройки - -**Scope (опционально):** -- `server` - VPS модуль -- `storage` - S3 модуль -- `blog` - блог модуль -- `ticket` - тикеты -- `auth` - авторизация -- `admin` - админ панель -- `frontend` - фронтенд -- `backend` - бэкенд - -**Примеры:** - -```bash -# Новая функция -git commit -m "feat(storage): add custom tariff pricing with per-GB rates" - -# Исправление бага -git commit -m "fix(ticket): auto-unassign operator on user close" - -# Документация -git commit -m "docs: update API endpoints in README" - -# Рефакторинг -git commit -m "refactor(auth): remove any types from middleware" - -# Множественные изменения -git commit -m "feat(blog): add rich text editor - -- Add react-quill integration -- Implement image upload -- Add comment moderation" -``` - -### Правила коммитов - -- ✅ Subject в imperative mood ("add" не "added") -- ✅ Первая буква строчная -- ❌ Точка в конце не ставится -- ✅ Разделение логически независимых изменений -- ✅ Body коммита для пояснения "почему", если нужно - ---- - -## 🔍 Pull Requests - -### Перед созданием PR - -- [ ] Код соответствует стандартам -- [ ] Нет ошибок компиляции -- [ ] Проверено локально -- [ ] Добавлена документация (если нужно) -- [ ] Обновлён CHANGELOG (если существенные изменения) - -### Шаблон PR - -```markdown -## 📝 Описание - -Краткое описание изменений. - -## 🎯 Тип изменений - -- [ ] 🐛 Исправление бага -- [ ] ✨ Новая функция -- [ ] 📝 Документация -- [ ] ♻️ Рефакторинг -- [ ] ⚡️ Улучшение производительности -- [ ] ✅ Тесты - -## 🔗 Связанные issues - -Closes #123 - -## 🧪 Как тестировать - -1. Шаг 1 -2. Шаг 2 -3. Ожидаемый результат - -## 📸 Скриншоты (если применимо) - -Добавьте скриншоты UI изменений. - -## ✅ Checklist - -- [ ] Код следует стандартам проекта -- [ ] Проведено самотестирование -- [ ] Комментарии добавлены для сложных мест -- [ ] Документация обновлена -- [ ] Нет warnings при компиляции -- [ ] Работает локально - -## 📌 Дополнительные заметки - -Любая дополнительная информация. -``` - -### Процесс ревью - -1. **Автоматические проверки** - должны пройти успешно -2. **Code review** - минимум 1 аппрув от мейнтейнера -3. **Тестирование** - проверка на dev окружении -4. **Мёрдж** - после одобрения - -### Работа с замечаниями - -```bash -# Внесите изменения -git add . -git commit -m "fix: address review comments" -git push origin feature/your-feature -``` - ---- - -## 🏗️ Архитектурные решения - -### Модульность - -Каждый модуль должен быть независимым: - -``` -backend/src/modules/example/ -├── example.controller.ts # HTTP handlers -├── example.service.ts # Business logic -├── example.routes.ts # Express routes -├── example.types.ts # TypeScript types -└── example.utils.ts # Helper functions -``` - -### Разделение ответственности - -```typescript -// ❌ Плохо - всё в контроллере -export async function createUser(req: Request, res: Response) { - const { email, password } = req.body; - const hashedPassword = await bcrypt.hash(password, 10); - const user = await prisma.user.create({ - data: { email, password: hashedPassword } - }); - return res.json(user); -} - -// ✅ Хорошо - разделение на слои -// controller -export async function createUser(req: Request, res: Response) { - try { - const userData = req.body; - const user = await userService.createUser(userData); - return res.json(user); - } catch (error) { - return res.status(400).json({ error: error.message }); - } -} - -// service -export async function createUser(data: CreateUserInput) { - const hashedPassword = await hashPassword(data.password); - return await prisma.user.create({ - data: { ...data, password: hashedPassword } - }); -} -``` - -### API дизайн - -```typescript -// ✅ RESTful маршруты -GET /api/servers # Список -POST /api/servers # Создать -GET /api/servers/:id # Один -PUT /api/servers/:id # Обновить -DELETE /api/servers/:id # Удалить - -# Действия над ресурсом -POST /api/servers/:id/start -POST /api/servers/:id/stop -POST /api/servers/:id/snapshot - -# Вложенные ресурсы -GET /api/servers/:id/snapshots -DELETE /api/servers/:id/snapshots/:snapshotName -``` - -### Обработка ошибок - -```typescript -// utils/errors.ts -export class AppError extends Error { - constructor( - public message: string, - public statusCode: number = 500, - public isOperational: boolean = true - ) { - super(message); - } -} - -export class NotFoundError extends AppError { - constructor(message: string) { - super(message, 404); - } -} - -export class UnauthorizedError extends AppError { - constructor(message: string = 'Unauthorized') { - super(message, 401); - } -} - -// Использование -if (!server) { - throw new NotFoundError('Server not found'); -} -``` - ---- - -## 🧪 Тестирование - -### Ручное тестирование - -Перед PR проверьте: - -**Backend:** -```bash -# Компиляция без ошибок -npm run build - -# API endpoints работают -curl -X POST http://localhost:5000/api/auth/login \ - -H "Content-Type: application/json" \ - -d '{"email":"test@test.com","password":"password"}' -``` - -**Frontend:** -```bash -# Сборка без ошибок -npm run build - -# Линтинг без warnings -npm run lint - -# Проверка в браузере -npm run dev -``` - -### Тестовые сценарии - -Для новых функций опишите сценарии: - -```markdown -## Тестовые сценарии - -### Создание сервера - -1. Войти как пользователь -2. Открыть `/dashboard/servers` -3. Нажать "Создать сервер" -4. Выбрать OS: Ubuntu 22.04 -5. Выбрать тариф: Standard -6. Нажать "Создать" -7. Ожидать: сервер создаётся, статус "creating" -8. Через 2-3 минуты: статус "running" - -### Ошибки - -1. Без авторизации → 401 Unauthorized -2. Недостаточно средств → 400 Bad Request -3. Несуществующий OS → 404 Not Found -``` - ---- - -## 📚 Документация - -### Комментарии в коде - -```typescript -/** - * Создаёт новый VPS сервер в Proxmox - * - * @param userId - ID пользователя-владельца - * @param osId - ID операционной системы - * @param tariffId - ID тарифного плана - * @returns Объект созданного сервера - * @throws {Error} Если недостаточно средств или Proxmox недоступен - */ -export async function createServer( - userId: number, - osId: number, - tariffId: number -): Promise { - // Реализация -} -``` - -### API документация - -При добавлении endpoint обновите README: - -```markdown -#### Серверы (VPS) - -```http -POST /api/servers/:id/snapshot -Authorization: Bearer TOKEN -Content-Type: application/json - -{ - "name": "backup-before-update" -} -``` - -**Response:** -```json -{ - "snapshot": { - "name": "backup-before-update", - "createdAt": "2025-11-26T10:00:00Z" - } -} -``` -``` - -### Изменения в БД - -При добавлении миграций опишите в CHANGELOG: - -```markdown -## [Unreleased] - -### Added -- Поле `pricePerGb` в модель `StoragePlan` для кастомных тарифов -- Индекс на `StoragePlan.isActive` для быстрой фильтрации - -### Changed -- Функция `serializePlan` теперь возвращает поля per-GB - -### Migration -```bash -npx prisma migrate deploy -npx prisma generate -``` -``` - ---- - -## 🎯 Приоритеты разработки - -### High Priority 🔴 - -- Критические баги безопасности -- Потеря данных -- Падение сервиса -- Блокирующие ошибки - -### Medium Priority 🟡 - -- Новые функции из роадмапа -- Улучшения UX -- Оптимизация производительности -- Рефакторинг сложных участков - -### Low Priority 🟢 - -- Косметические исправления -- Документация -- Code style улучшения -- Nice-to-have функции - ---- - -## 🔒 Безопасность - -### Уязвимости - -Если нашли уязвимость безопасности: - -1. **НЕ создавайте публичный issue** -2. Напишите на security@ospab.host -3. Опишите подробно проблему -4. Предложите решение (если есть) - -### Практики безопасности - -```typescript -// ✅ Хорошо -const hashedPassword = await bcrypt.hash(password, 10); - -// Проверка владельца ресурса -const server = await prisma.server.findFirst({ - where: { id: serverId, userId } // Фильтр по userId -}); - -// Санитизация ввода -const sanitizedName = name.trim().slice(0, 100); - -// ❌ Плохо -const server = await prisma.server.findUnique({ - where: { id: serverId } // Любой может получить любой сервер -}); -``` - ---- - -## 🌍 Интернационализация - -В будущем планируется поддержка нескольких языков. При добавлении текста: - -```typescript -// ✅ Хорошо - готово к i18n -const messages = { - server_created: 'Server created successfully', - server_error: 'Failed to create server', -}; - -// ❌ Плохо - хардкод -return res.json({ message: 'Сервер создан успешно' }); -``` - ---- - -## 📞 Получение помощи - -### Где задать вопрос - -- **GitHub Discussions** - общие вопросы -- **GitHub Issues** - баги и фичи -- **Telegram** - [@ospab](https://t.me/ospab) - быстрая помощь - -### Как задать хороший вопрос - -```markdown -## Описание проблемы - -Краткое описание что не работает. - -## Шаги для воспроизведения - -1. Шаг 1 -2. Шаг 2 -3. Результат - -## Ожидаемое поведение - -Что должно было произойти. - -## Окружение - -- OS: Windows 11 -- Node.js: 18.17.0 -- Browser: Chrome 120 -- Backend: running on localhost:5000 - -## Логи/ошибки - -``` -Вставьте логи или скриншоты ошибок -``` - -## Что уже пробовали - -- Перезапустили сервер -- Очистили npm cache -``` - ---- - -## 📅 Релизный цикл - -### Версионирование - -Следуем [Semantic Versioning](https://semver.org/): - -- **MAJOR** (8.x.x) - несовместимые изменения API -- **MINOR** (x.1.x) - новая функциональность, обратно совместимая -- **PATCH** (x.x.1) - исправления багов - -### Ветки - -- `main` - стабильная production версия -- `develop` - разработка следующего релиза -- `feature/*` - новые функции -- `fix/*` - исправления - ---- - -## ✨ Лучшие практики - -### DRY (Don't Repeat Yourself) - -```typescript -// ❌ Плохо -const user1 = await prisma.user.findUnique({ where: { id: 1 } }); -const user2 = await prisma.user.findUnique({ where: { id: 2 } }); -const user3 = await prisma.user.findUnique({ where: { id: 3 } }); - -// ✅ Хорошо -const userIds = [1, 2, 3]; -const users = await prisma.user.findMany({ - where: { id: { in: userIds } } -}); -``` - -### Раннее возвращение - -```typescript -// ✅ Хорошо -function processUser(user: User | null) { - if (!user) { - return null; - } - if (!user.isActive) { - return null; - } - // Основная логика - return user.name; -} - -// ❌ Плохо -function processUser(user: User | null) { - if (user) { - if (user.isActive) { - // Основная логика - return user.name; - } - } - return null; -} -``` - -### Константы вместо магических чисел - -```typescript -// ✅ Хорошо -const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB -const SESSION_TTL_MINUTES = 20; -const DEFAULT_PAGE_SIZE = 10; - -if (fileSize > MAX_FILE_SIZE) { - throw new Error('File too large'); -} - -// ❌ Плохо -if (fileSize > 10485760) { // Что это за число? - throw new Error('File too large'); -} -``` - ---- - -## 🎓 Обучающие ресурсы - -### TypeScript -- [Official Docs](https://www.typescriptlang.org/docs/) -- [TypeScript Deep Dive](https://basarat.gitbook.io/typescript/) - -### React -- [Official Docs](https://react.dev/) -- [React TypeScript Cheatsheet](https://react-typescript-cheatsheet.netlify.app/) - -### Prisma -- [Official Docs](https://www.prisma.io/docs/) -- [Prisma Best Practices](https://www.prisma.io/docs/guides/performance-and-optimization) - -### Express -- [Official Docs](https://expressjs.com/) -- [Express Best Practices](https://expressjs.com/en/advanced/best-practice-performance.html) - ---- - -## 🏆 Признание вкладчиков - -Все участники будут упомянуты в: -- CHANGELOG.md -- Contributors страница на сайте -- Release notes - -Спасибо за вклад в развитие Ospabhost! 🚀 - ---- - -**Последнее обновление:** 26 ноября 2025 -**Версия:** 1.0.0 diff --git a/DEPLOY_INSTRUCTIONS.md b/DEPLOY_INSTRUCTIONS.md deleted file mode 100644 index f74198d..0000000 --- a/DEPLOY_INSTRUCTIONS.md +++ /dev/null @@ -1,128 +0,0 @@ -# 🚀 Инструкции по развертыванию обновлений - -## Проблема -После обновления кода на сервере появляются ошибки: -- `Cannot read properties of undefined (reading 'findMany')` - Prisma Client не имеет моделей Post/Comment -- OAuth endpoints возвращают 404 -- Admin endpoints возвращают 404 - -## Решение - -### 1. Убедитесь, что schema.prisma на сервере актуальна - -```bash -ssh root@ospab.host -cd /var/www/ospab-host/backend - -# Проверьте, что в schema.prisma есть модели Post и Comment -grep -A 5 "model Post" prisma/schema.prisma -grep -A 5 "model Comment" prisma/schema.prisma -``` - -Если моделей нет, загрузите schema.prisma с локальной машины: - -```powershell -# На локальной машине (Windows) -cd d:\Ospab-projects\ospabhost8.1\ospabhost\backend -scp prisma/schema.prisma root@ospab.host:/var/www/ospab-host/backend/prisma/ -``` - -### 2. Создайте таблицы в базе данных (если их нет) - -```bash -# На сервере -cd /var/www/ospab-host/backend -npx prisma db push -``` - -### 3. Регенерируйте Prisma Client - -```bash -# На сервере -npx prisma generate -``` - -Эта команда создаст типы для моделей Post и Comment в `node_modules/@prisma/client` - -### 4. Загрузите обновленный dist с локальной машины - -```powershell -# На локальной машине (Windows) -cd d:\Ospab-projects\ospabhost8.1\ospabhost\backend -scp -r dist/ root@ospab.host:/var/www/ospab-host/backend/ -``` - -### 5. Перезапустите backend - -```bash -# На сервере -pm2 restart backend -pm2 logs backend --lines 50 -``` - -## Проверка - -После выполнения всех шагов проверьте: - -```bash -# 1. OAuth endpoints (должны возвращать 302 redirect) -curl -I https://ospab.host:5000/api/auth/google -curl -I https://ospab.host:5000/api/auth/github -curl -I https://ospab.host:5000/api/auth/yandex - -# 2. Admin endpoints (должны возвращать 401 без токена или 200 с токеном) -curl https://ospab.host:5000/api/admin/users - -# 3. Blog endpoints (должны возвращать JSON) -curl https://ospab.host:5000/api/blog/posts -curl https://ospab.host:5000/api/blog/admin/posts -H "Authorization: Bearer YOUR_TOKEN" -``` - -## Что было исправлено в коде - -### backend/src/index.ts -```typescript -// Добавлены импорты: -import passport from './modules/auth/passport.config'; -import oauthRoutes from './modules/auth/oauth.routes'; -import adminRoutes from './modules/admin/admin.routes'; - -// Добавлена инициализация Passport: -app.use(passport.initialize()); - -// Подключены маршруты: -app.use('/api/auth', oauthRoutes); // OAuth (Google/GitHub/Yandex) -app.use('/api/admin', adminRoutes); // Admin панель -``` - -### backend/src/modules/auth/oauth.routes.ts -```typescript -// Убраны типы `any`, добавлен интерфейс: -interface AuthenticatedUser { - id: number; - email: string; - username: string; -} -``` - -## Troubleshooting - -### Ошибка: "Cannot read properties of undefined (reading 'findMany')" -**Причина:** Prisma Client не имеет моделей Post/Comment -**Решение:** Выполните `npx prisma generate` на сервере - -### Ошибка: "Table 'ospabhost.post' doesn't exist" -**Причина:** Таблицы не созданы в базе данных -**Решение:** Выполните `npx prisma db push` на сервере - -### OAuth возвращает 404 -**Причина:** OAuth маршруты не подключены -**Решение:** Загрузите обновленный dist и перезапустите backend - -### Admin endpoints возвращают 404 -**Причина:** Admin маршруты не подключены -**Решение:** Загрузите обновленный dist и перезапустите backend - ---- - -**Дата обновления:** 1 ноября 2025 г. diff --git a/DESIGN-SYSTEM.md b/DESIGN-SYSTEM.md deleted file mode 100644 index 876b22a..0000000 --- a/DESIGN-SYSTEM.md +++ /dev/null @@ -1,436 +0,0 @@ -# Design System — ospab.host - -## Обзор - -Новая главная страница `/test` реализована с современным дизайном, следуя принципам minimalist dark theme с акцентом на скругленные края, плавные анимации и градиенты. - ---- - -## Цветовая палитра - -### Основные цвета - -```css -/* Background */ ---bg-primary: from-slate-900 via-blue-900 to-slate-900 ---bg-secondary: bg-white/5 (backdrop-blur-sm) ---bg-card: bg-white/10 - -/* Text */ ---text-primary: text-white ---text-secondary: text-gray-300 ---text-muted: text-gray-400 - -/* Accent */ ---accent-blue: #3B82F6 (blue-500) ---accent-purple: #9333EA (purple-600) ---accent-pink: #EC4899 (pink-400) - -/* Gradient */ ---gradient-primary: from-blue-600 to-purple-600 ---gradient-text: from-blue-400 via-purple-400 to-pink-400 -``` - -### Состояния - -```css -/* Hover */ ---hover-card: bg-white/10 + border-blue-500/50 ---hover-button: shadow-2xl shadow-blue-500/50 - -/* Active/Focus */ ---active-border: border-blue-500 - -/* Disabled */ ---disabled-bg: bg-gray-700 ---disabled-text: text-gray-500 -``` - ---- - -## Типографика - -### Размеры заголовков - -```tsx -

// Hero title -text-7xl md:text-8xl lg:text-9xl font-black - -

// Section titles -text-4xl md:text-5xl font-bold - -

// Card titles -text-xl md:text-2xl font-bold - -

// Hero description -text-2xl md:text-3xl font-light - -

// Body text -text-lg md:text-xl text-gray-400 -``` - -### Шрифты - -- **Primary**: System font stack (default) -- **Weight**: - - Light: 300 (hero descriptions) - - Medium: 500 (navigation, labels) - - Bold: 700 (section titles) - - Black: 900 (hero title) - ---- - -## Скругления (Border Radius) - -### Стандартные значения - -```css -/* Buttons, small cards */ -rounded-xl (12px) -rounded-2xl (16px) - -/* Large cards, sections */ -rounded-3xl (24px) - -/* Logo, icon containers */ -rounded-2xl (16px) -``` - -### Правило применения - -- Все интерактивные элементы имеют скругления **минимум 12px** -- Карточки и секции — **24px** -- Мелкие элементы (badges, pills) — **12-16px** - ---- - -## Анимации - -### Fade In Up - -```css -@keyframes fade-in-up { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} - -/* Usage */ -.animate-fade-in-up { - animation: fade-in-up 0.8s ease-out forwards; - opacity: 0; -} -``` - -**Применение:** -- Hero секция -- Feature cards (с задержкой) -- Статистика (staggered delay) - -### Gradient Animation - -```css -@keyframes gradient-x { - 0%, 100% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } -} - -.animate-gradient-x { - background-size: 200% 200%; - animation: gradient-x 3s ease infinite; -} -``` - -**Применение:** -- Hero title (ospab.host) -- Акцентные элементы - -### Hover Effects - -```tsx -// Scale + Shadow -hover:scale-105 hover:shadow-2xl hover:shadow-blue-500/50 - -// Background change -hover:bg-white/20 - -// Border glow -hover:border-blue-500/50 - -// Transform -group-hover:scale-110 transition-transform duration-300 -``` - -### Delays - -```css -/* Staggered animations */ -style={{ animationDelay: `${index * 100}ms` }} - -.delay-1000 { animation-delay: 1s; } -.delay-2000 { animation-delay: 2s; } -``` - ---- - -## Компоненты - -### Header - -**Характеристики:** -- Фиксированная позиция (`fixed top-0`) -- Backdrop blur при скролле (`backdrop-blur-xl`) -- Плавный переход фона - -```tsx -

-``` - -**Элементы:** -- Logo (скругленный квадрат с градиентом) -- Navigation (hover: text-white) -- CTA button (rounded-xl, gradient на hover) - -### Hero Section - -**Структура:** -1. Main heading (огромный, с градиентом) -2. Subtitle (font-light, gray-300) -3. Description (текст с отступами) -4. CTA buttons (gradient + outline) -5. Stats grid (4 колонки) - -**Анимации:** -- Весь блок: fade-in-up -- Статистика: staggered fade-in-up - -### Feature Cards - -**Дизайн:** -```tsx -
-
🚀
-

Мгновенный деплой

-

Описание...

-
-``` - -**Особенности:** -- Glassmorphism эффект (`backdrop-blur-sm`) -- Эмодзи иконки (5xl) -- Hover: scale + shadow + border glow -- Внутренний gradient glow на hover - -### Pricing Cards - -**Варианты:** -- Обычная: `border-white/10` -- Популярная: `border-blue-500 shadow-2xl shadow-blue-500/30` - -**Элементы:** -- Badge "Популярный" (gradient, rounded-full) -- Цена (огромный текст) -- Список фич (зеленые галочки) -- CTA button (gradient для популярной) - -### Footer - -**Структура:** -- Logo + описание -- 4 колонки ссылок -- Bottom bar (copyright + links) - -**Цвета:** -```tsx -bg-black/40 backdrop-blur-xl border-t border-white/10 -``` - -### CTA Section - -**Дизайн:** -```tsx -
- {/* Background pattern с opacity-10 */} -
-
-
- -

Готовы начать?

-
- - -
-
-``` - ---- - -## Background Effects - -### Animated Particles - -```tsx -
-
-
-
-
-``` - -**Характеристики:** -- `pointer-events-none` (не блокирует клики) -- Низкая opacity (10%) -- Большой blur (3xl = 64px) -- Анимация pulse с задержками - ---- - -## Breakpoints - -### Адаптивность - -```css -/* Mobile First */ -- Base: < 640px -md: >= 768px (tablets) -lg: >= 1024px (desktops) -xl: >= 1280px (large screens) - -/* Typography scaling */ -text-7xl → md:text-8xl → lg:text-9xl - -/* Grid changes */ -grid-cols-2 → md:grid-cols-3 → lg:grid-cols-4 - -/* Padding adjustments */ -p-8 → md:p-16 -``` - ---- - -## Best Practices - -### 1. Скругления везде -✅ Все элементы имеют `rounded-*` -❌ Никаких острых углов (кроме иконок SVG) - -### 2. Transitions на все -```tsx -transition-all duration-300 -transition-colors duration-300 -transition-transform duration-500 -``` - -### 3. Hover эффекты -Каждый интерактивный элемент имеет: -- `hover:scale-105` (легкое увеличение) -- `hover:shadow-*` (тень с цветом accent) -- `hover:bg-*/hover:border-*` (изменение фона/границы) - -### 4. Glassmorphism -```tsx -bg-white/5 backdrop-blur-sm border border-white/10 -``` - -### 5. Градиенты для акцентов -```tsx -// Buttons -bg-gradient-to-r from-blue-600 to-purple-600 - -// Text -bg-gradient-to-r from-blue-400 via-purple-400 to-pink-400 bg-clip-text text-transparent -``` - -### 6. Shadows с цветом -```tsx -// Не просто shadow-xl -// А shadow-2xl shadow-blue-500/50 -hover:shadow-2xl hover:shadow-blue-500/50 -``` - -### 7. Анимации с delays -```tsx -// Для списков -{items.map((item, index) => ( -
-))} -``` - ---- - -## Структура страницы - -``` - - ├── Background Particles (fixed, animated) - ├── Header (fixed, scrolled state) - ├── Hero Section - │ ├── Main Heading (ospab.host with gradient) - │ ├── Description - │ ├── CTA Buttons - │ └── Stats Grid (4 columns) - ├── Features Section - │ ├── Section Title - │ └── Features Grid (6 cards, 3 columns) - ├── Pricing Section - │ ├── Section Title - │ └── Pricing Cards (3 cards, 1 popular) - ├── CTA Section (gradient background) - └── Footer - ├── Company Info + Links (4 columns) - └── Bottom Bar (copyright + legal links) - -``` - ---- - -## Используемые технологии - -- **React** 18 -- **React Router** v6 -- **Tailwind CSS** 3.x -- **TypeScript** 5.x - ---- - -## Файлы - -- `frontend/src/pages/test.tsx` — главная страница -- `frontend/src/App.tsx` — роутинг (добавлен `/test`) - ---- - -## Следующие шаги - -### Когда дизайн понравится: -1. Перенести компоненты из `/test` в `/` (index.tsx) -2. Создать отдельные компоненты: - - `components/Hero.tsx` - - `components/FeatureCard.tsx` - - `components/PricingCard.tsx` - - `components/CTASection.tsx` -3. Обновить остальные страницы в том же стиле -4. Создать тему в отдельном файле `theme.config.ts` - ---- - -_Документ создан: 11 ноября 2025 г._ diff --git a/NEW_FEATURES.md b/NEW_FEATURES.md deleted file mode 100644 index c6f4511..0000000 --- a/NEW_FEATURES.md +++ /dev/null @@ -1,244 +0,0 @@ -# Новые функции: Сессии, QR-авторизация и улучшенные тикеты - -## 📋 Что было сделано - -### ✅ Backend - -1. **Система управления сессиями** - - Новая таблица `session` для хранения JWT refresh tokens - - Отслеживание: IP, user-agent, устройство, браузер, геолокация - - Лимит: максимум 10 сессий на пользователя - - Автоматическое удаление старых сессий (30 дней) - - API endpoints: - - `GET /api/sessions` - список всех активных сессий - - `GET /api/sessions/history` - история входов - - `DELETE /api/sessions/:id` - завершить конкретную сессию - - `DELETE /api/sessions/others/all` - завершить все остальные сессии - -2. **QR-авторизация (как в Telegram Web)** - - Новая таблица `qr_login_request` - - Генерация уникальных QR-кодов (crypto-based) - - Время жизни: 60 секунд - - Polling механизм для проверки статуса (каждые 2 сек) - - API endpoints: - - `POST /api/qr-auth/generate` - создать QR-код (публичный) - - `GET /api/qr-auth/status/:code` - проверить статус (публичный, polling) - - `POST /api/qr-auth/confirm` - подтвердить вход с мобильного (требует авторизации) - - `POST /api/qr-auth/reject` - отклонить вход (требует авторизации) - -3. **Улучшенная система тикетов** - - Новые поля в таблице `ticket`: - - `priority` (low/normal/high/urgent) - - `category` (general/technical/billing/other) - - `assignedTo` (оператор, которому назначен тикет) - - `closedAt` (дата закрытия) - - Новые таблицы: - - `ticket_attachment` - файлы к тикетам - - `response_attachment` - файлы к ответам - - Новое поле в `response`: - - `isInternal` - внутренние комментарии для операторов - - Поддержка файлов: max 5 файлов по 10MB (jpeg/png/gif/pdf/doc/txt/zip) - - Статусы: open → in_progress → awaiting_reply → resolved → closed - - API endpoints: - - `GET /api/ticket/:id` - получить один тикет - - `POST /api/ticket/status` - изменить статус (только операторы) - - `POST /api/ticket/assign` - назначить оператора (только операторы) - - Обновлены существующие endpoints для поддержки новых полей - -### ✅ Frontend - -1. **Страница управления сессиями** - - Путь: `/dashboard/settings/sessions` - - Компонент: `frontend/src/pages/dashboard/settings/sessions.tsx` - - Функции: - - Список всех активных сессий с карточками - - Текущая сессия выделена зелёным - - Информация: устройство, браузер, IP, геолокация, последняя активность - - Кнопка "Завершить сессию" на каждой карточке - - Кнопка "Завершить все остальные сессии" - - Раздел истории входов (последние 20 попыток) - - Советы по безопасности - -2. **Компонент QR-авторизации** - - Путь: `frontend/src/components/QRLogin.tsx` - - Функции: - - Генерация и отображение QR-кода - - Таймер обратного отсчёта (60 секунд) - - Автообновление истёкшего QR - - Polling статуса каждые 2 секунды - - Автоматический вход при подтверждении - - Инструкции для пользователя - - TODO: Интегрировать на страницу `/login` как альтернативу паролю - -3. **Новая страница списка тикетов** - - Путь: `/dashboard/tickets-new` - - Компонент: `frontend/src/pages/dashboard/tickets/index.tsx` - - Функции: - - Современный card-дизайн - - Фильтры по статусу, категории, приоритету - - Цветные бейджи статусов - - Индикаторы приоритета - - Иконки категорий - - Счётчик ответов - - Относительное время обновления - - Кнопка создания нового тикета - -4. **Страница просмотра тикета** - - Путь: `/dashboard/tickets-new/:id` - - Компонент: `frontend/src/pages/dashboard/tickets/detail.tsx` - - Функции: - - Полная информация о тикете - - История ответов в хронологическом порядке - - Внутренние комментарии (жёлтый фон, только операторы) - - Форма добавления нового ответа - - Кнопка закрытия тикета - - Бейджи статуса и приоритета - - Аватары пользователей - -5. **Страница создания тикета** - - Путь: `/dashboard/tickets/new` - - Компонент: `frontend/src/pages/dashboard/tickets/new.tsx` - - Функции: - - Форма с полями: тема, категория, приоритет, описание - - Валидация полей - - Советы по созданию тикетов - - Перенаправление на созданный тикет - -## 📁 Структура файлов - -### Backend -``` -backend/ -├── src/ -│ ├── index.ts (добавлены новые routes) -│ └── modules/ -│ ├── session/ -│ │ ├── session.controller.ts (NEW) -│ │ └── session.routes.ts (NEW) -│ ├── qr-auth/ -│ │ ├── qr-auth.controller.ts (NEW) -│ │ └── qr-auth.routes.ts (NEW) -│ └── ticket/ -│ ├── ticket.controller.ts (REWRITTEN) -│ └── ticket.routes.ts (UPDATED) -├── prisma/ -│ ├── schema.prisma (обновлена) -│ ├── apply-migration.ts (NEW - скрипт применения миграции) -│ └── migrations_manual/ -│ └── add_sessions_qr_tickets_features.sql (NEW) -└── uploads/ - └── tickets/ (NEW) -``` - -### Frontend -``` -frontend/ -├── src/ -│ ├── components/ -│ │ └── QRLogin.tsx (NEW) -│ └── pages/ -│ └── dashboard/ -│ ├── mainpage.tsx (добавлены routes) -│ ├── settings/ -│ │ └── sessions.tsx (NEW) -│ └── tickets/ -│ ├── index.tsx (NEW) -│ ├── detail.tsx (NEW) -│ └── new.tsx (NEW) -└── package.json (добавлен qrcode.react) -``` - -## 🔧 Технические детали - -### База данных -- **Миграция применена**: ✅ -- **Prisma client сгенерирован**: ✅ -- **Новые таблицы**: - - `session` (10 столбцов) - - `login_history` (9 столбцов) - - `qr_login_request` (9 столбцов) - - `ticket_attachment` (7 столбцов) - - `response_attachment` (7 столбцов) - -### Зависимости -- **Backend**: Без новых зависимостей (используются встроенные) -- **Frontend**: - - `qrcode.react` ✅ установлен - -### Компиляция -- **Backend**: ✅ Собран без ошибок (`npm run build`) -- **Frontend**: ✅ Собран без ошибок (`npm run build`) - -## 📝 TODO - -### Осталось сделать: - -1. **Интеграция QR-компонента на страницу входа** ⏳ - - Добавить переключатель "Пароль / QR-код" на `/login` - - Импортировать компонент `QRLogin` - -2. **Добавить ссылку на сессии в меню настроек** ⏳ - - В сайдбаре дашборда добавить пункт "Сессии" в разделе настроек - -3. **Тестирование** ⏳ - - Проверить создание/просмотр/ответ на тикеты - - Проверить фильтры тикетов - - Проверить управление сессиями - - Протестировать QR-авторизацию (требуется мобильное приложение) - -4. **Дополнительные улучшения (опционально)**: - - WebSocket для real-time обновлений тикетов - - Загрузка файлов в тикеты (multer настроен, нужен UI) - - Интеграция API геолокации (сейчас заглушка "Россия, Москва") - - Email-уведомления о новых ответах - - Push-уведомления для мобильных устройств - -## 🚀 Деплой - -### Backend: -```bash -cd backend -npm run build -# Перезапустить PM2 или сервер -pm2 reload ecosystem.config.js -``` - -### Frontend: -```bash -cd frontend -npm run build -# Скопировать dist/ на production сервер -``` - -## 🔗 API Endpoints - -### Сессии -- `GET /api/sessions` - Список активных сессий -- `GET /api/sessions/history?limit=20` - История входов -- `DELETE /api/sessions/:id` - Завершить сессию -- `DELETE /api/sessions/others/all` - Завершить все остальные - -### QR-авторизация -- `POST /api/qr-auth/generate` - Сгенерировать QR -- `GET /api/qr-auth/status/:code` - Проверить статус -- `POST /api/qr-auth/confirm` - Подтвердить вход -- `POST /api/qr-auth/reject` - Отклонить вход - -### Тикеты (новые/обновлённые) -- `GET /api/ticket/:id` - Получить один тикет -- `POST /api/ticket/status` - Изменить статус -- `POST /api/ticket/assign` - Назначить оператора - -## 📱 Мобильное приложение - -Для полноценной работы QR-авторизации требуется мобильное приложение, которое: -1. Умеет сканировать QR-коды -2. Может отправить POST запрос на `/api/qr-auth/confirm` с кодом -3. Передаёт авторизационный токен пользователя - -Формат QR-кода: `ospabhost://qr-login?code={уникальный_код}` - ---- - -**Дата создания**: 9 ноября 2025 -**Статус**: Backend ✅ | Frontend ✅ | Тестирование ⏳ diff --git a/OAUTH_DEPLOY.md b/OAUTH_DEPLOY.md deleted file mode 100644 index e0e1acd..0000000 --- a/OAUTH_DEPLOY.md +++ /dev/null @@ -1,96 +0,0 @@ -# OAuth Deployment Instructions - -## Что было исправлено - -OAuth маршруты существовали, но не были подключены к Express приложению. - -### Изменения в коде: - -1. **backend/src/index.ts**: - - Добавлен импорт: `import passport from './modules/auth/passport.config';` - - Добавлен импорт: `import oauthRoutes from './modules/auth/oauth.routes';` - - Добавлена инициализация Passport: `app.use(passport.initialize());` - - Подключены OAuth маршруты: `app.use('/api/auth', oauthRoutes);` - -2. **backend/src/modules/auth/oauth.routes.ts**: - - Убран тип `any`, добавлен интерфейс `AuthenticatedUser` - -## Развертывание на production сервере - -### Шаг 1: Загрузить изменения на сервер - -```bash -# На локальной машине -cd d:\Ospab-projects\ospabhost8.1\ospabhost\backend -scp -r dist/ root@ospab.host:/root/ospabhost/backend/ -``` - -### Шаг 2: Перезапустить backend сервер - -```bash -# На сервере -ssh root@ospab.host -pm2 restart backend -pm2 logs backend --lines 50 -``` - -### Шаг 3: Проверить, что OAuth маршруты работают - -```bash -# Проверка Google OAuth endpoint -curl -I https://ospab.host:5000/api/auth/google - -# Проверка GitHub OAuth endpoint -curl -I https://ospab.host:5000/api/auth/github - -# Проверка Yandex OAuth endpoint -curl -I https://ospab.host:5000/api/auth/yandex -``` - -Каждый должен вернуть 302 (redirect) или инициировать OAuth flow. - -## Настройки OAuth провайдеров - -### Google Cloud Console -- **Authorized redirect URIs**: `https://ospab.host:5000/api/auth/google/callback` -- **Client ID**: указан в .env файле -- **Client Secret**: указан в .env файле - -### GitHub OAuth App -- **Authorization callback URL**: `https://ospab.host:5000/api/auth/github/callback` -- **Client ID**: указан в .env файле -- **Client Secret**: указан в .env файле - -### Yandex OAuth -- **Redirect URI**: `https://ospab.host:5000/api/auth/yandex/callback` -- **Client ID**: указан в .env файле -- **Client Secret**: указан в .env файле - -## Проверка работоспособности - -После развертывания проверьте: - -1. ✅ Backend стартует без ошибок -2. ✅ OAuth endpoints отвечают (не 404) -3. ✅ Кнопки OAuth на frontend инициируют редирект -4. ✅ После авторизации через провайдера происходит редирект обратно на сайт с токеном -5. ✅ Пользователь создается в базе данных (если новый) -6. ✅ Токен сохраняется в localStorage и происходит автовход - -## Troubleshooting - -### Ошибка 404 на /api/auth/google -- Убедитесь, что backend перезапущен после обновления -- Проверьте pm2 logs: `pm2 logs backend` - -### Ошибка "Email не предоставлен провайдером" -- GitHub: email должен быть публичным в настройках профиля -- Google/Yandex: должны быть запрошены правильные scopes - -### Redirect не работает -- Проверьте, что FRONTEND_URL в .env правильный: `https://ospab.host` -- Убедитесь, что callback URLs в OAuth провайдерах совпадают с OAUTH_CALLBACK_URL - -### Пользователь не создается -- Проверьте логи Prisma -- Убедитесь, что DATABASE_URL правильный в .env diff --git a/QR-AUTH-SECURITY.md b/QR-AUTH-SECURITY.md deleted file mode 100644 index f695c5a..0000000 --- a/QR-AUTH-SECURITY.md +++ /dev/null @@ -1,236 +0,0 @@ -# QR-аутентификация — Безопасность - -## Обзор - -QR-аутентификация реализована по модели **OAuth2-подобного flow**, аналогично Google/Яндекс/Telegram Login. - ---- - -## Архитектура безопасности - -### ✅ Правильный flow (текущая реализация) - -``` -1. ПК (неавторизованный) - ↓ - POST /api/qr-auth/generate - ← Получает уникальный code (без привязки к пользователю) - ↓ - Показывает QR: https://ospab.host/qr-login?code=XXX - ↓ - Polling: GET /api/qr-auth/status/:code каждые 2 секунды - -2. Телефон (пользователь УЖЕ авторизован) - ↓ - Сканирует QR → открывается /qr-login?code=XXX - ↓ - POST /api/qr-auth/scanning (с Bearer token) - → Backend обновляет статус QR на "scanning" - ← ПК видит "Ожидание подтверждения на телефоне..." - ↓ - GET /api/auth/me (с Bearer token) - ← Получает данные ТЕКУЩЕГО пользователя телефона - ↓ - Показывает экран подтверждения: - "Войти на новом устройстве как [Ваше имя]?" - ↓ - Пользователь нажимает "Подтвердить" - ↓ - POST /api/qr-auth/confirm + Bearer token + code - → Backend привязывает userId к QR-запросу - → Обновляет статус на "confirmed" - -3. ПК (polling получает confirmed) - ↓ - Получает JWT токен ЭТОГО пользователя - ↓ - Вызывает login(token) → обновляет AuthContext - ↓ - Редирект на /dashboard -``` - ---- - -## Защита от уязвимостей - -### 🔒 1. Анонимный QR-код - -- ✅ QR создаётся **БЕЗ** привязки к пользователю -- ✅ `userId` присваивается **только после подтверждения** -- ❌ Невозможно "угадать" чей токен получит ПК - -### 🔒 2. Требование авторизации на телефоне - -- ✅ `/api/qr-auth/scanning` требует `authMiddleware` -- ✅ `/api/qr-auth/confirm` требует `authMiddleware` -- ❌ Неавторизованный пользователь НЕ может подтвердить вход - -### 🔒 3. Экран подтверждения - -```tsx -// Телефон показывает: -
-

Войти на новом устройстве как:

-

{userData.username}

-

{userData.email}

-
- - - -``` - -- ✅ Пользователь **видит** от чьего имени происходит вход -- ✅ Может **отказаться**, если это не он - -### 🔒 4. Время жизни QR-кода - -```typescript -const QR_EXPIRATION_SECONDS = 60; // 60 секунд -``` - -- ✅ QR истекает через 60 секунд -- ✅ После использования (confirmed/rejected) — удаляется -- ✅ Cleanup устаревших кодов каждые 24 часа - -### 🔒 5. Статусы и переходы - -``` -pending → scanning → confirmed/rejected/expired - ↓ ↓ ↓ - Создан Открыт Финальный статус -``` - -- ✅ `pending` → `scanning`: пользователь открыл страницу -- ✅ `scanning` → `confirmed`: подтвердил вход -- ✅ `scanning` → `rejected`: отклонил вход -- ✅ `pending/scanning` → `expired`: истёк таймаут - -### 🔒 6. Polling на ПК - -```typescript -// Каждые 2 секунды: -GET /api/qr-auth/status/:code - -// Ответы: -{ status: 'pending' } // Ещё не сканировали -{ status: 'scanning' } // Пользователь открыл страницу подтверждения -{ status: 'confirmed', token: 'JWT', user: {...} } // Подтвердили -{ status: 'rejected' } // Отклонили -{ status: 'expired' } // Истёк -``` - -- ✅ ПК **не генерирует токен** сам -- ✅ ПК **получает токен** только после подтверждения с телефона -- ✅ Токен содержит `userId` пользователя с телефона - ---- - -## Защита от атак - -### ❌ Атака: Перехват QR-кода - -**Сценарий:** Злоумышленник фотографирует QR с чужого экрана - -**Защита:** -- ✅ QR живёт 60 секунд -- ✅ Требуется авторизация на телефоне атакующего -- ✅ Экран подтверждения показывает имя/email входящего пользователя -- ✅ Жертва видит что в её аккаунт пытаются войти - -### ❌ Атака: MITM (Man-in-the-Middle) - -**Сценарий:** Злоумышленник перехватывает сетевой трафик - -**Защита:** -- ✅ Все запросы через HTTPS (`https://ospab.host:5000`) -- ✅ JWT токены передаются в `Authorization: Bearer` -- ✅ Токены хранятся в `localStorage` (HttpOnly cookie было бы лучше, но требует серверный рендеринг) - -### ❌ Атака: Replay Attack - -**Сценарий:** Злоумышленник повторно отправляет перехваченный запрос - -**Защита:** -- ✅ QR-код одноразовый (удаляется после confirm/reject) -- ✅ `status !== 'pending' && status !== 'scanning'` → ошибка -- ✅ JWT токены имеют `expiresIn: '24h'` - -### ❌ Атака: Session Fixation - -**Сценарий:** Злоумышленник пытается навязать свой QR-код - -**Защита:** -- ✅ ПК генерирует QR **локально** через `/api/qr-auth/generate` -- ✅ Невозможно "навязать" чужой QR (каждый code уникален) -- ✅ Backend не принимает "предустановленные" коды - ---- - -## Сравнение с другими методами - -| Метод | Безопасность | Удобство | Скорость | -|------------------------|--------------|----------|----------| -| **QR-аутентификация** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | -| Логин + пароль | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | -| Email magic link | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ | -| SMS OTP | ⭐⭐⭐ | ⭐⭐ | ⭐⭐ | -| OAuth (Google/Yandex) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | - ---- - -## Рекомендации по улучшению (будущее) - -### 1. Rate Limiting -```typescript -// Ограничить количество попыток генерации QR с одного IP -// Пример: максимум 10 QR в минуту -``` - -### 2. Device Fingerprinting -```typescript -// При создании QR запоминать fingerprint ПК -// При polling проверять что запросы идут с того же устройства -``` - -### 3. Geolocation Check -```typescript -// Если расстояние между IP адресами ПК и телефона > 1000 км → предупреждение -// "Попытка входа из другой страны. Подтвердите что это вы" -``` - -### 4. WebSocket вместо Polling -```typescript -// Вместо GET /status/:code каждые 2 секунды -// Использовать WebSocket для реального времени -``` - -### 5. Push Notifications -```typescript -// Отправлять пуш на телефон: "Вход на новом устройстве. Подтвердите?" -// Не требует открывать браузер -``` - ---- - -## Заключение - -Текущая реализация QR-аутентификации **безопасна** и соответствует индустриальным стандартам (Google, Яндекс, Telegram). - -**Ключевые принципы:** -1. ✅ Анонимный QR без привязки к пользователю -2. ✅ Требование авторизации на подтверждающем устройстве -3. ✅ Явный экран подтверждения с информацией о пользователе -4. ✅ Короткое время жизни кодов (60 сек) -5. ✅ Одноразовое использование -6. ✅ HTTPS + JWT токены - -**Защищает от:** -- ❌ Перехвата QR -- ❌ MITM атак -- ❌ Replay атак -- ❌ Session Fixation -- ❌ Несанкционированного доступа - ---- - -_Документ обновлён: 10 ноября 2025 г._ diff --git a/README.md b/README.md index 65f407a..8d52d50 100644 --- a/README.md +++ b/README.md @@ -1,867 +1,627 @@ -# 🚀 Ospabhost 8.1 +# 🚀 Ospabhost 8.1 - S3 Object Storage Platform -Современная платформа хостинга с поддержкой VPS, S3-хранилищ и системой блогов. +Modern S3-compatible object storage management platform with billing, blog, and support ticketing system. -## 📋 Содержание +![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) -- [О проекте](#о-проекте) -- [Возможности](#возможности) -- [Архитектура](#архитектура) -- [Технологии](#технологии) -- [Быстрый старт](#быстрый-старт) -- [Развёртывание](#развёртывание) -- [API документация](#api-документация) -- [Структура проекта](#структура-проекта) -- [Разработка](#разработка) -- [Вклад в проект](#вклад-в-проект) +[🇷🇺 Русская версия](README_ru.md) --- -## 🎯 О проекте +## 📋 Table of Contents -**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** - полнофункциональная панель администратора +- [About](#about) +- [Features](#features) +- [Tech Stack](#tech-stack) +- [Quick Start](#quick-start) +- [Deployment](#deployment) +- [Project Structure](#project-structure) +- [API Documentation](#api-documentation) +- [Contributing](#contributing) --- -## 🌟 Возможности +## 🎯 About -### Для пользователей +**Ospabhost 8.1** is a comprehensive S3-compatible object storage management platform built on MinIO, featuring: -- **VPS серверы** - - Создание серверов с выбором ОС и тарифа - - Управление (старт/стоп/рестарт/удаление) - - Смена root-пароля - - Изменение ресурсов (resize) - - Создание и восстановление снапшотов - - Мониторинг статуса и статистики - -- **S3 хранилища** - - Создание бакетов с выбором региона и класса хранения - - Кастомный тариф с оплатой за GB - - Загрузка/скачивание файлов - - Управление публичным доступом - - Версионирование объектов - - Presigned URL для временного доступа - - Web-консоль для управления - -- **Блог** - - Чтение статей и комментирование - - Просмотр статей по URL-адресу - - Счётчик просмотров - -- **Тикеты** - - Создание обращений в поддержку - - Переписка с операторами - - Загрузка скриншотов - - Отслеживание статуса - -- **Баланс** - - Пополнение через загрузку чека - - История транзакций - - Автоматическая проверка чеков администратором - -### Для операторов - -- Просмотр и ответ на тикеты -- Автоматическое назначение новых тикетов -- Авто-снятие с тикета при закрытии пользователем - -### Для администраторов - -- **Управление пользователями** - - Просмотр всех пользователей - - Редактирование баланса - - Назначение роли оператора - - Блокировка/разблокировка - -- **Управление тарифами** - - Редактирование цен на VPS - - Настройка S3 тарифов - - Управление кастомным тарифом (цена за GB, трафик, операции) - -- **Управление блогом** - - Создание/редактирование статей - - Rich Text редактор с загрузкой изображений - - Модерация комментариев - - Управление статусами (черновик/опубликовано/архив) - -- **Проверка чеков** - - Одобрение/отклонение заявок на пополнение - - Просмотр загруженных чеков - -- **Тестирование** - - Отправка push-уведомлений - - Отправка email-уведомлений - - Логирование результатов +- 💾 **S3 Object Storage** - Full-featured MinIO-based storage with AWS S3 compatibility +- 📝 **Blog CMS** - Built-in content management system with Rich Text editor +- 🎫 **Support Tickets** - Priority-based ticketing system with attachments +- 💰 **Billing** - Balance management with check verification +- 🔐 **Authentication** - JWT + OAuth (Google, GitHub, Yandex) + QR auth +- 🔔 **Notifications** - Web Push and email notifications +- 🌓 **Dark Theme** - Automatic dark mode with system preference detection +- 📊 **Admin Panel** - Complete administration dashboard --- -## 🏗️ Архитектура +## 🌟 Features -### Монорепозиторий +### For Users -Проект состоит из двух основных частей: +#### S3 Object Storage +- **Bucket Management** + - Create buckets with region selection + - Custom pricing plans (per GB, bandwidth, requests) + - Public/private access control + - Object versioning + - Presigned URLs for temporary access + +- **Multiple File Upload Methods** + - Drag & Drop interface + - Multiple file selection + - Folder upload with structure preservation (webkitdirectory) + - Upload from URI/URL + - Real-time progress tracking (percentage, speed in MB/s) + - Upload cancellation + +- **MinIO Console Access** + - One-click console credentials (generated weekly) + - Direct bucket management through MinIO UI + - Advanced S3 operations -``` -ospabhost/ -├── backend/ # Express + TypeScript + Prisma -└── frontend/ # React + Vite + TypeScript -``` +#### Blog +- Read articles and comment +- URL-based article access +- View counters +- RSS feed support -### Backend модули +#### Support Tickets +- Create tickets with priority (low/normal/high/urgent) and category +- File attachments (up to 5 files, 10MB each) +- Real-time messaging with operators +- Status tracking: open → in_progress → awaiting_reply → resolved → closed +- Ticket history -``` -backend/src/modules/ -├── auth/ # Авторизация и JWT -├── server/ # VPS управление (Proxmox) -├── storage/ # S3 хранилища (MinIO) -├── blog/ # Система блогов -├── ticket/ # Тикеты поддержки -├── check/ # Проверка чеков -├── notification/ # Уведомления -├── tariff/ # Тарифы -├── os/ # Операционные системы -└── admin/ # Админ панель -``` +#### Account & Security +- Balance management with check uploads +- Active session management (IP, device, browser tracking) +- Login history +- QR authentication (Telegram Web style) +- Individual session termination -### База данных +### For Operators +- View and respond to tickets +- Automatic ticket assignment +- Priority and status management +- Internal notes (invisible to users) -Используется **MySQL** с ORM **Prisma**: +### For Administrators +- **User Management** + - View all users + - Edit balance + - Assign operator role + - Block/unblock accounts -- `User` - пользователи с ролями -- `Server` - VPS серверы с привязкой к Proxmox -- `Tariff` - тарифные планы -- `OS` - операционные системы -- `StoragePlan` - тарифы S3 (с полями pricePerGb, bandwidthPerGb, requestsPerGb) -- `StorageBucket` - S3 бакеты пользователей -- `Post` - статьи блога -- `Comment` - комментарии к статьям -- `Ticket` - тикеты поддержки -- `TicketMessage` - сообщения в тикетах -- `Check` - чеки для пополнения -- `Notification` - уведомления пользователей +- **Pricing Management** + - Configure S3 storage plans + - Custom pricing (per GB, bandwidth, API requests) + - Tariff categories + +- **Blog Management** + - Create/edit articles with Quill.js editor + - Image uploads + - Comment moderation + - SEO settings + +- **Check Verification** + - Approve/reject balance top-up requests + - View uploaded receipts + +- **Testing Tools** + - Send test push notifications + - Send test emails + - Log monitoring --- -## 🛠️ Технологии +## 🛠️ Tech Stack ### Backend - -- **Node.js 18+** -- **Express.js** - веб-фреймворк -- **TypeScript** - типизация -- **Prisma ORM** - работа с БД -- **MySQL** - база данных -- **JWT** - авторизация -- **Multer** - загрузка файлов -- **Axios** - HTTP клиент для Proxmox API -- **bcrypt** - хеширование паролей -- **MinIO SDK** - работа с S3 +- **Node.js 24+** with Express.js +- **TypeScript 5.x** for type safety +- **Prisma ORM** with MySQL 8+ +- **MinIO SDK** for S3 operations +- **JWT** + **Passport.js** for authentication +- **Multer** for file uploads +- **web-push** for notifications +- **Nodemailer** for emails +- **PM2** for process management ### Frontend +- **React 18** with TypeScript +- **Vite 7.x** for fast builds +- **React Router 6** for navigation +- **Tailwind CSS 3.3** for styling +- **React Quill** for rich text editing +- **Axios** for API calls +- **i18next** for localization (en/ru) +- **Service Worker** for push notifications -- **React 18** - UI библиотека -- **TypeScript** - типизация -- **Vite** - сборщик -- **React Router** - маршрутизация -- **Tailwind CSS** - стилизация -- **React Icons** - иконки -- **React Quill** - Rich Text редактор -- **Axios** - HTTP клиент - -### DevOps - -- **PM2** - процесс-менеджер -- **Nginx** - веб-сервер и прокси -- **Git** - контроль версий +### Infrastructure +- **MySQL 8+** database +- **MinIO** S3-compatible storage +- **Nginx** reverse proxy +- **PM2** process manager +- **Git** (Gitea + GitHub) +- **Let's Encrypt** SSL --- -## 🚀 Быстрый старт +## 🚀 Quick Start -### Требования - -- Node.js 18+ +### Prerequisites +- Node.js 24+ - MySQL 8+ -- Proxmox VE (для VPS) -- MinIO (для S3) +- MinIO server -### Установка - -1. **Клонирование репозитория** +### Installation +1. **Clone Repository** ```bash -git clone https://github.com/Ospab/ospabhost8.1.git -cd ospabhost8.1/ospabhost +git clone http://localhost:4000/ospab/ospab.host.git +cd ospab.host/ospabhost ``` -2. **Настройка Backend** - +2. **Backend Setup** ```bash cd backend npm install -``` -Создайте `.env`: +# Copy and configure environment +cp .env.example .env +# Edit .env with your settings -```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" -``` - -Примените миграции: - -```bash +# Database setup npx prisma migrate deploy npx prisma generate npx prisma db seed + +# Start development server +npm run dev ``` -Запустите: - -```bash -npm run dev # Разработка -npm run build && npm start # Продакшн -``` - -3. **Настройка Frontend** - +3. **Frontend Setup** ```bash cd ../frontend npm install + +# Copy and configure environment +cp .env.example .env +# Edit .env with your API URL + +# Start development server +npm run dev ``` -Создайте `.env`: - -```env -VITE_API_URL=http://localhost:5000 -``` - -Запустите: - -```bash -npm run dev # Разработка -npm run build # Сборка для продакшн -``` - -4. **Доступ** - +4. **Access Application** - Frontend: http://localhost:5173 - Backend API: http://localhost:5000 -- Панель управления: http://localhost:5173/dashboard +- Dashboard: http://localhost:5173/dashboard -Первый пользователь автоматически становится администратором. +First registered user automatically becomes administrator. --- -## 🌐 Развёртывание +## 🌐 Deployment -### На сервере - -1. **Подготовка окружения** +### Production Setup +1. **Install Dependencies** ```bash -# Установка Node.js 18 -curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - +# Node.js 24 +curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - sudo apt-get install -y nodejs -# Установка MySQL -sudo apt install mysql-server +# MySQL and Nginx +sudo apt install mysql-server nginx -# Установка PM2 +# PM2 sudo npm install -g pm2 - -# Установка Nginx -sudo apt install nginx ``` -2. **Клонирование и настройка** - +2. **Backend Deployment** ```bash -cd /var/www -git clone https://github.com/Ospab/ospabhost8.1.git ospab-host -cd ospab-host/ospabhost -``` +cd /var/www/ospab.host/ospabhost/backend -3. **Backend** - -```bash -cd backend npm install cp .env.example .env -# Отредактируйте .env +# Configure .env +# Create upload directories +mkdir -p uploads/{checks,blog,tickets} +chmod 755 uploads/* + +# Database migrations npx prisma migrate deploy npx prisma generate -npm run build -pm2 start dist/index.js --name ospab-backend +# Build and start +npm run build +pm2 start ecosystem.config.js pm2 save pm2 startup ``` -4. **Frontend** - +3. **Frontend Build** ```bash cd ../frontend npm install -cp .env.example .env -# Отредактируйте .env - npm run build ``` -5. **Nginx** - +4. **Nginx Configuration** ```nginx server { listen 80; - server_name your-domain.com; + server_name ospab.host; # Frontend location / { - root /var/www/ospab-host/ospabhost/frontend/dist; + 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; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } - # Uploads (чеки, изображения блога) - location /uploads { - alias /var/www/ospab-host/ospabhost/backend/uploads; - access_log off; - expires 30d; + # WebSocket + location /ws { + proxy_pass http://localhost:5000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; } + + # Static uploads + 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 Certificate** ```bash -sudo nginx -t +sudo certbot --nginx -d ospab.host -d api.ospab.host +``` + +### Update Deployment +```bash +cd /var/www/ospab.host/ospabhost + +# Pull latest changes +git pull + +# Backend update +cd backend +npm install +npx prisma generate +npm run build +pm2 restart all + +# Frontend update +cd ../frontend +npm install +npm run build + +# Reload Nginx sudo systemctl reload nginx ``` -6. **SSL (Let's Encrypt)** - -```bash -sudo apt install certbot python3-certbot-nginx -sudo certbot --nginx -d your-domain.com -``` - -### Развёртывание блога - -См. подробную инструкцию в [BLOG_DEPLOYMENT.md](./BLOG_DEPLOYMENT.md) и быстрый старт в [BLOG_QUICKSTART.md](./BLOG_QUICKSTART.md). - --- -## 📚 API документация - -### Публичные эндпоинты - -#### Авторизация - -```http -POST /api/auth/register -Content-Type: application/json - -{ - "username": "user", - "email": "user@example.com", - "password": "password" -} -``` - -```http -POST /api/auth/login -Content-Type: application/json - -{ - "email": "user@example.com", - "password": "password" -} -``` - -#### Блог - -```http -GET /api/blog/posts -# Список опубликованных статей - -GET /api/blog/posts/:url -# Статья по URL - -POST /api/blog/posts/:postId/comments -# Добавить комментарий (требуется авторизация или имя гостя) -``` - -#### S3 Storage - -```http -GET /api/storage/plans -# Список тарифов - -POST /api/storage/checkout -# Создать корзину для оплаты -``` - -### Защищённые эндпоинты - -Все запросы требуют заголовок: -``` -Authorization: Bearer YOUR_JWT_TOKEN -``` - -#### Серверы (VPS) - -```http -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 - -```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/presign -# Создать presigned URL - -DELETE /api/storage/buckets/:id/objects -# Удалить объекты - -POST /api/storage/buckets/:id/console-credentials -# Создать учётные данные для web-консоли -``` - -#### Тикеты - -```http -GET /api/tickets -# Список тикетов - -POST /api/tickets -# Создать тикет - -GET /api/tickets/:id -# Информация о тикете - -POST /api/tickets/:id/messages -# Отправить сообщение - -PATCH /api/tickets/:id/close -# Закрыть тикет -``` - -#### Администратор - -```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 -# Редактировать тариф S3 (включая pricePerGb, bandwidthPerGb, requestsPerGb) - -POST /api/admin/test/push-notification -# Тест push-уведомлений - -POST /api/admin/test/email-notification -# Тест email-уведомлений -``` - ---- - -## 📁 Структура проекта +## 📁 Project Structure ``` -ospabhost8.1/ +ospab.host/ ├── 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 +│ │ │ │ ├── auth/ # Authentication (JWT, OAuth, QR) +│ │ │ │ ├── storage/ # S3 Storage (MinIO) +│ │ │ │ ├── blog/ # Blog CMS +│ │ │ │ ├── ticket/ # Support tickets +│ │ │ │ ├── check/ # Payment checks +│ │ │ │ ├── notification/ # Push & Email +│ │ │ │ ├── tariff/ # Pricing plans +│ │ │ │ ├── session/ # Session management +│ │ │ │ └── admin/ # Admin panel +│ │ │ ├── middleware/ # Express middleware +│ │ │ ├── prisma/ # Prisma client +│ │ │ ├── routes/ # Route definitions +│ │ │ ├── utils/ # Utilities +│ │ │ ├── websocket/ # WebSocket server +│ │ │ ├── index.ts # Main entry point +│ │ │ └── server.ts # Express server │ │ ├── prisma/ -│ │ │ ├── schema.prisma -│ │ │ ├── migrations/ -│ │ │ ├── seed.ts -│ │ │ └── seed_os.ts -│ │ ├── uploads/ -│ │ │ ├── checks/ -│ │ │ └── blog/ +│ │ │ ├── schema.prisma # Database schema +│ │ │ ├── migrations/ # DB migrations +│ │ │ └── seed.ts # Seed data +│ │ ├── uploads/ # User uploads │ │ ├── package.json -│ │ └── tsconfig.json +│ │ ├── tsconfig.json +│ │ └── ecosystem.config.js # PM2 config │ │ │ └── frontend/ │ ├── src/ │ │ ├── pages/ -│ │ │ ├── index.tsx -│ │ │ ├── login.tsx -│ │ │ ├── pricing.tsx -│ │ │ ├── blog.tsx -│ │ │ ├── blogpost.tsx +│ │ │ ├── index.tsx # Homepage +│ │ │ ├── login.tsx # Login +│ │ │ ├── register.tsx # Registration +│ │ │ ├── pricing.tsx # Pricing plans +│ │ │ ├── blog.tsx # Blog list +│ │ │ ├── blogpost.tsx # Blog post │ │ │ └── dashboard/ -│ │ │ ├── mainpage.tsx -│ │ │ ├── servers.tsx -│ │ │ ├── storage.tsx -│ │ │ ├── tickets.tsx -│ │ │ ├── balance.tsx -│ │ │ ├── admin.tsx -│ │ │ └── blogadmin.tsx +│ │ │ ├── mainpage.tsx # Dashboard main +│ │ │ ├── summary.tsx # Overview +│ │ │ ├── storage.tsx # Storage buckets +│ │ │ ├── storage-bucket.tsx # Bucket management +│ │ │ ├── tickets/ # Ticket system +│ │ │ ├── billing.tsx # Balance +│ │ │ ├── settings.tsx # Settings +│ │ │ ├── notifications.tsx # Notifications +│ │ │ ├── admin.tsx # Admin panel +│ │ │ ├── blogadmin.tsx # Blog admin +│ │ │ └── blogeditor.tsx # Post editor │ │ ├── components/ -│ │ │ ├── Navbar.tsx -│ │ │ ├── Footer.tsx -│ │ │ ├── AdminPricingTab.tsx -│ │ │ └── AdminTestingTab.tsx +│ │ │ ├── header.tsx # Site header +│ │ │ ├── footer.tsx # Site footer +│ │ │ └── PrivateRoute.tsx # Protected routes │ │ ├── context/ -│ │ │ └── authcontext.tsx -│ │ ├── hooks/ -│ │ │ ├── useAuth.ts -│ │ │ └── useToast.ts -│ │ ├── utils/ -│ │ │ └── apiClient.ts -│ │ ├── config/ -│ │ │ └── api.ts +│ │ │ ├── authcontext.tsx # Auth state +│ │ │ └── ThemeContext.tsx # Theme state +│ │ ├── services/ +│ │ │ └── apiClient.ts # Axios client +│ │ ├── i18n/ # Localization │ │ ├── App.tsx │ │ └── main.tsx +│ ├── public/ +│ │ ├── service-worker.js # Push notifications +│ │ └── robots.txt │ ├── package.json │ ├── vite.config.ts │ └── tailwind.config.js │ -├── README.md -├── CONTRIBUTING.md -├── BLOG_DEPLOYMENT.md -└── BLOG_QUICKSTART.md +├── README.md # This file (English) +└── README_ru.md # Russian version ``` --- -## 💻 Разработка +## 📚 API Documentation -### Установка зависимостей +### Public Endpoints -```bash -# Backend -cd ospabhost/backend -npm install - -# Frontend -cd ospabhost/frontend -npm install +#### Authentication +```http +POST /api/auth/register +POST /api/auth/login +GET /api/auth/google +GET /api/auth/github +GET /api/auth/yandex ``` -### Запуск в режиме разработки +#### QR Authentication +```http +POST /api/qr-auth/generate # Generate QR code +GET /api/qr-auth/status/:code # Check status (polling) +POST /api/qr-auth/confirm # Confirm login (mobile) +``` + +#### Blog +```http +GET /api/blog/posts # List posts +GET /api/blog/posts/:url # Get post by URL +POST /api/blog/posts/:id/comments # Add comment +``` + +#### Storage Plans +```http +GET /api/storage/plans # List pricing plans +``` + +### Protected Endpoints + +All requests require: `Authorization: Bearer ` + +#### S3 Storage +```http +GET /api/storage/buckets # List buckets +POST /api/storage/buckets # Create bucket +GET /api/storage/buckets/:id # Get bucket info +DELETE /api/storage/buckets/:id # Delete bucket +PUT /api/storage/buckets/:id # Update settings + +GET /api/storage/buckets/:id/objects # List objects +POST /api/storage/buckets/:id/upload # Upload file +POST /api/storage/buckets/:id/upload-from-uri # Upload from URL +POST /api/storage/buckets/:id/upload-directory # Upload folder +DELETE /api/storage/buckets/:id/objects # Delete objects + +POST /api/storage/buckets/:id/presign # Generate presigned URL +POST /api/storage/buckets/:id/console-credentials # Get console access +``` + +#### Support Tickets +```http +GET /api/tickets # List user tickets +POST /api/tickets # Create ticket +GET /api/tickets/:id # Get ticket details +POST /api/tickets/:id/messages # Send message +PATCH /api/tickets/:id/status # Update status (operators) +POST /api/tickets/:id/assign # Assign operator +PATCH /api/tickets/:id/close # Close ticket +``` + +#### Session Management +```http +GET /api/sessions # List active sessions +GET /api/sessions/history # Login history +DELETE /api/sessions/:id # Terminate session +DELETE /api/sessions/others/all # Terminate all other sessions +``` + +#### Admin Endpoints +```http +GET /api/admin/users # List all users +PUT /api/admin/users/:id # Edit user + +GET /api/admin/checks # List payment checks +PUT /api/admin/checks/:id # Approve/reject check + +GET /api/blog/admin/posts # List all posts +POST /api/blog/admin/posts # Create post +PUT /api/blog/admin/posts/:id # Update post +DELETE /api/blog/admin/posts/:id # Delete post +POST /api/blog/admin/upload-image # Upload image + +GET /api/blog/admin/comments # List all comments +PATCH /api/blog/admin/comments/:id # Moderate comment +DELETE /api/blog/admin/comments/:id # Delete comment + +PUT /api/storage/plans/:id # Update pricing plan + +POST /api/admin/test/push-notification # Test push +POST /api/admin/test/email-notification # Test email +``` + +--- + +## 🐛 Troubleshooting + +### Backend Issues + +**Prisma Client missing models** +```bash +cd backend +npx prisma generate +npm run build +pm2 restart all +``` + +**OAuth returns 404** +- Check `.env` for `GOOGLE_CLIENT_ID`, `GITHUB_CLIENT_ID`, `YANDEX_CLIENT_ID` +- Verify `oauthRoutes` is imported in `index.ts` +- Restart server + +**Push notifications not working** +- Verify VAPID keys in `.env` +- Ensure `service-worker.js` is registered +- Use HTTPS in production + +### Frontend Issues + +**Session not persisting** +- Ensure `login()` in `authcontext.tsx` uses async/await +- Verify JWT token is saved to localStorage +- Check `bootstrapSession()` is called after login + +**Dark theme not applying** +- Verify `ThemeProvider` wraps `App` +- Check `tailwind.config.js` has `darkMode: 'class'` +- Ensure components use `dark:` classes + +**File upload fails** +- Check directory permissions: `chmod 755 uploads/*` +- Verify Nginx serves `/uploads` +- Check Nginx `client_max_body_size 50M;` + +### S3 Storage Issues + +**Cannot create bucket** +- Verify MinIO connection +- Check MinIO credentials in `.env` +- Ensure user has sufficient balance + +**Console credentials don't work** +- Credentials are valid for 7 days +- Generate new credentials from dashboard +- Verify MinIO endpoint is accessible + +--- + +## 🤝 Contributing + +We welcome contributions! Please follow these steps: + +1. Fork the repository +2. Create a feature branch: `git checkout -b feature/AmazingFeature` +3. Commit changes: `git commit -m 'feat: add amazing feature'` +4. Push to branch: `git push origin feature/AmazingFeature` +5. Open a Pull Request + +### Commit Convention + +We use [Conventional Commits](https://www.conventionalcommits.org/): ```bash -# Backend (порт 5000) +feat(storage): add folder upload support +fix(ticket): auto-unassign on close +docs: update API documentation +refactor(auth): improve error handling +``` + +### Development Workflow + +```bash +# Backend development cd backend npm run dev -# Frontend (порт 5173) +# Frontend development cd frontend npm run dev -``` -### Линтинг и форматирование - -```bash -# Frontend -npm run lint -``` - -### Работа с БД - -```bash -# Создать миграцию +# Database migrations 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 -``` - -### Сборка - -```bash -# Backend -npm run build - -# Frontend -npm run build -npm run preview # Предпросмотр production сборки -``` - ---- - -## 🐛 Известные проблемы и решения - -### Backend - -**Проблема:** "post and comment are not properties of PrismaClient" - -**Решение:** -```bash -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 редактор не загружается - -**Решение:** -```bash -cd frontend -npm install react-quill quill --legacy-peer-deps +# Build for production npm run build ``` -**Проблема:** Не могу изменить цену за GB в кастомном тарифе +--- -**Решение:** -- UI уже реализован в `AdminPricingTab.tsx` -- Backend должен возвращать эти поля через `serializePlan` -- Перезапустите оба сервиса +## 📄 License -### S3 Storage - -**Проблема:** Изображения не загружаются - -**Проверьте:** -1. Права на директорию `backend/uploads/blog` (должно быть `755`) -2. Nginx раздаёт `/uploads/blog` -3. В логах backend нет ошибок multer - -```bash -# Проверка прав -ls -la /var/www/ospab-host/ospabhost/backend/uploads/blog - -# Проверка логов -pm2 logs ospab-backend --lines 50 -``` +MIT License --- -## 🤝 Вклад в проект +## 📞 Contact -Мы приветствуем вклад в развитие проекта! См. [CONTRIBUTING.md](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](https://www.conventionalcommits.org/): - -```bash -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 -``` +- **Website:** [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 --- -## 📄 Лицензия +## 🙏 Acknowledgments -Этот проект является частной разработкой. Все права защищены. +- [MinIO](https://min.io/) - S3-compatible object storage +- [Prisma](https://www.prisma.io/) - Next-generation ORM +- [React](https://react.dev/) - UI library +- [Tailwind CSS](https://tailwindcss.com/) - CSS framework +- [Quill](https://quilljs.com/) - Rich text editor +- [Passport.js](https://www.passportjs.org/) - Authentication middleware --- -## 👥 Команда - -- **Ospab** - Основатель и главный разработчик - ---- - -## 📞 Контакты - -- Website: [ospab.host](https://ospab.host) -- Email: support@ospab.host -- Telegram: [@ospab](https://t.me/ospab) - ---- - -## 🙏 Благодарности - -- [Proxmox VE](https://www.proxmox.com/) - виртуализация -- [MinIO](https://min.io/) - S3-совместимое хранилище -- [Prisma](https://www.prisma.io/) - ORM для Node.js -- [React](https://react.dev/) - UI библиотека -- [Tailwind CSS](https://tailwindcss.com/) - CSS фреймворк -- [Quill](https://quilljs.com/) - Rich Text редактор - ---- - -**Версия:** 8.1 -**Последнее обновление:** 26 ноября 2025 +**Version:** 8.1 +**Updated:** January 5, 2026 +**Git:** ospab diff --git a/README_ru.md b/README_ru.md new file mode 100644 index 0000000..a913bbb --- /dev/null +++ b/README_ru.md @@ -0,0 +1,627 @@ +# 🚀 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 diff --git a/TARIFF_CATEGORIES_SETUP.md b/TARIFF_CATEGORIES_SETUP.md deleted file mode 100644 index 17b6724..0000000 --- a/TARIFF_CATEGORIES_SETUP.md +++ /dev/null @@ -1,162 +0,0 @@ -# Инструкция по добавлению категорий тарифов - -## ⚠️ ВАЖНО: Выберите один из вариантов миграции - -### Вариант 1: Безопасная миграция (рекомендуется) -Сохраняет существующие серверы и тарифы, добавляет новые тарифы. - -**Файл:** `backend/prisma/safe_tariff_migration.sql` - -### Вариант 2: Полная очистка (только для разработки!) -Удаляет ВСЕ серверы, платежи и тарифы. Начинает с чистого листа. - -**Файл:** `backend/prisma/clean_slate_migration.sql` - ---- - -## 📋 Порядок действий (Вариант 1 - Безопасная миграция): - -### 1. Подключитесь к MySQL - -```bash -mysql -u root -p ospabhost -``` - -Или через phpMyAdmin / Adminer / другой клиент БД. - -### 2. Проверьте текущее состояние - -```sql --- Посмотрите, какие тарифы используются -SELECT - t.id, - t.name, - COUNT(s.id) as servers_count -FROM `tariff` t -LEFT JOIN `server` s ON s.tariffId = t.id -GROUP BY t.id, t.name; -``` - -### 3. Примените безопасную миграцию - -```bash -source backend/prisma/safe_tariff_migration.sql -``` - -Или скопируйте и выполните вручную. - -**Этот скрипт:** -- ✅ Добавит поле `category` в таблицу `tariff` -- ✅ Обновит существующие тарифы (присвоит им `category = 'vps'`) -- ✅ Удалит только неиспользуемые тарифы -- ✅ Добавит 17 новых тарифов с категориями - -### 4. Проверьте результат - -```sql -SELECT * FROM `tariff` ORDER BY `category`, `price`; -``` - ---- - -## 🔥 Порядок действий (Вариант 2 - Полная очистка): - -### ⚠️ ВНИМАНИЕ! Это удалит ВСЕ данные о серверах! - -Используйте только если: -- Это тестовая/dev среда -- Вы хотите начать с чистого листа -- У вас есть резервная копия БД - -### 1. Сделайте резервную копию! - -```bash -mysqldump -u root -p ospabhost > backup_before_migration.sql -``` - -### 2. Примените миграцию - -```bash -mysql -u root -p ospabhost < backend/prisma/clean_slate_migration.sql -``` - -**Этот скрипт:** -- ❌ Удалит все метрики серверов -- ❌ Удалит все платежи -- ❌ Удалит все серверы -- ❌ Удалит все тарифы -- ✅ Добавит поле `category` -- ✅ Добавит 17 новых тарифов - -### 3. Сбросьте Prisma клиент (опционально) - -```bash -cd backend -npx prisma generate -``` - ---- - -## 📝 Новые тарифы (17 шт): - -### VPS/VDS (6 тарифов): - -```bash -cd backend -npm start -# или -node dist/src/index.js -``` - -## 🎨 Что изменилось на frontend: - -### Новая страница тарифов: -- ✅ **3 категории**: VPS/VDS, Хостинг, S3 Хранилище -- ✅ **Вкладки** для переключения между категориями -- ✅ **Иконки** для каждой категории -- ✅ **Карточки** с галочками для списка функций -- ✅ **Hero секция** с описанием -- ✅ **Секция преимуществ** внизу -- ✅ **CTA секция** с призывом к действию - -### Дизайн: -- Современный многосекционный layout -- Sticky-табы для удобной навигации -- Hover-эффекты на карточках -- Градиентные фоны для Hero и CTA секций -- Адаптивный дизайн для всех устройств - -## 📦 Размеры после сборки: - -- **index.html**: 6.71 kB (gzip: 2.46 kB) -- **CSS**: 66.64 kB (gzip: 10.64 kB) -- **JS main**: 938.19 kB (gzip: 237.62 kB) -- **React vendor**: 173.20 kB (gzip: 57.00 kB) -- **UI vendor**: 17.26 kB (gzip: 5.99 kB) - -## 🔧 Изменённые файлы: - -### Backend: -- ✅ `backend/prisma/schema.prisma` - добавлено поле `category` -- ✅ `backend/prisma/manual_migration_category.sql` - миграция БД -- ✅ `backend/prisma/add_tariff_categories.sql` - новые тарифы - -### Frontend: -- ✅ `frontend/src/pages/tariffs.tsx` - полностью переделана страница - -## 📝 Примечания: - -1. **Старые тарифы** не удаляются автоматически. Если нужно их удалить: - ```sql - DELETE FROM `tariff` WHERE `category` IS NULL; - ``` - -2. **Category enum**: Доступные значения - `vps`, `hosting`, `s3` - -3. **API**: Backend автоматически вернёт поле `category` в ответе `/api/tariff` - -4. **Фильтрация**: Frontend фильтрует тарифы по категории на клиентской стороне - -## 🚀 Готово к деплою! - -После применения SQL и перезапуска backend всё будет работать. diff --git a/node_modules/@pkgjs/parseargs/CHANGELOG.md b/node_modules/@pkgjs/parseargs/CHANGELOG.md deleted file mode 100644 index 2adc7d3..0000000 --- a/node_modules/@pkgjs/parseargs/CHANGELOG.md +++ /dev/null @@ -1,147 +0,0 @@ -# Changelog - -## [0.11.0](https://github.com/pkgjs/parseargs/compare/v0.10.0...v0.11.0) (2022-10-08) - - -### Features - -* add `default` option parameter ([#142](https://github.com/pkgjs/parseargs/issues/142)) ([cd20847](https://github.com/pkgjs/parseargs/commit/cd20847a00b2f556aa9c085ac83b942c60868ec1)) - -## [0.10.0](https://github.com/pkgjs/parseargs/compare/v0.9.1...v0.10.0) (2022-07-21) - - -### Features - -* add parsed meta-data to returned properties ([#129](https://github.com/pkgjs/parseargs/issues/129)) ([91bfb4d](https://github.com/pkgjs/parseargs/commit/91bfb4d3f7b6937efab1b27c91c45d1205f1497e)) - -## [0.9.1](https://github.com/pkgjs/parseargs/compare/v0.9.0...v0.9.1) (2022-06-20) - - -### Bug Fixes - -* **runtime:** support node 14+ ([#135](https://github.com/pkgjs/parseargs/issues/135)) ([6a1c5a6](https://github.com/pkgjs/parseargs/commit/6a1c5a6f7cadf2f035e004027e2742e3c4ce554b)) - -## [0.9.0](https://github.com/pkgjs/parseargs/compare/v0.8.0...v0.9.0) (2022-05-23) - - -### ⚠ BREAKING CHANGES - -* drop handling of electron arguments (#121) - -### Code Refactoring - -* drop handling of electron arguments ([#121](https://github.com/pkgjs/parseargs/issues/121)) ([a2ffd53](https://github.com/pkgjs/parseargs/commit/a2ffd537c244a062371522b955acb45a404fc9f2)) - -## [0.8.0](https://github.com/pkgjs/parseargs/compare/v0.7.1...v0.8.0) (2022-05-16) - - -### ⚠ BREAKING CHANGES - -* switch type:string option arguments to greedy, but with error for suspect cases in strict mode (#88) -* positionals now opt-in when strict:true (#116) -* create result.values with null prototype (#111) - -### Features - -* create result.values with null prototype ([#111](https://github.com/pkgjs/parseargs/issues/111)) ([9d539c3](https://github.com/pkgjs/parseargs/commit/9d539c3d57f269c160e74e0656ad4fa84ff92ec2)) -* positionals now opt-in when strict:true ([#116](https://github.com/pkgjs/parseargs/issues/116)) ([3643338](https://github.com/pkgjs/parseargs/commit/364333826b746e8a7dc5505b4b22fd19ac51df3b)) -* switch type:string option arguments to greedy, but with error for suspect cases in strict mode ([#88](https://github.com/pkgjs/parseargs/issues/88)) ([c2b5e72](https://github.com/pkgjs/parseargs/commit/c2b5e72161991dfdc535909f1327cc9b970fe7e8)) - -### [0.7.1](https://github.com/pkgjs/parseargs/compare/v0.7.0...v0.7.1) (2022-04-15) - - -### Bug Fixes - -* resist pollution ([#106](https://github.com/pkgjs/parseargs/issues/106)) ([ecf2dec](https://github.com/pkgjs/parseargs/commit/ecf2dece0a9f2a76d789384d5d71c68ffe64022a)) - -## [0.7.0](https://github.com/pkgjs/parseargs/compare/v0.6.0...v0.7.0) (2022-04-13) - - -### Features - -* Add strict mode to parser ([#74](https://github.com/pkgjs/parseargs/issues/74)) ([8267d02](https://github.com/pkgjs/parseargs/commit/8267d02083a87b8b8a71fcce08348d1e031ea91c)) - -## [0.6.0](https://github.com/pkgjs/parseargs/compare/v0.5.0...v0.6.0) (2022-04-11) - - -### ⚠ BREAKING CHANGES - -* rework results to remove redundant `flags` property and store value true for boolean options (#83) -* switch to existing ERR_INVALID_ARG_VALUE (#97) - -### Code Refactoring - -* rework results to remove redundant `flags` property and store value true for boolean options ([#83](https://github.com/pkgjs/parseargs/issues/83)) ([be153db](https://github.com/pkgjs/parseargs/commit/be153dbed1d488cb7b6e27df92f601ba7337713d)) -* switch to existing ERR_INVALID_ARG_VALUE ([#97](https://github.com/pkgjs/parseargs/issues/97)) ([084a23f](https://github.com/pkgjs/parseargs/commit/084a23f9fde2da030b159edb1c2385f24579ce40)) - -## [0.5.0](https://github.com/pkgjs/parseargs/compare/v0.4.0...v0.5.0) (2022-04-10) - - -### ⚠ BREAKING CHANGES - -* Require type to be specified for each supplied option (#95) - -### Features - -* Require type to be specified for each supplied option ([#95](https://github.com/pkgjs/parseargs/issues/95)) ([02cd018](https://github.com/pkgjs/parseargs/commit/02cd01885b8aaa59f2db8308f2d4479e64340068)) - -## [0.4.0](https://github.com/pkgjs/parseargs/compare/v0.3.0...v0.4.0) (2022-03-12) - - -### ⚠ BREAKING CHANGES - -* parsing, revisit short option groups, add support for combined short and value (#75) -* restructure configuration to take options bag (#63) - -### Code Refactoring - -* parsing, revisit short option groups, add support for combined short and value ([#75](https://github.com/pkgjs/parseargs/issues/75)) ([a92600f](https://github.com/pkgjs/parseargs/commit/a92600fa6c214508ab1e016fa55879a314f541af)) -* restructure configuration to take options bag ([#63](https://github.com/pkgjs/parseargs/issues/63)) ([b412095](https://github.com/pkgjs/parseargs/commit/b4120957d90e809ee8b607b06e747d3e6a6b213e)) - -## [0.3.0](https://github.com/pkgjs/parseargs/compare/v0.2.0...v0.3.0) (2022-02-06) - - -### Features - -* **parser:** support short-option groups ([#59](https://github.com/pkgjs/parseargs/issues/59)) ([882067b](https://github.com/pkgjs/parseargs/commit/882067bc2d7cbc6b796f8e5a079a99bc99d4e6ba)) - -## [0.2.0](https://github.com/pkgjs/parseargs/compare/v0.1.1...v0.2.0) (2022-02-05) - - -### Features - -* basic support for shorts ([#50](https://github.com/pkgjs/parseargs/issues/50)) ([a2f36d7](https://github.com/pkgjs/parseargs/commit/a2f36d7da4145af1c92f76806b7fe2baf6beeceb)) - - -### Bug Fixes - -* always store value for a=b ([#43](https://github.com/pkgjs/parseargs/issues/43)) ([a85e8dc](https://github.com/pkgjs/parseargs/commit/a85e8dc06379fd2696ee195cc625de8fac6aee42)) -* support single dash as positional ([#49](https://github.com/pkgjs/parseargs/issues/49)) ([d795bf8](https://github.com/pkgjs/parseargs/commit/d795bf877d068fd67aec381f30b30b63f97109ad)) - -### [0.1.1](https://github.com/pkgjs/parseargs/compare/v0.1.0...v0.1.1) (2022-01-25) - - -### Bug Fixes - -* only use arrays in results for multiples ([#42](https://github.com/pkgjs/parseargs/issues/42)) ([c357584](https://github.com/pkgjs/parseargs/commit/c357584847912506319ed34a0840080116f4fd65)) - -## 0.1.0 (2022-01-22) - - -### Features - -* expand scenarios covered by default arguments for environments ([#20](https://github.com/pkgjs/parseargs/issues/20)) ([582ada7](https://github.com/pkgjs/parseargs/commit/582ada7be0eca3a73d6e0bd016e7ace43449fa4c)) -* update readme and include contributing guidelines ([8edd6fc](https://github.com/pkgjs/parseargs/commit/8edd6fc863cd705f6fac732724159ebe8065a2b0)) - - -### Bug Fixes - -* do not strip excess leading dashes on long option names ([#21](https://github.com/pkgjs/parseargs/issues/21)) ([f848590](https://github.com/pkgjs/parseargs/commit/f848590ebf3249ed5979ff47e003fa6e1a8ec5c0)) -* name & readme ([3f057c1](https://github.com/pkgjs/parseargs/commit/3f057c1b158a1bdbe878c64b57460c58e56e465f)) -* package.json values ([9bac300](https://github.com/pkgjs/parseargs/commit/9bac300e00cd76c77076bf9e75e44f8929512da9)) -* update readme name ([957d8d9](https://github.com/pkgjs/parseargs/commit/957d8d96e1dcb48297c0a14345d44c0123b2883e)) - - -### Build System - -* first release as minor ([421c6e2](https://github.com/pkgjs/parseargs/commit/421c6e2569a8668ad14fac5a5af5be60479a7571)) diff --git a/node_modules/accepts/HISTORY.md b/node_modules/accepts/HISTORY.md deleted file mode 100644 index 627a81d..0000000 --- a/node_modules/accepts/HISTORY.md +++ /dev/null @@ -1,250 +0,0 @@ -2.0.0 / 2024-08-31 -================== - - * Drop node <18 support - * deps: mime-types@^3.0.0 - * deps: negotiator@^1.0.0 - -1.3.8 / 2022-02-02 -================== - - * deps: mime-types@~2.1.34 - - deps: mime-db@~1.51.0 - * deps: negotiator@0.6.3 - -1.3.7 / 2019-04-29 -================== - - * deps: negotiator@0.6.2 - - Fix sorting charset, encoding, and language with extra parameters - -1.3.6 / 2019-04-28 -================== - - * deps: mime-types@~2.1.24 - - deps: mime-db@~1.40.0 - -1.3.5 / 2018-02-28 -================== - - * deps: mime-types@~2.1.18 - - deps: mime-db@~1.33.0 - -1.3.4 / 2017-08-22 -================== - - * deps: mime-types@~2.1.16 - - deps: mime-db@~1.29.0 - -1.3.3 / 2016-05-02 -================== - - * deps: mime-types@~2.1.11 - - deps: mime-db@~1.23.0 - * deps: negotiator@0.6.1 - - perf: improve `Accept` parsing speed - - perf: improve `Accept-Charset` parsing speed - - perf: improve `Accept-Encoding` parsing speed - - perf: improve `Accept-Language` parsing speed - -1.3.2 / 2016-03-08 -================== - - * deps: mime-types@~2.1.10 - - Fix extension of `application/dash+xml` - - Update primary extension for `audio/mp4` - - deps: mime-db@~1.22.0 - -1.3.1 / 2016-01-19 -================== - - * deps: mime-types@~2.1.9 - - deps: mime-db@~1.21.0 - -1.3.0 / 2015-09-29 -================== - - * deps: mime-types@~2.1.7 - - deps: mime-db@~1.19.0 - * deps: negotiator@0.6.0 - - Fix including type extensions in parameters in `Accept` parsing - - Fix parsing `Accept` parameters with quoted equals - - Fix parsing `Accept` parameters with quoted semicolons - - Lazy-load modules from main entry point - - perf: delay type concatenation until needed - - perf: enable strict mode - - perf: hoist regular expressions - - perf: remove closures getting spec properties - - perf: remove a closure from media type parsing - - perf: remove property delete from media type parsing - -1.2.13 / 2015-09-06 -=================== - - * deps: mime-types@~2.1.6 - - deps: mime-db@~1.18.0 - -1.2.12 / 2015-07-30 -=================== - - * deps: mime-types@~2.1.4 - - deps: mime-db@~1.16.0 - -1.2.11 / 2015-07-16 -=================== - - * deps: mime-types@~2.1.3 - - deps: mime-db@~1.15.0 - -1.2.10 / 2015-07-01 -=================== - - * deps: mime-types@~2.1.2 - - deps: mime-db@~1.14.0 - -1.2.9 / 2015-06-08 -================== - - * deps: mime-types@~2.1.1 - - perf: fix deopt during mapping - -1.2.8 / 2015-06-07 -================== - - * deps: mime-types@~2.1.0 - - deps: mime-db@~1.13.0 - * perf: avoid argument reassignment & argument slice - * perf: avoid negotiator recursive construction - * perf: enable strict mode - * perf: remove unnecessary bitwise operator - -1.2.7 / 2015-05-10 -================== - - * deps: negotiator@0.5.3 - - Fix media type parameter matching to be case-insensitive - -1.2.6 / 2015-05-07 -================== - - * deps: mime-types@~2.0.11 - - deps: mime-db@~1.9.1 - * deps: negotiator@0.5.2 - - Fix comparing media types with quoted values - - Fix splitting media types with quoted commas - -1.2.5 / 2015-03-13 -================== - - * deps: mime-types@~2.0.10 - - deps: mime-db@~1.8.0 - -1.2.4 / 2015-02-14 -================== - - * Support Node.js 0.6 - * deps: mime-types@~2.0.9 - - deps: mime-db@~1.7.0 - * deps: negotiator@0.5.1 - - Fix preference sorting to be stable for long acceptable lists - -1.2.3 / 2015-01-31 -================== - - * deps: mime-types@~2.0.8 - - deps: mime-db@~1.6.0 - -1.2.2 / 2014-12-30 -================== - - * deps: mime-types@~2.0.7 - - deps: mime-db@~1.5.0 - -1.2.1 / 2014-12-30 -================== - - * deps: mime-types@~2.0.5 - - deps: mime-db@~1.3.1 - -1.2.0 / 2014-12-19 -================== - - * deps: negotiator@0.5.0 - - Fix list return order when large accepted list - - Fix missing identity encoding when q=0 exists - - Remove dynamic building of Negotiator class - -1.1.4 / 2014-12-10 -================== - - * deps: mime-types@~2.0.4 - - deps: mime-db@~1.3.0 - -1.1.3 / 2014-11-09 -================== - - * deps: mime-types@~2.0.3 - - deps: mime-db@~1.2.0 - -1.1.2 / 2014-10-14 -================== - - * deps: negotiator@0.4.9 - - Fix error when media type has invalid parameter - -1.1.1 / 2014-09-28 -================== - - * deps: mime-types@~2.0.2 - - deps: mime-db@~1.1.0 - * deps: negotiator@0.4.8 - - Fix all negotiations to be case-insensitive - - Stable sort preferences of same quality according to client order - -1.1.0 / 2014-09-02 -================== - - * update `mime-types` - -1.0.7 / 2014-07-04 -================== - - * Fix wrong type returned from `type` when match after unknown extension - -1.0.6 / 2014-06-24 -================== - - * deps: negotiator@0.4.7 - -1.0.5 / 2014-06-20 -================== - - * fix crash when unknown extension given - -1.0.4 / 2014-06-19 -================== - - * use `mime-types` - -1.0.3 / 2014-06-11 -================== - - * deps: negotiator@0.4.6 - - Order by specificity when quality is the same - -1.0.2 / 2014-05-29 -================== - - * Fix interpretation when header not in request - * deps: pin negotiator@0.4.5 - -1.0.1 / 2014-01-18 -================== - - * Identity encoding isn't always acceptable - * deps: negotiator@~0.4.0 - -1.0.0 / 2013-12-27 -================== - - * Genesis diff --git a/node_modules/arg/LICENSE.md b/node_modules/arg/LICENSE.md deleted file mode 100644 index b708f87..0000000 --- a/node_modules/arg/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Vercel, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/available-typed-arrays/CHANGELOG.md b/node_modules/available-typed-arrays/CHANGELOG.md deleted file mode 100644 index f5ade9a..0000000 --- a/node_modules/available-typed-arrays/CHANGELOG.md +++ /dev/null @@ -1,100 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [v1.0.7](https://github.com/inspect-js/available-typed-arrays/compare/v1.0.6...v1.0.7) - 2024-02-19 - -### Commits - -- [Refactor] use `possible-typed-array-names` [`ac86abf`](https://github.com/inspect-js/available-typed-arrays/commit/ac86abfd64c4b633fd6523cc4193f1913fd22666) - -## [v1.0.6](https://github.com/inspect-js/available-typed-arrays/compare/v1.0.5...v1.0.6) - 2024-01-31 - -### Commits - -- [actions] reuse common workflows [`1850353`](https://github.com/inspect-js/available-typed-arrays/commit/1850353ded0ceb4d02d9d05649da5b7f3a28c89f) -- [meta] use `npmignore` to autogenerate an npmignore file [`5c7de12`](https://github.com/inspect-js/available-typed-arrays/commit/5c7de120d22a5c35f703ba3f0b5287e5c5f38af6) -- [patch] add types [`fcfb0ea`](https://github.com/inspect-js/available-typed-arrays/commit/fcfb0ea21c9dc8459d68f8bb26679abb0bec71ca) -- [actions] update codecov uploader [`d844945`](https://github.com/inspect-js/available-typed-arrays/commit/d84494596881a298aabde9bd87e538ce10c6cd01) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `array.prototype.every`, `safe-publish-latest`, `tape` [`a2be6f4`](https://github.com/inspect-js/available-typed-arrays/commit/a2be6f482010e920692d8f65fe1f193dbb73004d) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`b283a3e`](https://github.com/inspect-js/available-typed-arrays/commit/b283a3e2176fbe8e431a27e20df21c831f216d5a) -- [actions] update rebase action to use reusable workflow [`0ad1f2d`](https://github.com/inspect-js/available-typed-arrays/commit/0ad1f2d82b11713ee48d9b37cb73fcc891bd9f4a) -- [Dev Deps] update `@ljharb/eslint-config`, `array.prototype.every`, `aud`, `tape` [`cd36e81`](https://github.com/inspect-js/available-typed-arrays/commit/cd36e8131076dd4e67a88b259f829067fa56c139) -- [meta] simplify "exports" [`f696e5f`](https://github.com/inspect-js/available-typed-arrays/commit/f696e5ff9ded838e192ade4e8550a890c4f35eb0) -- [Dev Deps] update `aud`, `npmignore`, `tape` [`bf20080`](https://github.com/inspect-js/available-typed-arrays/commit/bf200809aea3107b31fc8817122c693e099be30e) - -## [v1.0.5](https://github.com/inspect-js/available-typed-arrays/compare/v1.0.4...v1.0.5) - 2021-08-30 - -### Fixed - -- [Refactor] use `globalThis` if available [`#12`](https://github.com/inspect-js/available-typed-arrays/issues/12) - -### Commits - -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`1199790`](https://github.com/inspect-js/available-typed-arrays/commit/1199790ab5841517ad04827fab3f135d2dc5cfb7) - -## [v1.0.4](https://github.com/inspect-js/available-typed-arrays/compare/v1.0.3...v1.0.4) - 2021-05-25 - -### Commits - -- [Refactor] Remove `array.prototype.filter` dependency [`f39c90e`](https://github.com/inspect-js/available-typed-arrays/commit/f39c90ecb1907de28ee2d3577b7da37ae12aac56) -- [Dev Deps] update `eslint`, `auto-changelog` [`b2e3a03`](https://github.com/inspect-js/available-typed-arrays/commit/b2e3a035e8cd3ddfd7b565249e1651c6419a34d0) -- [meta] create `FUNDING.yml` [`8c0e758`](https://github.com/inspect-js/available-typed-arrays/commit/8c0e758c6ec80adbb3770554653cdc3aa16beb55) -- [Tests] fix harmony test matrix [`ef96549`](https://github.com/inspect-js/available-typed-arrays/commit/ef96549df171776267529413240a2219cb59d5ce) -- [meta] add `sideEffects` flag [`288cca0`](https://github.com/inspect-js/available-typed-arrays/commit/288cca0fbd214bec706447851bb8bccc4b899a48) - -## [v1.0.3](https://github.com/inspect-js/available-typed-arrays/compare/v1.0.2...v1.0.3) - 2021-05-19 - -### Commits - -- [Tests] migrate tests to Github Actions [`3ef082c`](https://github.com/inspect-js/available-typed-arrays/commit/3ef082caaa153b49f4c37c85bbd5c4b13fe4f638) -- [meta] do not publish github action workflow files [`fd95ffd`](https://github.com/inspect-js/available-typed-arrays/commit/fd95ffdaca759eca81cb4c5d5772ee863dfea501) -- [actions] use `node/install` instead of `node/run`; use `codecov` action [`eb6bd65`](https://github.com/inspect-js/available-typed-arrays/commit/eb6bd659a31c92a6a178c71a89fe0d5261413e6c) -- [Tests] run `nyc` on all tests [`636c946`](https://github.com/inspect-js/available-typed-arrays/commit/636c94657b532599ef90a214aaa12639d11b0161) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`70a3b61`](https://github.com/inspect-js/available-typed-arrays/commit/70a3b61367b318fb883c2f35b8f2d539849a23b6) -- [actions] add "Allow Edits" workflow [`bd09c45`](https://github.com/inspect-js/available-typed-arrays/commit/bd09c45299e396fa5bbd5be4c58b1aedcb372a82) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `array.prototype.every`, `aud`, `tape` [`8f97523`](https://github.com/inspect-js/available-typed-arrays/commit/8f9752308390a79068cd431436bbfd77bca15647) -- [readme] fix URLs [`75418e2`](https://github.com/inspect-js/available-typed-arrays/commit/75418e20b57f4ad5e65d8c2e1864efd14eaa2e65) -- [readme] add actions and codecov badges [`4a8bc30`](https://github.com/inspect-js/available-typed-arrays/commit/4a8bc30af2ce1f48e2b28ab3db5be9589bd6f2d0) -- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud` [`65198ac`](https://github.com/inspect-js/available-typed-arrays/commit/65198ace335a013ef49b6bd722bc80bbbc6be784) -- [actions] update workflows [`7f816eb`](https://github.com/inspect-js/available-typed-arrays/commit/7f816eb231131e53ced2572ba6c6c6a00f975789) -- [Refactor] use `array.prototype.filter` instead of `array-filter` [`2dd1038`](https://github.com/inspect-js/available-typed-arrays/commit/2dd1038d71ce48b5650687691cf8fe09795a6d30) -- [actions] switch Automatic Rease workflow to `pull_request_target` event [`9b45e91`](https://github.com/inspect-js/available-typed-arrays/commit/9b45e914fcb08bdaaaa0166b41716e51f400d1c6) -- [Dev Deps] update `auto-changelog`, `tape` [`0003a5b`](https://github.com/inspect-js/available-typed-arrays/commit/0003a5b122a0724db5499c114104eeeb396b2f67) -- [meta] use `prepublishOnly` script for npm 7+ [`d884dd1`](https://github.com/inspect-js/available-typed-arrays/commit/d884dd1c1117411f35d9fbc07f513a1a85ccdead) -- [readme] remove travis badge [`9da2b3c`](https://github.com/inspect-js/available-typed-arrays/commit/9da2b3c29706340fada995137aba12cfae4d6f37) -- [Dev Deps] update `auto-changelog`; add `aud` [`41b1336`](https://github.com/inspect-js/available-typed-arrays/commit/41b13369c71b0e3e57b9de0f4fb1e4d67950d74a) -- [Tests] only audit prod deps [`2571826`](https://github.com/inspect-js/available-typed-arrays/commit/2571826a5d121eeeeccf4c711e3f9e4616685d50) - -## [v1.0.2](https://github.com/inspect-js/available-typed-arrays/compare/v1.0.1...v1.0.2) - 2020-01-26 - -### Commits - -- [actions] add automatic rebasing / merge commit blocking [`3229a74`](https://github.com/inspect-js/available-typed-arrays/commit/3229a74bda60f24e2257efc40ddff9a3ce98de76) -- [Dev Deps] update `@ljharb/eslint-config` [`9579abe`](https://github.com/inspect-js/available-typed-arrays/commit/9579abecc196088561d3aedf27cad45b56f8e18b) -- [Fix] remove `require` condition to avoid experimental warning [`2cade6b`](https://github.com/inspect-js/available-typed-arrays/commit/2cade6b56d6a508a950c7da27d038bee496e716b) - -## [v1.0.1](https://github.com/inspect-js/available-typed-arrays/compare/v1.0.0...v1.0.1) - 2020-01-24 - -### Commits - -- [meta] add "exports" [`5942917`](https://github.com/inspect-js/available-typed-arrays/commit/5942917aafb56c6bce80f01b7ae6a9b46bc72c69) - -## v1.0.0 - 2020-01-24 - -### Commits - -- Initial commit [`2bc5144`](https://github.com/inspect-js/available-typed-arrays/commit/2bc514459c9f65756adfbd9964abf433183d78f6) -- readme [`31e4796`](https://github.com/inspect-js/available-typed-arrays/commit/31e4796379eba4a16d3c6a8e9baf6eb3f39e33d1) -- npm init [`9194266`](https://github.com/inspect-js/available-typed-arrays/commit/9194266b471a2a2dd5e6969bc40358ceb346e21e) -- Tests [`b539830`](https://github.com/inspect-js/available-typed-arrays/commit/b539830c3213f90de42b4d6e62803f52daf61a6d) -- Implementation [`6577df2`](https://github.com/inspect-js/available-typed-arrays/commit/6577df244ea146ef5ec16858044c8955e0fc445c) -- [meta] add `auto-changelog` [`7b43310`](https://github.com/inspect-js/available-typed-arrays/commit/7b43310be76f00fe60b74a2fd6d0e46ac1d01f3e) -- [Tests] add `npm run lint` [`dedfbc1`](https://github.com/inspect-js/available-typed-arrays/commit/dedfbc1592f86ac1636267d3965f2345df43815b) -- [Tests] use shared travis-ci configs [`c459d78`](https://github.com/inspect-js/available-typed-arrays/commit/c459d78bf2efa9d777f88599ae71a796dbfcb70f) -- Only apps should have lockfiles [`d294668`](https://github.com/inspect-js/available-typed-arrays/commit/d294668422cf35f5e7716a85bfd204e62b01c056) -- [meta] add `funding` field [`6e70bc1`](https://github.com/inspect-js/available-typed-arrays/commit/6e70bc1fb199c7898165aaf05c25bb49f4062e53) -- [meta] add `safe-publish-latest` [`dd89ca2`](https://github.com/inspect-js/available-typed-arrays/commit/dd89ca2c6842f0f3e82958df2b2bd0fc0c929c51) diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md deleted file mode 100644 index 2cdc8e4..0000000 --- a/node_modules/balanced-match/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/node_modules/body-parser/HISTORY.md b/node_modules/body-parser/HISTORY.md deleted file mode 100644 index 17dd110..0000000 --- a/node_modules/body-parser/HISTORY.md +++ /dev/null @@ -1,731 +0,0 @@ -2.2.0 / 2025-03-27 -========================= - -* refactor: normalize common options for all parsers -* deps: - * iconv-lite@^0.6.3 - -2.1.0 / 2025-02-10 -========================= - -* deps: - * type-is@^2.0.0 - * debug@^4.4.0 - * Removed destroy -* refactor: prefix built-in node module imports -* use the node require cache instead of custom caching - -2.0.2 / 2024-10-31 -========================= - -* remove `unpipe` package and use native `unpipe()` method - -2.0.1 / 2024-09-10 -========================= - -* Restore expected behavior `extended` to `false` - -2.0.0 / 2024-09-10 -========================= -* Propagate changes from 1.20.3 -* add brotli support #406 -* Breaking Change: Node.js 18 is the minimum supported version - -2.0.0-beta.2 / 2023-02-23 -========================= - -This incorporates all changes after 1.19.1 up to 1.20.2. - - * Remove deprecated `bodyParser()` combination middleware - * deps: debug@3.1.0 - - Add `DEBUG_HIDE_DATE` environment variable - - Change timer to per-namespace instead of global - - Change non-TTY date format - - Remove `DEBUG_FD` environment variable support - - Support 256 namespace colors - * deps: iconv-lite@0.5.2 - - Add encoding cp720 - - Add encoding UTF-32 - * deps: raw-body@3.0.0-beta.1 - -2.0.0-beta.1 / 2021-12-17 -========================= - - * Drop support for Node.js 0.8 - * `req.body` is no longer always initialized to `{}` - - it is left `undefined` unless a body is parsed - * `urlencoded` parser now defaults `extended` to `false` - * Use `on-finished` to determine when body read - -1.20.3 / 2024-09-10 -=================== - - * deps: qs@6.13.0 - * add `depth` option to customize the depth level in the parser - * IMPORTANT: The default `depth` level for parsing URL-encoded data is now `32` (previously was `Infinity`) - -1.20.2 / 2023-02-21 -=================== - - * Fix strict json error message on Node.js 19+ - * deps: content-type@~1.0.5 - - perf: skip value escaping when unnecessary - * deps: raw-body@2.5.2 - -1.20.1 / 2022-10-06 -=================== - - * deps: qs@6.11.0 - * perf: remove unnecessary object clone - -1.20.0 / 2022-04-02 -=================== - - * Fix error message for json parse whitespace in `strict` - * Fix internal error when inflated body exceeds limit - * Prevent loss of async hooks context - * Prevent hanging when request already read - * deps: depd@2.0.0 - - Replace internal `eval` usage with `Function` constructor - - Use instance methods on `process` to check for listeners - * deps: http-errors@2.0.0 - - deps: depd@2.0.0 - - deps: statuses@2.0.1 - * deps: on-finished@2.4.1 - * deps: qs@6.10.3 - * deps: raw-body@2.5.1 - - deps: http-errors@2.0.0 - -1.19.2 / 2022-02-15 -=================== - - * deps: bytes@3.1.2 - * deps: qs@6.9.7 - * Fix handling of `__proto__` keys - * deps: raw-body@2.4.3 - - deps: bytes@3.1.2 - -1.19.1 / 2021-12-10 -=================== - - * deps: bytes@3.1.1 - * deps: http-errors@1.8.1 - - deps: inherits@2.0.4 - - deps: toidentifier@1.0.1 - - deps: setprototypeof@1.2.0 - * deps: qs@6.9.6 - * deps: raw-body@2.4.2 - - deps: bytes@3.1.1 - - deps: http-errors@1.8.1 - * deps: safe-buffer@5.2.1 - * deps: type-is@~1.6.18 - -1.19.0 / 2019-04-25 -=================== - - * deps: bytes@3.1.0 - - Add petabyte (`pb`) support - * deps: http-errors@1.7.2 - - Set constructor name when possible - - deps: setprototypeof@1.1.1 - - deps: statuses@'>= 1.5.0 < 2' - * deps: iconv-lite@0.4.24 - - Added encoding MIK - * deps: qs@6.7.0 - - Fix parsing array brackets after index - * deps: raw-body@2.4.0 - - deps: bytes@3.1.0 - - deps: http-errors@1.7.2 - - deps: iconv-lite@0.4.24 - * deps: type-is@~1.6.17 - - deps: mime-types@~2.1.24 - - perf: prevent internal `throw` on invalid type - -1.18.3 / 2018-05-14 -=================== - - * Fix stack trace for strict json parse error - * deps: depd@~1.1.2 - - perf: remove argument reassignment - * deps: http-errors@~1.6.3 - - deps: depd@~1.1.2 - - deps: setprototypeof@1.1.0 - - deps: statuses@'>= 1.3.1 < 2' - * deps: iconv-lite@0.4.23 - - Fix loading encoding with year appended - - Fix deprecation warnings on Node.js 10+ - * deps: qs@6.5.2 - * deps: raw-body@2.3.3 - - deps: http-errors@1.6.3 - - deps: iconv-lite@0.4.23 - * deps: type-is@~1.6.16 - - deps: mime-types@~2.1.18 - -1.18.2 / 2017-09-22 -=================== - - * deps: debug@2.6.9 - * perf: remove argument reassignment - -1.18.1 / 2017-09-12 -=================== - - * deps: content-type@~1.0.4 - - perf: remove argument reassignment - - perf: skip parameter parsing when no parameters - * deps: iconv-lite@0.4.19 - - Fix ISO-8859-1 regression - - Update Windows-1255 - * deps: qs@6.5.1 - - Fix parsing & compacting very deep objects - * deps: raw-body@2.3.2 - - deps: iconv-lite@0.4.19 - -1.18.0 / 2017-09-08 -=================== - - * Fix JSON strict violation error to match native parse error - * Include the `body` property on verify errors - * Include the `type` property on all generated errors - * Use `http-errors` to set status code on errors - * deps: bytes@3.0.0 - * deps: debug@2.6.8 - * deps: depd@~1.1.1 - - Remove unnecessary `Buffer` loading - * deps: http-errors@~1.6.2 - - deps: depd@1.1.1 - * deps: iconv-lite@0.4.18 - - Add support for React Native - - Add a warning if not loaded as utf-8 - - Fix CESU-8 decoding in Node.js 8 - - Improve speed of ISO-8859-1 encoding - * deps: qs@6.5.0 - * deps: raw-body@2.3.1 - - Use `http-errors` for standard emitted errors - - deps: bytes@3.0.0 - - deps: iconv-lite@0.4.18 - - perf: skip buffer decoding on overage chunk - * perf: prevent internal `throw` when missing charset - -1.17.2 / 2017-05-17 -=================== - - * deps: debug@2.6.7 - - Fix `DEBUG_MAX_ARRAY_LENGTH` - - deps: ms@2.0.0 - * deps: type-is@~1.6.15 - - deps: mime-types@~2.1.15 - -1.17.1 / 2017-03-06 -=================== - - * deps: qs@6.4.0 - - Fix regression parsing keys starting with `[` - -1.17.0 / 2017-03-01 -=================== - - * deps: http-errors@~1.6.1 - - Make `message` property enumerable for `HttpError`s - - deps: setprototypeof@1.0.3 - * deps: qs@6.3.1 - - Fix compacting nested arrays - -1.16.1 / 2017-02-10 -=================== - - * deps: debug@2.6.1 - - Fix deprecation messages in WebStorm and other editors - - Undeprecate `DEBUG_FD` set to `1` or `2` - -1.16.0 / 2017-01-17 -=================== - - * deps: debug@2.6.0 - - Allow colors in workers - - Deprecated `DEBUG_FD` environment variable - - Fix error when running under React Native - - Use same color for same namespace - - deps: ms@0.7.2 - * deps: http-errors@~1.5.1 - - deps: inherits@2.0.3 - - deps: setprototypeof@1.0.2 - - deps: statuses@'>= 1.3.1 < 2' - * deps: iconv-lite@0.4.15 - - Added encoding MS-31J - - Added encoding MS-932 - - Added encoding MS-936 - - Added encoding MS-949 - - Added encoding MS-950 - - Fix GBK/GB18030 handling of Euro character - * deps: qs@6.2.1 - - Fix array parsing from skipping empty values - * deps: raw-body@~2.2.0 - - deps: iconv-lite@0.4.15 - * deps: type-is@~1.6.14 - - deps: mime-types@~2.1.13 - -1.15.2 / 2016-06-19 -=================== - - * deps: bytes@2.4.0 - * deps: content-type@~1.0.2 - - perf: enable strict mode - * deps: http-errors@~1.5.0 - - Use `setprototypeof` module to replace `__proto__` setting - - deps: statuses@'>= 1.3.0 < 2' - - perf: enable strict mode - * deps: qs@6.2.0 - * deps: raw-body@~2.1.7 - - deps: bytes@2.4.0 - - perf: remove double-cleanup on happy path - * deps: type-is@~1.6.13 - - deps: mime-types@~2.1.11 - -1.15.1 / 2016-05-05 -=================== - - * deps: bytes@2.3.0 - - Drop partial bytes on all parsed units - - Fix parsing byte string that looks like hex - * deps: raw-body@~2.1.6 - - deps: bytes@2.3.0 - * deps: type-is@~1.6.12 - - deps: mime-types@~2.1.10 - -1.15.0 / 2016-02-10 -=================== - - * deps: http-errors@~1.4.0 - - Add `HttpError` export, for `err instanceof createError.HttpError` - - deps: inherits@2.0.1 - - deps: statuses@'>= 1.2.1 < 2' - * deps: qs@6.1.0 - * deps: type-is@~1.6.11 - - deps: mime-types@~2.1.9 - -1.14.2 / 2015-12-16 -=================== - - * deps: bytes@2.2.0 - * deps: iconv-lite@0.4.13 - * deps: qs@5.2.0 - * deps: raw-body@~2.1.5 - - deps: bytes@2.2.0 - - deps: iconv-lite@0.4.13 - * deps: type-is@~1.6.10 - - deps: mime-types@~2.1.8 - -1.14.1 / 2015-09-27 -=================== - - * Fix issue where invalid charset results in 400 when `verify` used - * deps: iconv-lite@0.4.12 - - Fix CESU-8 decoding in Node.js 4.x - * deps: raw-body@~2.1.4 - - Fix masking critical errors from `iconv-lite` - - deps: iconv-lite@0.4.12 - * deps: type-is@~1.6.9 - - deps: mime-types@~2.1.7 - -1.14.0 / 2015-09-16 -=================== - - * Fix JSON strict parse error to match syntax errors - * Provide static `require` analysis in `urlencoded` parser - * deps: depd@~1.1.0 - - Support web browser loading - * deps: qs@5.1.0 - * deps: raw-body@~2.1.3 - - Fix sync callback when attaching data listener causes sync read - * deps: type-is@~1.6.8 - - Fix type error when given invalid type to match against - - deps: mime-types@~2.1.6 - -1.13.3 / 2015-07-31 -=================== - - * deps: type-is@~1.6.6 - - deps: mime-types@~2.1.4 - -1.13.2 / 2015-07-05 -=================== - - * deps: iconv-lite@0.4.11 - * deps: qs@4.0.0 - - Fix dropping parameters like `hasOwnProperty` - - Fix user-visible incompatibilities from 3.1.0 - - Fix various parsing edge cases - * deps: raw-body@~2.1.2 - - Fix error stack traces to skip `makeError` - - deps: iconv-lite@0.4.11 - * deps: type-is@~1.6.4 - - deps: mime-types@~2.1.2 - - perf: enable strict mode - - perf: remove argument reassignment - -1.13.1 / 2015-06-16 -=================== - - * deps: qs@2.4.2 - - Downgraded from 3.1.0 because of user-visible incompatibilities - -1.13.0 / 2015-06-14 -=================== - - * Add `statusCode` property on `Error`s, in addition to `status` - * Change `type` default to `application/json` for JSON parser - * Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser - * Provide static `require` analysis - * Use the `http-errors` module to generate errors - * deps: bytes@2.1.0 - - Slight optimizations - * deps: iconv-lite@0.4.10 - - The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails - - Leading BOM is now removed when decoding - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * deps: qs@3.1.0 - - Fix dropping parameters like `hasOwnProperty` - - Fix various parsing edge cases - - Parsed object now has `null` prototype - * deps: raw-body@~2.1.1 - - Use `unpipe` module for unpiping requests - - deps: iconv-lite@0.4.10 - * deps: type-is@~1.6.3 - - deps: mime-types@~2.1.1 - - perf: reduce try block size - - perf: remove bitwise operations - * perf: enable strict mode - * perf: remove argument reassignment - * perf: remove delete call - -1.12.4 / 2015-05-10 -=================== - - * deps: debug@~2.2.0 - * deps: qs@2.4.2 - - Fix allowing parameters like `constructor` - * deps: on-finished@~2.2.1 - * deps: raw-body@~2.0.1 - - Fix a false-positive when unpiping in Node.js 0.8 - - deps: bytes@2.0.1 - * deps: type-is@~1.6.2 - - deps: mime-types@~2.0.11 - -1.12.3 / 2015-04-15 -=================== - - * Slight efficiency improvement when not debugging - * deps: depd@~1.0.1 - * deps: iconv-lite@0.4.8 - - Add encoding alias UNICODE-1-1-UTF-7 - * deps: raw-body@1.3.4 - - Fix hanging callback if request aborts during read - - deps: iconv-lite@0.4.8 - -1.12.2 / 2015-03-16 -=================== - - * deps: qs@2.4.1 - - Fix error when parameter `hasOwnProperty` is present - -1.12.1 / 2015-03-15 -=================== - - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: type-is@~1.6.1 - - deps: mime-types@~2.0.10 - -1.12.0 / 2015-02-13 -=================== - - * add `debug` messages - * accept a function for the `type` option - * use `content-type` to parse `Content-Type` headers - * deps: iconv-lite@0.4.7 - - Gracefully support enumerables on `Object.prototype` - * deps: raw-body@1.3.3 - - deps: iconv-lite@0.4.7 - * deps: type-is@~1.6.0 - - fix argument reassignment - - fix false-positives in `hasBody` `Transfer-Encoding` check - - support wildcard for both type and subtype (`*/*`) - - deps: mime-types@~2.0.9 - -1.11.0 / 2015-01-30 -=================== - - * make internal `extended: true` depth limit infinity - * deps: type-is@~1.5.6 - - deps: mime-types@~2.0.8 - -1.10.2 / 2015-01-20 -=================== - - * deps: iconv-lite@0.4.6 - - Fix rare aliases of single-byte encodings - * deps: raw-body@1.3.2 - - deps: iconv-lite@0.4.6 - -1.10.1 / 2015-01-01 -=================== - - * deps: on-finished@~2.2.0 - * deps: type-is@~1.5.5 - - deps: mime-types@~2.0.7 - -1.10.0 / 2014-12-02 -=================== - - * make internal `extended: true` array limit dynamic - -1.9.3 / 2014-11-21 -================== - - * deps: iconv-lite@0.4.5 - - Fix Windows-31J and X-SJIS encoding support - * deps: qs@2.3.3 - - Fix `arrayLimit` behavior - * deps: raw-body@1.3.1 - - deps: iconv-lite@0.4.5 - * deps: type-is@~1.5.3 - - deps: mime-types@~2.0.3 - -1.9.2 / 2014-10-27 -================== - - * deps: qs@2.3.2 - - Fix parsing of mixed objects and values - -1.9.1 / 2014-10-22 -================== - - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - * deps: qs@2.3.0 - - Fix parsing of mixed implicit and explicit arrays - * deps: type-is@~1.5.2 - - deps: mime-types@~2.0.2 - -1.9.0 / 2014-09-24 -================== - - * include the charset in "unsupported charset" error message - * include the encoding in "unsupported content encoding" error message - * deps: depd@~1.0.0 - -1.8.4 / 2014-09-23 -================== - - * fix content encoding to be case-insensitive - -1.8.3 / 2014-09-19 -================== - - * deps: qs@2.2.4 - - Fix issue with object keys starting with numbers truncated - -1.8.2 / 2014-09-15 -================== - - * deps: depd@0.4.5 - -1.8.1 / 2014-09-07 -================== - - * deps: media-typer@0.3.0 - * deps: type-is@~1.5.1 - -1.8.0 / 2014-09-05 -================== - - * make empty-body-handling consistent between chunked requests - - empty `json` produces `{}` - - empty `raw` produces `new Buffer(0)` - - empty `text` produces `''` - - empty `urlencoded` produces `{}` - * deps: qs@2.2.3 - - Fix issue where first empty value in array is discarded - * deps: type-is@~1.5.0 - - fix `hasbody` to be true for `content-length: 0` - -1.7.0 / 2014-09-01 -================== - - * add `parameterLimit` option to `urlencoded` parser - * change `urlencoded` extended array limit to 100 - * respond with 413 when over `parameterLimit` in `urlencoded` - -1.6.7 / 2014-08-29 -================== - - * deps: qs@2.2.2 - - Remove unnecessary cloning - -1.6.6 / 2014-08-27 -================== - - * deps: qs@2.2.0 - - Array parsing fix - - Performance improvements - -1.6.5 / 2014-08-16 -================== - - * deps: on-finished@2.1.0 - -1.6.4 / 2014-08-14 -================== - - * deps: qs@1.2.2 - -1.6.3 / 2014-08-10 -================== - - * deps: qs@1.2.1 - -1.6.2 / 2014-08-07 -================== - - * deps: qs@1.2.0 - - Fix parsing array of objects - -1.6.1 / 2014-08-06 -================== - - * deps: qs@1.1.0 - - Accept urlencoded square brackets - - Accept empty values in implicit array notation - -1.6.0 / 2014-08-05 -================== - - * deps: qs@1.0.2 - - Complete rewrite - - Limits array length to 20 - - Limits object depth to 5 - - Limits parameters to 1,000 - -1.5.2 / 2014-07-27 -================== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - -1.5.1 / 2014-07-26 -================== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - -1.5.0 / 2014-07-20 -================== - - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: iconv-lite@0.4.4 - - Added encoding UTF-7 - * deps: raw-body@1.3.0 - - deps: iconv-lite@0.4.4 - - Added encoding UTF-7 - - Fix `Cannot switch to old mode now` error on Node.js 0.10+ - * deps: type-is@~1.3.2 - -1.4.3 / 2014-06-19 -================== - - * deps: type-is@1.3.1 - - fix global variable leak - -1.4.2 / 2014-06-19 -================== - - * deps: type-is@1.3.0 - - improve type parsing - -1.4.1 / 2014-06-19 -================== - - * fix urlencoded extended deprecation message - -1.4.0 / 2014-06-19 -================== - - * add `text` parser - * add `raw` parser - * check accepted charset in content-type (accepts utf-8) - * check accepted encoding in content-encoding (accepts identity) - * deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed - * deprecate `urlencoded()` without provided `extended` option - * lazy-load urlencoded parsers - * parsers split into files for reduced mem usage - * support gzip and deflate bodies - - set `inflate: false` to turn off - * deps: raw-body@1.2.2 - - Support all encodings from `iconv-lite` - -1.3.1 / 2014-06-11 -================== - - * deps: type-is@1.2.1 - - Switch dependency from mime to mime-types@1.0.0 - -1.3.0 / 2014-05-31 -================== - - * add `extended` option to urlencoded parser - -1.2.2 / 2014-05-27 -================== - - * deps: raw-body@1.1.6 - - assert stream encoding on node.js 0.8 - - assert stream encoding on node.js < 0.10.6 - - deps: bytes@1 - -1.2.1 / 2014-05-26 -================== - - * invoke `next(err)` after request fully read - - prevents hung responses and socket hang ups - -1.2.0 / 2014-05-11 -================== - - * add `verify` option - * deps: type-is@1.2.0 - - support suffix matching - -1.1.2 / 2014-05-11 -================== - - * improve json parser speed - -1.1.1 / 2014-05-11 -================== - - * fix repeated limit parsing with every request - -1.1.0 / 2014-05-10 -================== - - * add `type` option - * deps: pin for safety and consistency - -1.0.2 / 2014-04-14 -================== - - * use `type-is` module - -1.0.1 / 2014-03-20 -================== - - * lower default limits to 100kb diff --git a/node_modules/buffer/AUTHORS.md b/node_modules/buffer/AUTHORS.md deleted file mode 100644 index 468aa19..0000000 --- a/node_modules/buffer/AUTHORS.md +++ /dev/null @@ -1,73 +0,0 @@ -# Authors - -#### Ordered by first contribution. - -- Romain Beauxis (toots@rastageeks.org) -- Tobias Koppers (tobias.koppers@googlemail.com) -- Janus (ysangkok@gmail.com) -- Rainer Dreyer (rdrey1@gmail.com) -- Tõnis Tiigi (tonistiigi@gmail.com) -- James Halliday (mail@substack.net) -- Michael Williamson (mike@zwobble.org) -- elliottcable (github@elliottcable.name) -- rafael (rvalle@livelens.net) -- Andrew Kelley (superjoe30@gmail.com) -- Andreas Madsen (amwebdk@gmail.com) -- Mike Brevoort (mike.brevoort@pearson.com) -- Brian White (mscdex@mscdex.net) -- Feross Aboukhadijeh (feross@feross.org) -- Ruben Verborgh (ruben@verborgh.org) -- eliang (eliang.cs@gmail.com) -- Jesse Tane (jesse.tane@gmail.com) -- Alfonso Boza (alfonso@cloud.com) -- Mathias Buus (mathiasbuus@gmail.com) -- Devon Govett (devongovett@gmail.com) -- Daniel Cousens (github@dcousens.com) -- Joseph Dykstra (josephdykstra@gmail.com) -- Parsha Pourkhomami (parshap+git@gmail.com) -- Damjan Košir (damjan.kosir@gmail.com) -- daverayment (dave.rayment@gmail.com) -- kawanet (u-suke@kawa.net) -- Linus Unnebäck (linus@folkdatorn.se) -- Nolan Lawson (nolan.lawson@gmail.com) -- Calvin Metcalf (calvin.metcalf@gmail.com) -- Koki Takahashi (hakatasiloving@gmail.com) -- Guy Bedford (guybedford@gmail.com) -- Jan Schär (jscissr@gmail.com) -- RaulTsc (tomescu.raul@gmail.com) -- Matthieu Monsch (monsch@alum.mit.edu) -- Dan Ehrenberg (littledan@chromium.org) -- Kirill Fomichev (fanatid@ya.ru) -- Yusuke Kawasaki (u-suke@kawa.net) -- DC (dcposch@dcpos.ch) -- John-David Dalton (john.david.dalton@gmail.com) -- adventure-yunfei (adventure030@gmail.com) -- Emil Bay (github@tixz.dk) -- Sam Sudar (sudar.sam@gmail.com) -- Volker Mische (volker.mische@gmail.com) -- David Walton (support@geekstocks.com) -- Сковорода Никита Андреевич (chalkerx@gmail.com) -- greenkeeper[bot] (greenkeeper[bot]@users.noreply.github.com) -- ukstv (sergey.ukustov@machinomy.com) -- Renée Kooi (renee@kooi.me) -- ranbochen (ranbochen@qq.com) -- Vladimir Borovik (bobahbdb@gmail.com) -- greenkeeper[bot] (23040076+greenkeeper[bot]@users.noreply.github.com) -- kumavis (aaron@kumavis.me) -- Sergey Ukustov (sergey.ukustov@machinomy.com) -- Fei Liu (liu.feiwood@gmail.com) -- Blaine Bublitz (blaine.bublitz@gmail.com) -- clement (clement@seald.io) -- Koushik Dutta (koushd@gmail.com) -- Jordan Harband (ljharb@gmail.com) -- Niklas Mischkulnig (mischnic@users.noreply.github.com) -- Nikolai Vavilov (vvnicholas@gmail.com) -- Fedor Nezhivoi (gyzerok@users.noreply.github.com) -- shuse2 (shus.toda@gmail.com) -- Peter Newman (peternewman@users.noreply.github.com) -- mathmakgakpak (44949126+mathmakgakpak@users.noreply.github.com) -- jkkang (jkkang@smartauth.kr) -- Deklan Webster (deklanw@gmail.com) -- Martin Heidegger (martin.heidegger@gmail.com) - -#### Generated by bin/update-authors.sh. diff --git a/node_modules/bytes/History.md b/node_modules/bytes/History.md deleted file mode 100644 index d60ce0e..0000000 --- a/node_modules/bytes/History.md +++ /dev/null @@ -1,97 +0,0 @@ -3.1.2 / 2022-01-27 -================== - - * Fix return value for un-parsable strings - -3.1.1 / 2021-11-15 -================== - - * Fix "thousandsSeparator" incorrecting formatting fractional part - -3.1.0 / 2019-01-22 -================== - - * Add petabyte (`pb`) support - -3.0.0 / 2017-08-31 -================== - - * Change "kB" to "KB" in format output - * Remove support for Node.js 0.6 - * Remove support for ComponentJS - -2.5.0 / 2017-03-24 -================== - - * Add option "unit" - -2.4.0 / 2016-06-01 -================== - - * Add option "unitSeparator" - -2.3.0 / 2016-02-15 -================== - - * Drop partial bytes on all parsed units - * Fix non-finite numbers to `.format` to return `null` - * Fix parsing byte string that looks like hex - * perf: hoist regular expressions - -2.2.0 / 2015-11-13 -================== - - * add option "decimalPlaces" - * add option "fixedDecimals" - -2.1.0 / 2015-05-21 -================== - - * add `.format` export - * add `.parse` export - -2.0.2 / 2015-05-20 -================== - - * remove map recreation - * remove unnecessary object construction - -2.0.1 / 2015-05-07 -================== - - * fix browserify require - * remove node.extend dependency - -2.0.0 / 2015-04-12 -================== - - * add option "case" - * add option "thousandsSeparator" - * return "null" on invalid parse input - * support proper round-trip: bytes(bytes(num)) === num - * units no longer case sensitive when parsing - -1.0.0 / 2014-05-05 -================== - - * add negative support. fixes #6 - -0.3.0 / 2014-03-19 -================== - - * added terabyte support - -0.2.1 / 2013-04-01 -================== - - * add .component - -0.2.0 / 2012-10-28 -================== - - * bytes(200).should.eql('200b') - -0.1.0 / 2012-07-04 -================== - - * add bytes to string conversion [yields] diff --git a/node_modules/c12/node_modules/dotenv/CHANGELOG.md b/node_modules/c12/node_modules/dotenv/CHANGELOG.md deleted file mode 100644 index 8b80dd6..0000000 --- a/node_modules/c12/node_modules/dotenv/CHANGELOG.md +++ /dev/null @@ -1,520 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - -## [Unreleased](https://github.com/motdotla/dotenv/compare/v16.6.1...master) - -## [16.6.1](https://github.com/motdotla/dotenv/compare/v16.6.0...v16.6.1) (2025-06-27) - -### Changed - -- Default `quiet` to true – hiding the runtime log message ([#874](https://github.com/motdotla/dotenv/pull/874)) -- NOTICE: 17.0.0 will be released with quiet defaulting to false. Use `config({ quiet: true })` to suppress. -- And check out the new [dotenvx](https://github.com/dotenvx/dotenvx). As coding workflows evolve and agents increasingly handle secrets, encrypted .env files offer a much safer way to deploy both agents and code together with secure secrets. Simply switch `require('dotenv').config()` for `require('@dotenvx/dotenvx').config()`. - -## [16.6.0](https://github.com/motdotla/dotenv/compare/v16.5.0...v16.6.0) (2025-06-26) - -### Added - -- Default log helpful message `[dotenv@16.6.0] injecting env (1) from .env` ([#870](https://github.com/motdotla/dotenv/pull/870)) -- Use `{ quiet: true }` to suppress -- Aligns dotenv more closely with [dotenvx](https://github.com/dotenvx/dotenvx). - -## [16.5.0](https://github.com/motdotla/dotenv/compare/v16.4.7...v16.5.0) (2025-04-07) - -### Added - -- 🎉 Added new sponsor [Graphite](https://graphite.dev/?utm_source=github&utm_medium=repo&utm_campaign=dotenv) - *the AI developer productivity platform helping teams on GitHub ship higher quality software, faster*. - -> [!TIP] -> **[Become a sponsor](https://github.com/sponsors/motdotla)** -> -> The dotenvx README is viewed thousands of times DAILY on GitHub and NPM. -> Sponsoring dotenv is a great way to get in front of developers and give back to the developer community at the same time. - -### Changed - -- Remove `_log` method. Use `_debug` [#862](https://github.com/motdotla/dotenv/pull/862) - -## [16.4.7](https://github.com/motdotla/dotenv/compare/v16.4.6...v16.4.7) (2024-12-03) - -### Changed - -- Ignore `.tap` folder when publishing. (oops, sorry about that everyone. - @motdotla) [#848](https://github.com/motdotla/dotenv/pull/848) - -## [16.4.6](https://github.com/motdotla/dotenv/compare/v16.4.5...v16.4.6) (2024-12-02) - -### Changed - -- Clean up stale dev dependencies [#847](https://github.com/motdotla/dotenv/pull/847) -- Various README updates clarifying usage and alternative solutions using [dotenvx](https://github.com/dotenvx/dotenvx) - -## [16.4.5](https://github.com/motdotla/dotenv/compare/v16.4.4...v16.4.5) (2024-02-19) - -### Changed - -- 🐞 Fix recent regression when using `path` option. return to historical behavior: do not attempt to auto find `.env` if `path` set. (regression was introduced in `16.4.3`) [#814](https://github.com/motdotla/dotenv/pull/814) - -## [16.4.4](https://github.com/motdotla/dotenv/compare/v16.4.3...v16.4.4) (2024-02-13) - -### Changed - -- 🐞 Replaced chaining operator `?.` with old school `&&` (fixing node 12 failures) [#812](https://github.com/motdotla/dotenv/pull/812) - -## [16.4.3](https://github.com/motdotla/dotenv/compare/v16.4.2...v16.4.3) (2024-02-12) - -### Changed - -- Fixed processing of multiple files in `options.path` [#805](https://github.com/motdotla/dotenv/pull/805) - -## [16.4.2](https://github.com/motdotla/dotenv/compare/v16.4.1...v16.4.2) (2024-02-10) - -### Changed - -- Changed funding link in package.json to [`dotenvx.com`](https://dotenvx.com) - -## [16.4.1](https://github.com/motdotla/dotenv/compare/v16.4.0...v16.4.1) (2024-01-24) - -- Patch support for array as `path` option [#797](https://github.com/motdotla/dotenv/pull/797) - -## [16.4.0](https://github.com/motdotla/dotenv/compare/v16.3.2...v16.4.0) (2024-01-23) - -- Add `error.code` to error messages around `.env.vault` decryption handling [#795](https://github.com/motdotla/dotenv/pull/795) -- Add ability to find `.env.vault` file when filename(s) passed as an array [#784](https://github.com/motdotla/dotenv/pull/784) - -## [16.3.2](https://github.com/motdotla/dotenv/compare/v16.3.1...v16.3.2) (2024-01-18) - -### Added - -- Add debug message when no encoding set [#735](https://github.com/motdotla/dotenv/pull/735) - -### Changed - -- Fix output typing for `populate` [#792](https://github.com/motdotla/dotenv/pull/792) -- Use subarray instead of slice [#793](https://github.com/motdotla/dotenv/pull/793) - -## [16.3.1](https://github.com/motdotla/dotenv/compare/v16.3.0...v16.3.1) (2023-06-17) - -### Added - -- Add missing type definitions for `processEnv` and `DOTENV_KEY` options. [#756](https://github.com/motdotla/dotenv/pull/756) - -## [16.3.0](https://github.com/motdotla/dotenv/compare/v16.2.0...v16.3.0) (2023-06-16) - -### Added - -- Optionally pass `DOTENV_KEY` to options rather than relying on `process.env.DOTENV_KEY`. Defaults to `process.env.DOTENV_KEY` [#754](https://github.com/motdotla/dotenv/pull/754) - -## [16.2.0](https://github.com/motdotla/dotenv/compare/v16.1.4...v16.2.0) (2023-06-15) - -### Added - -- Optionally write to your own target object rather than `process.env`. Defaults to `process.env`. [#753](https://github.com/motdotla/dotenv/pull/753) -- Add import type URL to types file [#751](https://github.com/motdotla/dotenv/pull/751) - -## [16.1.4](https://github.com/motdotla/dotenv/compare/v16.1.3...v16.1.4) (2023-06-04) - -### Added - -- Added `.github/` to `.npmignore` [#747](https://github.com/motdotla/dotenv/pull/747) - -## [16.1.3](https://github.com/motdotla/dotenv/compare/v16.1.2...v16.1.3) (2023-05-31) - -### Removed - -- Removed `browser` keys for `path`, `os`, and `crypto` in package.json. These were set to false incorrectly as of 16.1. Instead, if using dotenv on the front-end make sure to include polyfills for `path`, `os`, and `crypto`. [node-polyfill-webpack-plugin](https://github.com/Richienb/node-polyfill-webpack-plugin) provides these. - -## [16.1.2](https://github.com/motdotla/dotenv/compare/v16.1.1...v16.1.2) (2023-05-31) - -### Changed - -- Exposed private function `_configDotenv` as `configDotenv`. [#744](https://github.com/motdotla/dotenv/pull/744) - -## [16.1.1](https://github.com/motdotla/dotenv/compare/v16.1.0...v16.1.1) (2023-05-30) - -### Added - -- Added type definition for `decrypt` function - -### Changed - -- Fixed `{crypto: false}` in `packageJson.browser` - -## [16.1.0](https://github.com/motdotla/dotenv/compare/v16.0.3...v16.1.0) (2023-05-30) - -### Added - -- Add `populate` convenience method [#733](https://github.com/motdotla/dotenv/pull/733) -- Accept URL as path option [#720](https://github.com/motdotla/dotenv/pull/720) -- Add dotenv to `npm fund` command -- Spanish language README [#698](https://github.com/motdotla/dotenv/pull/698) -- Add `.env.vault` support. 🎉 ([#730](https://github.com/motdotla/dotenv/pull/730)) - -ℹ️ `.env.vault` extends the `.env` file format standard with a localized encrypted vault file. Package it securely with your production code deploys. It's cloud agnostic so that you can deploy your secrets anywhere – without [risky third-party integrations](https://techcrunch.com/2023/01/05/circleci-breach/). [read more](https://github.com/motdotla/dotenv#-deploying) - -### Changed - -- Fixed "cannot resolve 'fs'" error on tools like Replit [#693](https://github.com/motdotla/dotenv/pull/693) - -## [16.0.3](https://github.com/motdotla/dotenv/compare/v16.0.2...v16.0.3) (2022-09-29) - -### Changed - -- Added library version to debug logs ([#682](https://github.com/motdotla/dotenv/pull/682)) - -## [16.0.2](https://github.com/motdotla/dotenv/compare/v16.0.1...v16.0.2) (2022-08-30) - -### Added - -- Export `env-options.js` and `cli-options.js` in package.json for use with downstream [dotenv-expand](https://github.com/motdotla/dotenv-expand) module - -## [16.0.1](https://github.com/motdotla/dotenv/compare/v16.0.0...v16.0.1) (2022-05-10) - -### Changed - -- Minor README clarifications -- Development ONLY: updated devDependencies as recommended for development only security risks ([#658](https://github.com/motdotla/dotenv/pull/658)) - -## [16.0.0](https://github.com/motdotla/dotenv/compare/v15.0.1...v16.0.0) (2022-02-02) - -### Added - -- _Breaking:_ Backtick support 🎉 ([#615](https://github.com/motdotla/dotenv/pull/615)) - -If you had values containing the backtick character, please quote those values with either single or double quotes. - -## [15.0.1](https://github.com/motdotla/dotenv/compare/v15.0.0...v15.0.1) (2022-02-02) - -### Changed - -- Properly parse empty single or double quoted values 🐞 ([#614](https://github.com/motdotla/dotenv/pull/614)) - -## [15.0.0](https://github.com/motdotla/dotenv/compare/v14.3.2...v15.0.0) (2022-01-31) - -`v15.0.0` is a major new release with some important breaking changes. - -### Added - -- _Breaking:_ Multiline parsing support (just works. no need for the flag.) - -### Changed - -- _Breaking:_ `#` marks the beginning of a comment (UNLESS the value is wrapped in quotes. Please update your `.env` files to wrap in quotes any values containing `#`. For example: `SECRET_HASH="something-with-a-#-hash"`). - -..Understandably, (as some teams have noted) this is tedious to do across the entire team. To make it less tedious, we recommend using [dotenv cli](https://github.com/dotenv-org/cli) going forward. It's an optional plugin that will keep your `.env` files in sync between machines, environments, or team members. - -### Removed - -- _Breaking:_ Remove multiline option (just works out of the box now. no need for the flag.) - -## [14.3.2](https://github.com/motdotla/dotenv/compare/v14.3.1...v14.3.2) (2022-01-25) - -### Changed - -- Preserve backwards compatibility on values containing `#` 🐞 ([#603](https://github.com/motdotla/dotenv/pull/603)) - -## [14.3.1](https://github.com/motdotla/dotenv/compare/v14.3.0...v14.3.1) (2022-01-25) - -### Changed - -- Preserve backwards compatibility on exports by re-introducing the prior in-place exports 🐞 ([#606](https://github.com/motdotla/dotenv/pull/606)) - -## [14.3.0](https://github.com/motdotla/dotenv/compare/v14.2.0...v14.3.0) (2022-01-24) - -### Added - -- Add `multiline` option 🎉 ([#486](https://github.com/motdotla/dotenv/pull/486)) - -## [14.2.0](https://github.com/motdotla/dotenv/compare/v14.1.1...v14.2.0) (2022-01-17) - -### Added - -- Add `dotenv_config_override` cli option -- Add `DOTENV_CONFIG_OVERRIDE` command line env option - -## [14.1.1](https://github.com/motdotla/dotenv/compare/v14.1.0...v14.1.1) (2022-01-17) - -### Added - -- Add React gotcha to FAQ on README - -## [14.1.0](https://github.com/motdotla/dotenv/compare/v14.0.1...v14.1.0) (2022-01-17) - -### Added - -- Add `override` option 🎉 ([#595](https://github.com/motdotla/dotenv/pull/595)) - -## [14.0.1](https://github.com/motdotla/dotenv/compare/v14.0.0...v14.0.1) (2022-01-16) - -### Added - -- Log error on failure to load `.env` file ([#594](https://github.com/motdotla/dotenv/pull/594)) - -## [14.0.0](https://github.com/motdotla/dotenv/compare/v13.0.1...v14.0.0) (2022-01-16) - -### Added - -- _Breaking:_ Support inline comments for the parser 🎉 ([#568](https://github.com/motdotla/dotenv/pull/568)) - -## [13.0.1](https://github.com/motdotla/dotenv/compare/v13.0.0...v13.0.1) (2022-01-16) - -### Changed - -* Hide comments and newlines from debug output ([#404](https://github.com/motdotla/dotenv/pull/404)) - -## [13.0.0](https://github.com/motdotla/dotenv/compare/v12.0.4...v13.0.0) (2022-01-16) - -### Added - -* _Breaking:_ Add type file for `config.js` ([#539](https://github.com/motdotla/dotenv/pull/539)) - -## [12.0.4](https://github.com/motdotla/dotenv/compare/v12.0.3...v12.0.4) (2022-01-16) - -### Changed - -* README updates -* Minor order adjustment to package json format - -## [12.0.3](https://github.com/motdotla/dotenv/compare/v12.0.2...v12.0.3) (2022-01-15) - -### Changed - -* Simplified jsdoc for consistency across editors - -## [12.0.2](https://github.com/motdotla/dotenv/compare/v12.0.1...v12.0.2) (2022-01-15) - -### Changed - -* Improve embedded jsdoc type documentation - -## [12.0.1](https://github.com/motdotla/dotenv/compare/v12.0.0...v12.0.1) (2022-01-15) - -### Changed - -* README updates and clarifications - -## [12.0.0](https://github.com/motdotla/dotenv/compare/v11.0.0...v12.0.0) (2022-01-15) - -### Removed - -- _Breaking:_ drop support for Flow static type checker ([#584](https://github.com/motdotla/dotenv/pull/584)) - -### Changed - -- Move types/index.d.ts to lib/main.d.ts ([#585](https://github.com/motdotla/dotenv/pull/585)) -- Typescript cleanup ([#587](https://github.com/motdotla/dotenv/pull/587)) -- Explicit typescript inclusion in package.json ([#566](https://github.com/motdotla/dotenv/pull/566)) - -## [11.0.0](https://github.com/motdotla/dotenv/compare/v10.0.0...v11.0.0) (2022-01-11) - -### Changed - -- _Breaking:_ drop support for Node v10 ([#558](https://github.com/motdotla/dotenv/pull/558)) -- Patch debug option ([#550](https://github.com/motdotla/dotenv/pull/550)) - -## [10.0.0](https://github.com/motdotla/dotenv/compare/v9.0.2...v10.0.0) (2021-05-20) - -### Added - -- Add generic support to parse function -- Allow for import "dotenv/config.js" -- Add support to resolve home directory in path via ~ - -## [9.0.2](https://github.com/motdotla/dotenv/compare/v9.0.1...v9.0.2) (2021-05-10) - -### Changed - -- Support windows newlines with debug mode - -## [9.0.1](https://github.com/motdotla/dotenv/compare/v9.0.0...v9.0.1) (2021-05-08) - -### Changed - -- Updates to README - -## [9.0.0](https://github.com/motdotla/dotenv/compare/v8.6.0...v9.0.0) (2021-05-05) - -### Changed - -- _Breaking:_ drop support for Node v8 - -## [8.6.0](https://github.com/motdotla/dotenv/compare/v8.5.1...v8.6.0) (2021-05-05) - -### Added - -- define package.json in exports - -## [8.5.1](https://github.com/motdotla/dotenv/compare/v8.5.0...v8.5.1) (2021-05-05) - -### Changed - -- updated dev dependencies via npm audit - -## [8.5.0](https://github.com/motdotla/dotenv/compare/v8.4.0...v8.5.0) (2021-05-05) - -### Added - -- allow for `import "dotenv/config"` - -## [8.4.0](https://github.com/motdotla/dotenv/compare/v8.3.0...v8.4.0) (2021-05-05) - -### Changed - -- point to exact types file to work with VS Code - -## [8.3.0](https://github.com/motdotla/dotenv/compare/v8.2.0...v8.3.0) (2021-05-05) - -### Changed - -- _Breaking:_ drop support for Node v8 (mistake to be released as minor bump. later bumped to 9.0.0. see above.) - -## [8.2.0](https://github.com/motdotla/dotenv/compare/v8.1.0...v8.2.0) (2019-10-16) - -### Added - -- TypeScript types - -## [8.1.0](https://github.com/motdotla/dotenv/compare/v8.0.0...v8.1.0) (2019-08-18) - -### Changed - -- _Breaking:_ drop support for Node v6 ([#392](https://github.com/motdotla/dotenv/issues/392)) - -# [8.0.0](https://github.com/motdotla/dotenv/compare/v7.0.0...v8.0.0) (2019-05-02) - -### Changed - -- _Breaking:_ drop support for Node v6 ([#302](https://github.com/motdotla/dotenv/issues/392)) - -## [7.0.0] - 2019-03-12 - -### Fixed - -- Fix removing unbalanced quotes ([#376](https://github.com/motdotla/dotenv/pull/376)) - -### Removed - -- Removed `load` alias for `config` for consistency throughout code and documentation. - -## [6.2.0] - 2018-12-03 - -### Added - -- Support preload configuration via environment variables ([#351](https://github.com/motdotla/dotenv/issues/351)) - -## [6.1.0] - 2018-10-08 - -### Added - -- `debug` option for `config` and `parse` methods will turn on logging - -## [6.0.0] - 2018-06-02 - -### Changed - -- _Breaking:_ drop support for Node v4 ([#304](https://github.com/motdotla/dotenv/pull/304)) - -## [5.0.0] - 2018-01-29 - -### Added - -- Testing against Node v8 and v9 -- Documentation on trim behavior of values -- Documentation on how to use with `import` - -### Changed - -- _Breaking_: default `path` is now `path.resolve(process.cwd(), '.env')` -- _Breaking_: does not write over keys already in `process.env` if the key has a falsy value -- using `const` and `let` instead of `var` - -### Removed - -- Testing against Node v7 - -## [4.0.0] - 2016-12-23 - -### Changed - -- Return Object with parsed content or error instead of false ([#165](https://github.com/motdotla/dotenv/pull/165)). - -### Removed - -- `verbose` option removed in favor of returning result. - -## [3.0.0] - 2016-12-20 - -### Added - -- `verbose` option will log any error messages. Off by default. -- parses email addresses correctly -- allow importing config method directly in ES6 - -### Changed - -- Suppress error messages by default ([#154](https://github.com/motdotla/dotenv/pull/154)) -- Ignoring more files for NPM to make package download smaller - -### Fixed - -- False positive test due to case-sensitive variable ([#124](https://github.com/motdotla/dotenv/pull/124)) - -### Removed - -- `silent` option removed in favor of `verbose` - -## [2.0.0] - 2016-01-20 - -### Added - -- CHANGELOG to ["make it easier for users and contributors to see precisely what notable changes have been made between each release"](http://keepachangelog.com/). Linked to from README -- LICENSE to be more explicit about what was defined in `package.json`. Linked to from README -- Testing nodejs v4 on travis-ci -- added examples of how to use dotenv in different ways -- return parsed object on success rather than boolean true - -### Changed - -- README has shorter description not referencing ruby gem since we don't have or want feature parity - -### Removed - -- Variable expansion and escaping so environment variables are encouraged to be fully orthogonal - -## [1.2.0] - 2015-06-20 - -### Added - -- Preload hook to require dotenv without including it in your code - -### Changed - -- clarified license to be "BSD-2-Clause" in `package.json` - -### Fixed - -- retain spaces in string vars - -## [1.1.0] - 2015-03-31 - -### Added - -- Silent option to silence `console.log` when `.env` missing - -## [1.0.0] - 2015-03-13 - -### Removed - -- support for multiple `.env` files. should always use one `.env` file for the current environment - -[7.0.0]: https://github.com/motdotla/dotenv/compare/v6.2.0...v7.0.0 -[6.2.0]: https://github.com/motdotla/dotenv/compare/v6.1.0...v6.2.0 -[6.1.0]: https://github.com/motdotla/dotenv/compare/v6.0.0...v6.1.0 -[6.0.0]: https://github.com/motdotla/dotenv/compare/v5.0.0...v6.0.0 -[5.0.0]: https://github.com/motdotla/dotenv/compare/v4.0.0...v5.0.0 -[4.0.0]: https://github.com/motdotla/dotenv/compare/v3.0.0...v4.0.0 -[3.0.0]: https://github.com/motdotla/dotenv/compare/v2.0.0...v3.0.0 -[2.0.0]: https://github.com/motdotla/dotenv/compare/v1.2.0...v2.0.0 -[1.2.0]: https://github.com/motdotla/dotenv/compare/v1.1.0...v1.2.0 -[1.1.0]: https://github.com/motdotla/dotenv/compare/v1.0.0...v1.1.0 -[1.0.0]: https://github.com/motdotla/dotenv/compare/v0.4.0...v1.0.0 diff --git a/node_modules/c12/node_modules/dotenv/README-es.md b/node_modules/c12/node_modules/dotenv/README-es.md deleted file mode 100644 index 5fc934d..0000000 --- a/node_modules/c12/node_modules/dotenv/README-es.md +++ /dev/null @@ -1,411 +0,0 @@ -
-🎉 announcing dotenvx. run anywhere, multi-environment, encrypted envs. -
- -  - - - -# dotenv [![NPM version](https://img.shields.io/npm/v/dotenv.svg?style=flat-square)](https://www.npmjs.com/package/dotenv) - -dotenv - -Dotenv es un módulo de dependencia cero que carga las variables de entorno desde un archivo `.env` en [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env). El almacenamiento de la configuración del entorno separado del código está basado en la metodología [The Twelve-Factor App](http://12factor.net/config). - -[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) -[![LICENSE](https://img.shields.io/github/license/motdotla/dotenv.svg)](LICENSE) - -## Instalación - -```bash -# instalación local (recomendado) -npm install dotenv --save -``` - -O installación con yarn? `yarn add dotenv` - -## Uso - -Cree un archivo `.env` en la raíz de su proyecto: - -```dosini -S3_BUCKET="YOURS3BUCKET" -SECRET_KEY="YOURSECRETKEYGOESHERE" -``` - -Tan prónto como sea posible en su aplicación, importe y configure dotenv: - -```javascript -require('dotenv').config() -console.log(process.env) // elimine esto después que haya confirmado que esta funcionando -``` - -.. o usa ES6? - -```javascript -import * as dotenv from 'dotenv' // vea en https://github.com/motdotla/dotenv#como-uso-dotenv-con-import -// REVISAR LINK DE REFERENCIA DE IMPORTACIÓN -dotenv.config() -import express from 'express' -``` - -Eso es todo. `process.env` ahora tiene las claves y los valores que definiste en tu archivo `.env`: - -```javascript -require('dotenv').config() - -... - -s3.getBucketCors({Bucket: process.env.S3_BUCKET}, function(err, data) {}) -``` - -### Valores multilínea - -Si necesita variables de varias líneas, por ejemplo, claves privadas, ahora se admiten en la versión (`>= v15.0.0`) con saltos de línea: - -```dosini -PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- -... -Kh9NV... -... ------END RSA PRIVATE KEY-----" -``` - -Alternativamente, puede usar comillas dobles y usar el carácter `\n`: - -```dosini -PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END RSA PRIVATE KEY-----\n" -``` - -### Comentarios - -Los comentarios pueden ser agregados en tu archivo o en la misma línea: - -```dosini -# This is a comment -SECRET_KEY=YOURSECRETKEYGOESHERE # comment -SECRET_HASH="something-with-a-#-hash" -``` - -Los comentarios comienzan donde existe un `#`, entonces, si su valor contiene un `#`, enciérrelo entre comillas. Este es un cambio importante desde la versión `>= v15.0.0` en adelante. - -### Análisis - -El motor que analiza el contenido de su archivo que contiene variables de entorno está disponible para su uso. Este Acepta una Cadena o un Búfer y devolverá un Objeto con las claves y los valores analizados. - -```javascript -const dotenv = require('dotenv') -const buf = Buffer.from('BASICO=basico') -const config = dotenv.parse(buf) // devolverá un objeto -console.log(typeof config, config) // objeto { BASICO : 'basico' } -``` - -### Precarga - -Puede usar el `--require` (`-r`) [opción de línea de comando](https://nodejs.org/api/cli.html#-r---require-module) para precargar dotenv. Al hacer esto, no necesita requerir ni cargar dotnev en el código de su aplicación. - -```bash -$ node -r dotenv/config tu_script.js -``` - -Las opciones de configuración a continuación se admiten como argumentos de línea de comandos en el formato `dotenv_config_