Files
Edu_helper/README.md
T
Константин Лебединский 3dec3ea720 Initial commit: Edu Helper (Docker, React, Express, Prisma)
Made-with: Cursor
2026-04-01 21:40:51 +05:00

119 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`).