Edit: /opt/canhelp/STACK.md (3745B)
# CanHelp — Tech Stack
**Проект:** Marketplace для услуг в Греции (клон kabanchik.ua)
---
## Монорепо
```
CanHelp/
├── apps/
│ ├── api/ # Hono + Drizzle + Better Auth (Node.js)
│ ├── web/ # Next.js 15 (App Router)
│ └── mobile/ # Flutter (iOS, Android)
├── packages/
│ ├── db/ # Drizzle ORM schema + migrations (shared)
│ └── shared/ # TypeScript types (shared)
├── turbo.json
├── docker-compose.yml
└── .env
```
Monorepo manager: **npm workspaces + Turborepo**
---
## Backend (apps/api)
| Компонент | Технология |
|--------------|-------------------------------|
| Runtime | Node.js |
| Framework | **Hono** 4.x |
| ORM | **Drizzle ORM** 0.38 |
| Database | PostgreSQL 16 |
| Auth | **Better Auth** 1.2 (+ Bearer plugin) |
| Cache | Redis 7 (ioredis) |
| WebSockets | Socket.IO 4.x |
| Validation | Zod |
| Dev runner | tsx (watch mode) |
API endpoint base: `http://localhost:4000/api`
Auth endpoints: `/api/auth/**` (Better Auth)
### Модули
- `auth` — Better Auth (email/password, cookie sessions, Bearer token for mobile)
- `users` — профиль, обновление
- `tasks` — CRUD, поиск, статусы
- `offers` — ставки специалистов
- `chat` — комнаты + сообщения (REST + WebSocket)
- `reviews` — отзывы и рейтинги
- `notifications` — 7 типов уведомлений
- `favorites` — закладки
- `categories` — 9 категорий (кэш Redis)
- `uploads` — загрузка изображений (5MB, JPEG/PNG/GIF/WebP)
- `reports` — жалобы + модерация
- `admin` — статистика, управление
- `i18n` — переводы (el, en, ru)
- `health` — health check
---
## Web (apps/web)
| Компонент | Технология |
|--------------|-------------------------------|
| Framework | **Next.js 15** (App Router) |
| React | React 19 |
| Styling | **Tailwind CSS 3** |
| Auth client | `better-auth/react` |
| API client | fetch (кастомный, src/lib/api.ts) |
| Real-time | socket.io-client |
| Types | @canhelp/shared |
Порт: 3000. SSR для страниц задач (SEO).
---
## Mobile (apps/mobile)
| Компонент | Технология |
|--------------|-------------------------------|
| Framework | **Flutter** (Dart 3.10+) |
| Target | iOS, Android |
| Auth | Better Auth Bearer token |
| State | Provider |
| Routing | go_router |
---
## Shared packages
- **@canhelp/db** — Drizzle schema (все таблицы), db client
- **@canhelp/shared** — TypeScript типы (User, Task, Offer и т.д.)
---
## Infrastructure
- **Docker Compose**: PostgreSQL 16 + Redis 7
- **Turborepo**: инкрементальные билды
- Env: `.env` в корне (один для всех)
---
## Env variables
```env
NODE_ENV=development
API_PORT=4000
WEB_URL=http://localhost:3000
DATABASE_URL=postgresql://canhelp:canhelp@localhost:5432/canhelp
REDIS_URL=redis://localhost:6379
BETTER_AUTH_SECRET=...
BETTER_AUTH_URL=http://localhost:4000
DEFAULT_LOCALE=el
DEFAULT_CURRENCY=EUR
UPLOAD_DIR=./uploads
MAX_FILE_SIZE_MB=5
```