Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
4981906
Fix error_rate calculation in updateQuestionStats
alexbrestby Nov 13, 2025
04e80dd
Fix skipQuestion to log answers to backend correctly
alexbrestby Nov 13, 2025
8d67dda
SECURITY: Fix .env exposure vulnerability in deployment docs
alexbrestby Nov 13, 2025
e1e535c
feat: file structure update
alexbrestby Nov 13, 2025
74a21a4
feat: Implement comprehensive secure exam system with anti-cheat prot…
alexbrestby Nov 14, 2025
4264ac1
fix: Add localhost:3000 to CORS allowed origins
alexbrestby Nov 14, 2025
5ffe274
fix: Fix result screen showing zeros before page refresh
alexbrestby Nov 15, 2025
d8f2e43
feat: Add ability to continue test after viewing intermediate results
alexbrestby Nov 15, 2025
bd3e05f
fix: Correct API endpoint URL for session stats
alexbrestby Nov 15, 2025
a132701
feat: Disable header click during active test session
alexbrestby Nov 15, 2025
c5003c8
feat: Add favicon with hazard class 4 warning sign
alexbrestby Nov 15, 2025
5abdc8b
feat: Add Telegram bot with /difficult command
alexbrestby Nov 15, 2025
3cbd5b3
refactor: Comprehensive monorepo restructuring
alexbrestby Nov 15, 2025
7fe21cd
fix: Correct .env file path loading in server.js
alexbrestby Nov 15, 2025
064bbb9
feat: Auto-hide DevTools warning after 5 seconds
alexbrestby Nov 16, 2025
c57f276
fix: db migration path
alexbrestby Nov 16, 2025
c1beed3
feat: Add comprehensive deployment configuration for VPS
alexbrestby Nov 16, 2025
d6f8549
fix: Add catch-all route for frontend index.html
alexbrestby Nov 17, 2025
8774945
fix: Prevent catch-all route from intercepting static files
alexbrestby Nov 17, 2025
1163898
fix: Update image paths after monorepo restructuring
alexbrestby Nov 17, 2025
06d4565
feat: Add beautiful gradient style for exit button
alexbrestby Nov 17, 2025
6850e65
style: Change exit button to elegant dark gradient
alexbrestby Nov 17, 2025
adb0e76
feat: Add detailed question display on statistics page
alexbrestby Nov 19, 2025
3847538
feat: Add statistics button to main page and update configuration
alexbrestby Nov 19, 2025
da13e52
fix: Update API base URL to use port 3001
alexbrestby Nov 19, 2025
18f0cde
fix: Add port 3001 to CORS allowed origins
alexbrestby Nov 19, 2025
08080f3
feat: Filter statistics to include only completed tests with 45+ ques…
alexbrestby Nov 20, 2025
cde1ce4
refactor: Update user statistics label for clarity
alexbrestby Nov 21, 2025
85e1fbd
fix: Correct database path in migration script
alexbrestby Nov 21, 2025
6089822
feat: Add Dockerfile and dockerignore for backend
alexbrestby Nov 21, 2025
80d8692
fix: Standardize all port configurations to 3001
alexbrestby Nov 21, 2025
c37fd12
fix: Correct skip question logic to always record as incorrect
alexbrestby Nov 21, 2025
5db7774
security: Add session token validation to /api/session-end endpoint
alexbrestby Nov 21, 2025
e456127
fix: Add database location migration to preserve existing data during…
alexbrestby Nov 21, 2025
0ddf1c4
security: Add token validation and sanitize GET /api/stats/session/:i…
alexbrestby Nov 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
node_modules
npm-debug.log
.git
.gitignore
.env
*.log
*.db
*.sqlite
*.sqlite3
.vscode
.idea
README.md
docs/
scripts/
.DS_Store
16 changes: 15 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,20 @@ Desktop.ini
npm-debug.log*
yarn-debug.log*
yarn-error.log*
backend/logs/
logs/

# Environment variables
.env
.env.local
.env.*.local
backend/.env

# Database files (for future backend)
# Database files
*.db
*.sqlite
*.sqlite3
backend/statistics.db

# Node modules (for future backend)
node_modules/
Expand All @@ -44,3 +48,13 @@ temp/
# Build artifacts (if any)
dist/
build/

# Backups
backups/
*.backup
*.bak

# PM2
.pm2/
pids/
*.pid
102 changes: 102 additions & 0 deletions MIGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# Миграция базы данных

## Обновление расположения базы данных

В версии после коммита от 2025-01-XX база данных была перемещена из `backend/statistics.db` в `backend/src/config/statistics.db`.

### Для существующих установок

Если у вас уже есть работающее приложение с данными в старом расположении, выполните миграцию:

#### Вариант 1: Автоматическая миграция через deploy.sh

При следующем запуске `./deploy.sh` миграция произойдет автоматически:
- Старая БД будет перемещена в новое расположение
- Схема будет обновлена для новых полей
- Все данные сохранятся

```bash
./deploy.sh
```

#### Вариант 2: Ручная миграция

Если вы хотите выполнить миграцию вручную перед деплоем:

```bash
cd backend
npm run migrate:db-location
```

Скрипт автоматически:
1. Создаст директорию `src/config` если её нет
2. Создаст резервную копию старой БД с временной меткой
3. Переместит БД в новое расположение
4. Обновит схему для новых полей (session_token, question_ids, etc.)

### Для новых установок

Новые установки автоматически создадут БД в правильном расположении при первом запуске миграций:

```bash
cd backend
npm run migrate:questions
```

### Откат изменений

Если что-то пошло не так, вы можете восстановить данные из резервной копии:

```bash
cd backend
# Найдите резервную копию (файл вида statistics.db.backup.YYYYMMDD_HHMMSS)
ls -la statistics.db.backup.*

# Восстановите из резервной копии
cp statistics.db.backup.YYYYMMDD_HHMMSS statistics.db
```

### Проверка статуса

После миграции убедитесь, что:
1. Файл `backend/src/config/statistics.db` существует
2. Приложение запускается без ошибок
3. Статистика отображается корректно на `/stats`

```bash
# Проверка наличия БД
ls -lh backend/src/config/statistics.db

# Запуск приложения
cd backend
npm start

# Или через PM2
pm2 restart ogtest
pm2 logs ogtest
```

### Важные замечания

⚠️ **Не удаляйте** резервную копию `statistics.db.backup.*` до тех пор, пока не убедитесь, что приложение работает корректно с новым расположением БД.

⚠️ При обновлении через **Docker** убедитесь, что volume указывает на правильный путь:
```yaml
volumes:
- ./backend/src/config/statistics.db:/app/src/config/statistics.db
```

## Обновление схемы базы данных

Для добавления новых полей в существующую БД (без изменения расположения):

```bash
cd backend
npm run migrate:db
```

Это добавит недостающие столбцы:
- `session_token` - токен аутентификации сессии
- `question_ids` - список вопросов в JSON
- `current_question_index` - индекс текущего вопроса
- `focus_switches` - счетчик переключений фокуса
171 changes: 91 additions & 80 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,67 @@
- Отправка результатов в Telegram
- Аналитика по сложным вопросам

## ⚠️ Безопасность

**ВАЖНО!** При развертывании на VPS:

1. **Файл .env содержит секретные данные** (Telegram токен)
2. **НИКОГДА не коммитьте .env в Git** (уже в .gitignore ✅)
3. **Веб-сервер ОБЯЗАТЕЛЬНО должен блокировать доступ к .env**
- **Nginx**: См. конфигурацию ниже с правилами `deny all`
- **Apache**: Файл `.htaccess` уже включен в репозиторий ✅
- Без этого `.env` будет доступен по URL `https://domain/.env`
4. **Проверьте после деплоя**:
```bash
curl https://yourdomain/.env
# Должно вернуть: 404 Not Found или 403 Forbidden

curl https://yourdomain/.git/config
# Должно вернуть: 404 Not Found или 403 Forbidden
```

## Структура проекта

```
ogtest/
├── index.html # Frontend - главная страница
├── app.js # Frontend - логика приложения
├── style.css # Frontend - стили
├── questions_data.json # База вопросов
├── img/ # Изображения к вопросам
├── backend/ # Backend API
│ ├── server.js # Express сервер
│ ├── database.js # Работа с SQLite
│ ├── telegram.js # Telegram интеграция
│ ├── package.json # Зависимости Node.js
│ └── statistics.db # База данных (создается автоматически)
├── .env # Конфигурация (не в Git)
└── .env.example # Пример конфигурации
├── frontend/ # Frontend приложение
│ ├── index.html # Главная страница
│ ├── public/ # Статические ресурсы
│ │ ├── favicon.svg # Иконка сайта
│ │ └── img/ # Изображения к вопросам
│ └── src/ # Исходный код
│ ├── app.js # Логика приложения
│ ├── security.js # Модуль защиты от читерства
│ └── style.css # Стили
├── backend/ # Backend API
│ ├── src/ # Исходный код
│ │ ├── config/
│ │ │ └── database.js # Работа с SQLite
│ │ ├── services/
│ │ │ └── telegram.js # Telegram интеграция
│ │ └── server.js # Express сервер
│ ├── scripts/ # Скрипты миграций
│ │ ├── migrate-database.js # Миграция схемы БД
│ │ └── migrate-questions.js # Импорт вопросов из JSON
│ ├── data/ # Данные
│ │ └── questions_data.json # База вопросов
│ ├── package.json # Зависимости Node.js
│ ├── statistics.db # База данных (создается автоматически)
│ ├── .env # Конфигурация (не в Git)
│ └── .env.example # Пример конфигурации
├── docs/ # Документация
│ ├── API.md # Описание API endpoints
│ ├── DATABASE.md # Схема базы данных
│ ├── DEPLOYMENT.md # Руководство по деплою
│ └── TELEGRAM.md # Telegram бот
├── scripts/ # Скрипты автоматизации
│ └── setup.sh # Скрипт настройки проекта
├── ecosystem.config.js # PM2 конфигурация
├── deploy.sh # Скрипт деплоя
├── docker-compose.yml # Docker конфигурация
├── .gitignore # Игнорируемые файлы
├── package.json # Root package (npm workspaces)
└── README.md # Документация
```

## Установка и запуск
Expand Down Expand Up @@ -63,9 +107,10 @@ npm install
- Напишите боту [@userinfobot](https://t.me/userinfobot)
- Скопируйте ваш ID

3. Создайте файл `.env` в корне проекта:
3. Создайте файл `.env` в папке `backend`:

```bash
cd backend
cp .env.example .env
```

Expand Down Expand Up @@ -150,89 +195,55 @@ npm run dev

## Деплой на VPS

### Требования
- Ubuntu/Debian
- Node.js 16+
- Nginx
- Домен (для SSL)

### Шаги развертывания
### Быстрый старт с PM2

1. **Клонирование на сервер**:
```bash
ssh user@your-vps
# На сервере
cd /var/www
git clone https://github.com/alexbrestpl/ogtest.git
cd ogtest/backend
npm install --production
```
cd ogtest

2. **Настройка .env**:
```bash
cp ../.env.example ../.env
nano ../.env
# Укажите продакшн настройки
```
# Настройка
./scripts/setup.sh

3. **Настройка Nginx**:
```nginx
server {
listen 80;
server_name test.domain.com;

# Frontend (статика)
location / {
root /var/www/ogtest;
index index.html;
try_files $uri $uri/ =404;
}

# Backend API
location /api {
proxy_pass http://localhost:3000;
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;
}
}
```

4. **Запуск backend с PM2**:
```bash
npm install -g pm2
cd /var/www/ogtest/backend
pm2 start server.js --name ogtest-backend
pm2 startup
# Запуск с PM2
pm2 start ecosystem.config.js
pm2 save
```

5. **Установка SSL (Let's Encrypt)**:
```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d test.domain.com
```
pm2 startup

6. **Проверка**:
```bash
pm2 status
# Настройка Nginx (см. nginx.conf.example)
sudo cp nginx.conf.example /etc/nginx/sites-available/ogtest
# Отредактируйте файл, заменив test.yourdomain.com на ваш домен
sudo ln -s /etc/nginx/sites-available/ogtest /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
```

Откройте https://test.domain.com
# Установка SSL
sudo certbot --nginx -d test.yourdomain.com
```

## Обновление
### Обновление приложения

```bash
cd /var/www/ogtest
git pull origin main
cd backend
npm install
pm2 restart ogtest-backend
./deploy.sh
```

### Подробная инструкция

Полное руководство по деплою с Nginx, PM2, SSL и мониторингом:
**📖 [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md)**

Включает:
- Установку всех зависимостей
- Настройку DNS и субдомена
- Конфигурацию Nginx
- Установку SSL сертификатов (Let's Encrypt)
- Настройку firewall
- Мониторинг и логи
- Решение проблем
- Бэкапы базы данных

## База данных

База данных SQLite (`backend/statistics.db`) создается автоматически при первом запуске.
Expand Down
9 changes: 9 additions & 0 deletions backend/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.DS_Store
logs
*.log
2 changes: 1 addition & 1 deletion .env.example → backend/.env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Настройки сервера
PORT=3000
PORT=3001
NODE_ENV=development

# Telegram Bot настройки
Expand Down
Loading