Initial commit: Edu Helper (Docker, React, Express, Prisma)

Made-with: Cursor
This commit is contained in:
Константин Лебединский
2026-04-01 21:40:51 +05:00
commit 3dec3ea720
75 changed files with 13806 additions and 0 deletions
+118
View File
@@ -0,0 +1,118 @@
# Edu Helper
Веб-приложение для обучения с ИИ: чат, вопросы, учебники, тесты, «Зал» с фотографиями по датам. Два типа пользователей — **наставник** и **ученик** (роли и связка наставник ↔ ученик задаются в БД).
## Стек
- **Frontend:** React 19, Vite, TypeScript, Tailwind CSS
- **Backend:** Node.js, Express, Prisma ORM
- **БД:** PostgreSQL 16
- **ИИ:** DeepSeek API (ключ в настройках или переменной окружения)
- **Деплой:** Docker Compose (один контейнер с API + статикой фронта, отдельно Postgres)
## Требования
- [Docker](https://docs.docker.com/get-docker/) и Docker Compose (для продакшен-сборки)
- или **Node.js 22+** и локальный PostgreSQL (для разработки без Docker)
## Быстрый старт (Docker)
1. Склонируйте репозиторий и перейдите в каталог проекта.
2. Создайте файл `.env` в **корне** репозитория (можно скопировать шаблон):
```bash
cp .env.docker.example .env
```
3. Отредактируйте `.env`:
- задайте **`JWT_SECRET`** — длинная случайная строка (не короткий пароль);
- задайте **`SEED_TUTOR_PASSWORD`** и **`SEED_STUDENT_PASSWORD`** — пароли первых пользователей (создаются только при пустой таблице `User`);
- при необходимости укажите **`DEEPSEEK_API_KEY`**;
- для работы по **HTTPS** за прокси выставьте **`COOKIE_SECURE=true`**; для обычного **http://localhost** оставьте **`COOKIE_SECURE=false`**, иначе cookie с сессией не установится.
4. Запуск:
```bash
docker compose up -d --build
```
5. Откройте в браузере: **http://localhost:3000** (или порт из `APP_PORT` в `.env`).
6. Проверка API:
```bash
curl http://localhost:3000/api/health
```
При первом старте контейнер приложения выполняет `prisma migrate deploy` и сид пользователей (если пользователей ещё нет).
### Тома данных
- **`pgdata`** — данные PostgreSQL. Пароль пользователя БД задаётся в **`POSTGRES_PASSWORD`** только при **первом** создании тома. Если сменить пароль в `.env` позже, сам PostgreSQL **не** пересоздаст пароль автоматически — приложение не подключится (ошибка Prisma `P1000`). Варианты: вернуть в `.env` старый пароль, либо сменить пароль вручную в Postgres, либо **один раз** пересоздать том (данные БД пропадут):
```bash
docker compose down -v
docker compose up -d --build
```
- **`uploads`** — загруженные файлы «Зала».
## Локальная разработка (без Docker)
1. Поднимите PostgreSQL и создайте базу (например `edu_helper`).
2. В каталоге **`backend`** создайте `.env` с `DATABASE_URL` и остальными переменными по аналогии с корневым `.env.docker.example`.
3. Установка и миграции:
```bash
cd backend && npm ci && npx prisma migrate deploy
```
4. Запуск бэкенда (по умолчанию порт **3001**):
```bash
npm run dev
```
5. В другом терминале — фронт:
```bash
cd frontend && npm ci && npm run dev
```
Vite откроется на **http://localhost:5173**; запросы к `/api` проксируются на бэкенд (см. `frontend/vite.config.ts`).
Корневой скрипт **`npm run dev`** (из корня репозитория, после `npm install` в корне) поднимает backend и frontend одновременно через `concurrently`.
## Структура репозитория
| Путь | Назначение |
|------|------------|
| `frontend/` | SPA (React + Vite) |
| `backend/` | API, Prisma-схема и миграции |
| `Dockerfile` | Сборка фронта и бэка, один образ Node |
| `docker-compose.yml` | Сервисы `app` и `db`, тома `pgdata` и `uploads` |
| `docker-entrypoint.sh` | Миграции Prisma и сид перед стартом Node |
| `.env.docker.example` | Шаблон переменных для Docker |
Файл **`.env`** в git не коммитится (см. `.gitignore`).
## Переменные окружения (кратко)
| Переменная | Описание |
|------------|----------|
| `POSTGRES_*` | Пользователь, пароль и имя БД для контейнера Postgres |
| `DATABASE_URL` | Строка подключения Prisma (в Docker задаётся из `POSTGRES_*`) |
| `JWT_SECRET` | Секрет подписи JWT (обязательно задать) |
| `SEED_*_USERNAME` / `SEED_*_PASSWORD` | Логины и пароли для первичного сида |
| `DEEPSEEK_API_KEY` | Опционально: ключ API по умолчанию |
| `COOKIE_SECURE` | `true` только при HTTPS |
| `APP_PORT` | Проброс порта хоста на контейнер приложения (по умолчанию 3000) |
Полный список и комментарии — в **`.env.docker.example`**.
## Лицензия
Укажите лицензию при необходимости (файл `LICENSE`).