- Реструктуризация: src/ разбит на middleware/, utils/, repositories/ (удалены), routes/ (удалены) - Добавлен src/original-html.ts — полный HTML с reportModal - Добавлен src/index.tsx.backup — React-компонент с reportModal - Миграции переименованы (0001_initial_schema.sql) - Добавлена миграция 0018 (удалена позже) - Docker: multi-stage build, wrangler.toml - Frontend: public/static/app.js + style.css - seed.sql добавлен - Документация: CHANGELOG, CHANGES_v4.1.0-4.1.9, PROJECT_STRUCTURE
229 lines
7.7 KiB
Markdown
229 lines
7.7 KiB
Markdown
# DB FIX v4.1.7 - Fix Login and Remove tootmine User
|
||
|
||
**Дата:** 2025-12-30
|
||
**Версия:** v4.1.7
|
||
**Тип:** Database Fix + Security Update
|
||
|
||
---
|
||
|
||
## Проблема
|
||
|
||
1. **Login failed** - все попытки логина возвращали ошибку
|
||
2. Пользователь `tootmine` нужно удалить (дубликат kasutaja)
|
||
|
||
---
|
||
|
||
## Анализ Проблемы
|
||
|
||
### 1. Несовпадение хэшей паролей
|
||
- **Бэкап БД**: использовал bcrypt хэши (`$2a$...`)
|
||
- **Код приложения**: использует SHA-256 хэши
|
||
- **Результат**: `verifyPassword()` не могла проверить пароли
|
||
|
||
### 2. Отсутствие колонки deleted_at
|
||
- Код: `WHERE deleted_at IS NULL`
|
||
- БД: колонка `deleted_at` отсутствовала в таблице `users`
|
||
- **Результат**: SQL ошибка → 500 Internal Server Error
|
||
|
||
---
|
||
|
||
## Решение
|
||
|
||
### 1. Обновление паролей (SHA-256)
|
||
```sql
|
||
-- admin / demo123
|
||
UPDATE users SET password_hash = 'd3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791'
|
||
WHERE username = 'admin';
|
||
|
||
-- aknaproff / demo123
|
||
UPDATE users SET password_hash = 'd3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791'
|
||
WHERE username = 'aknaproff';
|
||
|
||
-- kasutaja / tootmine
|
||
UPDATE users SET password_hash = 'a1026b7bd143f7190248bc79901e9a357a408e208f2d8e4d38fccf184754f35f'
|
||
WHERE username = 'kasutaja';
|
||
```
|
||
|
||
### 2. Удаление пользователя tootmine
|
||
```sql
|
||
DELETE FROM users WHERE username = 'tootmine';
|
||
```
|
||
|
||
### 3. Добавление колонки deleted_at
|
||
```sql
|
||
-- Для таблицы users
|
||
ALTER TABLE users ADD COLUMN deleted_at DATETIME DEFAULT NULL;
|
||
|
||
-- Для таблицы production_records (уже добавлено ранее)
|
||
ALTER TABLE production_records ADD COLUMN deleted_at DATETIME DEFAULT NULL;
|
||
```
|
||
|
||
---
|
||
|
||
## Текущее Состояние БД
|
||
|
||
### Пользователи (3 total)
|
||
| ID | Username | Password | Role | Access |
|
||
|----|----------|----------|------|--------|
|
||
| 1 | admin | demo123 | admin | Полный доступ |
|
||
| 2 | aknaproff | demo123 | admin | Полный доступ |
|
||
| 4 | kasutaja | tootmine | user | Просмотр + проблемы |
|
||
|
||
**Удалено:**
|
||
- ~~3. tootmine / tootmine / user~~ ❌ (дубликат, удалён)
|
||
|
||
### Production Records
|
||
- **Всего записей:** 38
|
||
- **Годы:** 2025, 2026
|
||
- **Месяцы:** Январь-Декабрь
|
||
|
||
### Schema Updates
|
||
✅ `users.deleted_at` - добавлена
|
||
✅ `production_records.deleted_at` - добавлена
|
||
✅ Все индексы сохранены
|
||
|
||
---
|
||
|
||
## Тестирование
|
||
|
||
### Backend API Tests
|
||
```bash
|
||
# ✅ Admin login
|
||
curl -X POST http://localhost:3000/api/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"admin","password":"demo123"}'
|
||
# → success: true, token: eyJ1c2VySWQiOjE...
|
||
|
||
# ✅ Aknaproff login
|
||
curl -X POST http://localhost:3000/api/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"aknaproff","password":"demo123"}'
|
||
# → success: true, token: eyJ1c2VySWQiOjI...
|
||
|
||
# ✅ Kasutaja login
|
||
curl -X POST http://localhost:3000/api/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"kasutaja","password":"tootmine"}'
|
||
# → success: true, token: eyJ1c2VySWQiOjQ...
|
||
```
|
||
|
||
### Frontend Tests
|
||
- ✅ Страница загружается
|
||
- ✅ Форма логина отображается
|
||
- ✅ Вход admin работает
|
||
- ✅ Вход aknaproff работает
|
||
- ✅ Вход kasutaja работает
|
||
- ✅ Guest режим работает
|
||
- ✅ Таблица с данными отображается
|
||
- ✅ Нет JavaScript ошибок
|
||
|
||
---
|
||
|
||
## Deployment на Production
|
||
|
||
### ⚠️ КРИТИЧНО: База данных изменена
|
||
|
||
Нужно выполнить 3 SQL команды на production:
|
||
|
||
```bash
|
||
# 1. Добавить колонку deleted_at в users
|
||
docker-compose exec aknaproff-backend sh -c \
|
||
"npx wrangler d1 execute webapp-production --local --command='ALTER TABLE users ADD COLUMN deleted_at DATETIME DEFAULT NULL'"
|
||
|
||
# 2. Удалить пользователя tootmine
|
||
docker-compose exec aknaproff-backend sh -c \
|
||
"npx wrangler d1 execute webapp-production --local --command='DELETE FROM users WHERE username = \"tootmine\"'"
|
||
|
||
# 3. Обновить пароли (SHA-256)
|
||
docker-compose exec aknaproff-backend sh -c \
|
||
"npx wrangler d1 execute webapp-production --local --command='
|
||
UPDATE users SET password_hash = \"d3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791\" WHERE username = \"admin\";
|
||
UPDATE users SET password_hash = \"d3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791\" WHERE username = \"aknaproff\";
|
||
UPDATE users SET password_hash = \"a1026b7bd143f7190248bc79901e9a357a408e208f2d8e4d38fccf184754f35f\" WHERE username = \"kasutaja\"
|
||
'"
|
||
```
|
||
|
||
### Проверка после deployment
|
||
```bash
|
||
# Проверить пользователей
|
||
docker-compose exec aknaproff-backend sh -c \
|
||
"npx wrangler d1 execute webapp-production --local --command='SELECT username, role FROM users'"
|
||
|
||
# Должно вернуть:
|
||
# admin | admin
|
||
# aknaproff | admin
|
||
# kasutaja | user
|
||
# (3 пользователя, tootmine удалён)
|
||
```
|
||
|
||
---
|
||
|
||
## Файлы для Копирования
|
||
|
||
**НЕ ТРЕБУЕТСЯ** - код не изменён, только база данных.
|
||
|
||
Если нужно обновить код (для v4.1.6):
|
||
```bash
|
||
# Быстрый вариант (рекомендуется)
|
||
scp dist/_worker.js user@server:/path/to/webapp/dist/
|
||
docker-compose restart
|
||
|
||
# ИЛИ Полный вариант
|
||
scp public/static/app.js user@server:/path/to/webapp/public/static/
|
||
scp public/original.html user@server:/path/to/webapp/public/
|
||
scp src/original-html.ts user@server:/path/to/webapp/src/
|
||
cd /path/to/webapp && npm run build && docker-compose restart
|
||
```
|
||
|
||
---
|
||
|
||
## Статус
|
||
|
||
- **Версия:** v4.1.7 (DB Fix)
|
||
- **Код:** v4.1.6 (без изменений)
|
||
- **База данных:** ✅ Исправлена
|
||
- **Production URL:** https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai
|
||
- **HTTP Status:** 200 OK
|
||
- **JavaScript Errors:** 0
|
||
- **Login Status:** ✅ Работает для всех пользователей
|
||
|
||
---
|
||
|
||
## Changelog
|
||
|
||
### v4.1.7 (2025-12-30) - Database Fix
|
||
- 🔧 **FIX:** Обновлены пароли с bcrypt на SHA-256
|
||
- 🔧 **FIX:** Добавлена колонка `deleted_at` в таблицу `users`
|
||
- 🗑️ **REMOVE:** Удалён пользователь `tootmine` (дубликат kasutaja)
|
||
- ✅ **VERIFY:** Все логины работают (admin, aknaproff, kasutaja)
|
||
- 📊 **DB:** 3 пользователя, 38 production записей
|
||
|
||
---
|
||
|
||
## Security Notes
|
||
|
||
### Пароли (SHA-256)
|
||
⚠️ **ВАЖНО:** SHA-256 используется для demo, в production рекомендуется bcrypt
|
||
|
||
**Текущие хэши:**
|
||
- `demo123` → `d3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791`
|
||
- `tootmine` → `a1026b7bd143f7190248bc79901e9a357a408e208f2d8e4d38fccf184754f35f`
|
||
|
||
### Рекомендации
|
||
1. В production использовать bcrypt или argon2
|
||
2. Включить rate limiting для /api/auth/login
|
||
3. Добавить CSRF защиту
|
||
4. Использовать HTTPS только
|
||
|
||
---
|
||
|
||
## Итог
|
||
|
||
✅ **Проблема решена:**
|
||
- Login работает для всех пользователей
|
||
- Пользователь tootmine удалён
|
||
- База данных полностью совместима с кодом v4.1.6
|
||
|
||
🎯 **Готово к deployment на production**
|
||
Не забудьте выполнить SQL команды на production сервере!
|