v4.1.21: Реструктуризация проекта для Synology ARM

- Реструктуризация: 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
This commit is contained in:
Deploy Bot
2026-01-14 18:37:00 +02:00
parent 4898f5ec7f
commit 64403d6fd6
113 changed files with 19231 additions and 3084 deletions

629
DOCKER_GUIDE.md Normal file
View File

@@ -0,0 +1,629 @@
# 🐳 Docker Guide - AKNAPROFF Tootmine
## 📋 Оглавление
1. [Быстрый старт](#быстрый-старт)
2. [Структура файлов](#структура-файлов)
3. [Development режим](#development-режим)
4. [Production режим](#production-режим)
5. [База данных](#база-данных)
6. [Команды Docker](#команды-docker)
7. [Troubleshooting](#troubleshooting)
---
## 🚀 Быстрый старт
### Prerequisite
Установите Docker и Docker Compose:
- **Docker**: https://docs.docker.com/get-docker/
- **Docker Compose**: обычно идёт в комплекте с Docker Desktop
### Development режим (с локальной БД)
```bash
# 1. Клонировать проект (или быть в папке проекта)
cd /path/to/webapp
# 2. Запустить Docker Compose
docker-compose up
# 3. Открыть браузер
http://localhost:3000
```
**✅ БД будет храниться в `.wrangler/state/v3/d1/` внутри проекта!**
---
## 📁 Структура файлов
### Созданные Docker файлы:
```
webapp/
├── docker-compose.yml # Development конфигурация
├── docker-compose.prod.yml # Production конфигурация
├── Dockerfile # Production образ
├── .dockerignore # Исключения для Docker build
└── DOCKER_GUIDE.md # Эта инструкция
```
### Где хранится БД:
#### Development режим (docker-compose.yml):
```
./ # Корень проекта
└── .wrangler/
└── state/
└── v3/
└── d1/
└── webapp-production.sqlite # ✅ БД здесь!
```
#### Production режим (docker-compose.prod.yml):
```
./ # Корень проекта
└── data/
└── db/
└── webapp-production.sqlite # ✅ БД здесь!
```
---
## 🔧 Development режим
### Запуск
```bash
# Запустить в foreground (видеть логи)
docker-compose up
# Запустить в background (daemon)
docker-compose up -d
# Посмотреть логи
docker-compose logs -f
```
### Особенности Development режима:
1. **Hot reload**: Изменения в коде сразу видны (bind mount)
2. **Локальная БД**: Хранится в `.wrangler/state/v3/d1/`
3. **Автоматический rebuild**: При изменении `package.json`
4. **Debug режим**: Все логи в консоль
### Структура docker-compose.yml:
```yaml
volumes:
# Весь проект монтируется
- ./:/app
# node_modules остаются в контейнере
- /app/node_modules
```
**Почему это работает:**
- ✅ Весь проект доступен в контейнере
-`.wrangler/` создаётся внутри проекта
- ✅ БД физически на вашем диске в проекте
- ✅ Можно бэкапить вместе с проектом
### Остановка
```bash
# Остановить контейнеры
docker-compose down
# Остановить и удалить volumes (НЕ УДАЛЯЕТ ЛОКАЛЬНЫЕ ФАЙЛЫ)
docker-compose down -v
```
---
## 🚀 Production режим
### Build и запуск
```bash
# 1. Создать директорию для БД
mkdir -p data/db data/logs
# 2. Build образа
docker-compose -f docker-compose.prod.yml build
# 3. Запуск
docker-compose -f docker-compose.prod.yml up -d
# 4. Проверить логи
docker-compose -f docker-compose.prod.yml logs -f
```
### Особенности Production режима:
1. **Multi-stage build**: Оптимизированный образ
2. **Non-root user**: Безопасность
3. **Health checks**: Автоматическая проверка
4. **Resource limits**: CPU и Memory limits
5. **Локальная БД**: Хранится в `./data/db/`
### Структура docker-compose.prod.yml:
```yaml
volumes:
# Только БД монтируется локально
- ./data/db:/app/.wrangler/state/v3/d1
- ./data/logs:/app/logs
```
**Почему отдельная папка `data/`:**
- ✅ Чистое разделение данных и кода
- ✅ Легко бэкапить: `tar -czf backup.tar.gz data/`
- ✅ Можно смонтировать на отдельный диск
- ✅ Безопасность: права доступа только к `data/`
---
## 🗄️ База данных
### Где находится БД
#### Development:
```bash
# Путь к БД
./webapp/.wrangler/state/v3/d1/webapp-production.sqlite
# Посмотреть БД
sqlite3 .wrangler/state/v3/d1/webapp-production.sqlite
```
#### Production:
```bash
# Путь к БД
./webapp/data/db/webapp-production.sqlite
# Посмотреть БД
sqlite3 data/db/webapp-production.sqlite
```
### Бэкап БД
#### Автоматический бэкап (рекомендуется):
```bash
# Создать скрипт backup.sh
cat > backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="./backups"
mkdir -p $BACKUP_DIR
# Development БД
if [ -f ".wrangler/state/v3/d1/webapp-production.sqlite" ]; then
cp .wrangler/state/v3/d1/webapp-production.sqlite \
$BACKUP_DIR/webapp-dev-$DATE.sqlite
echo "✅ Dev DB backed up: $BACKUP_DIR/webapp-dev-$DATE.sqlite"
fi
# Production БД
if [ -f "data/db/webapp-production.sqlite" ]; then
cp data/db/webapp-production.sqlite \
$BACKUP_DIR/webapp-prod-$DATE.sqlite
echo "✅ Prod DB backed up: $BACKUP_DIR/webapp-prod-$DATE.sqlite"
fi
EOF
chmod +x backup.sh
# Запустить бэкап
./backup.sh
```
#### Ручной бэкап:
```bash
# Development
cp .wrangler/state/v3/d1/webapp-production.sqlite \
webapp-backup-$(date +%Y%m%d).sqlite
# Production
cp data/db/webapp-production.sqlite \
webapp-backup-$(date +%Y%m%d).sqlite
```
### Восстановление БД
```bash
# Development
cp webapp-backup-20251128.sqlite \
.wrangler/state/v3/d1/webapp-production.sqlite
# Production
cp webapp-backup-20251128.sqlite \
data/db/webapp-production.sqlite
# Перезапустить контейнер
docker-compose restart # Development
docker-compose -f docker-compose.prod.yml restart # Production
```
### Сброс БД
```bash
# Зайти в контейнер
docker-compose exec webapp sh
# Внутри контейнера
npm run db:reset
# Или снаружи
docker-compose exec webapp npm run db:reset
```
### Миграции
```bash
# Применить миграции
docker-compose exec webapp npm run db:migrate:local
# Залить seed данные
docker-compose exec webapp npm run db:seed
```
---
## 📦 Команды Docker
### Базовые команды
```bash
# Запустить
docker-compose up
# Запустить в background
docker-compose up -d
# Остановить
docker-compose down
# Остановить и удалить volumes
docker-compose down -v
# Перезапустить
docker-compose restart
# Посмотреть логи
docker-compose logs -f
# Посмотреть логи конкретного сервиса
docker-compose logs -f webapp
```
### Управление контейнерами
```bash
# Список контейнеров
docker-compose ps
# Зайти в контейнер
docker-compose exec webapp sh
# Выполнить команду в контейнере
docker-compose exec webapp npm run build
# Посмотреть использование ресурсов
docker stats aknaproff-webapp
```
### Build и образы
```bash
# Build заново
docker-compose build
# Build без кэша
docker-compose build --no-cache
# Посмотреть образы
docker images | grep webapp
# Удалить неиспользуемые образы
docker image prune -a
```
### Logs и debugging
```bash
# Все логи
docker-compose logs
# Последние 100 строк
docker-compose logs --tail=100
# Follow (live)
docker-compose logs -f
# Только ошибки
docker-compose logs | grep ERROR
# Экспорт логов в файл
docker-compose logs > webapp-logs.txt
```
---
## 🔍 Troubleshooting
### Проблема: Контейнер не запускается
**Симптомы:**
```
Error: Cannot find module 'hono'
```
**Решение:**
```bash
# Удалить node_modules и пересобрать
docker-compose down -v
docker-compose build --no-cache
docker-compose up
```
---
### Проблема: Порт 3000 занят
**Симптомы:**
```
Error: bind: address already in use
```
**Решение 1: Убить процесс на порту 3000**
```bash
# Linux/Mac
lsof -ti:3000 | xargs kill -9
# Или
fuser -k 3000/tcp
```
**Решение 2: Изменить порт в docker-compose.yml**
```yaml
ports:
- "3001:3000" # Host:Container
```
---
### Проблема: БД не создаётся
**Симптомы:**
```
Error: no such table: users
```
**Решение:**
```bash
# Зайти в контейнер
docker-compose exec webapp sh
# Сбросить БД
npm run db:reset
# Выйти
exit
```
---
### Проблема: БД пропала после перезапуска
**Причина:** Использовали `docker-compose down -v` (удаляет volumes)
**Решение:**
```bash
# НЕ используйте -v если нужно сохранить данные
docker-compose down # ✅ Правильно
# Используйте -v только для полной очистки
docker-compose down -v # ❌ Удалит volumes
```
**Но в нашем случае:**
- ✅ БД хранится в `./` или `./data/` (bind mount)
-`docker-compose down -v` НЕ удалит файлы на хосте
- ✅ Безопасно использовать `-v`
---
### Проблема: Изменения в коде не видны
**Development режим:**
```bash
# Проверить bind mount
docker-compose exec webapp ls -la /app
# Если bind mount не работает, перезапустить
docker-compose down
docker-compose up
```
**Production режим:**
```bash
# Production требует rebuild
docker-compose -f docker-compose.prod.yml build
docker-compose -f docker-compose.prod.yml up -d
```
---
### Проблема: Недостаточно памяти
**Симптомы:**
```
JavaScript heap out of memory
```
**Решение: Увеличить memory limit**
```yaml
# docker-compose.prod.yml
deploy:
resources:
limits:
memory: 1G # Было 512M
```
---
## 📊 Мониторинг
### Использование ресурсов
```bash
# Real-time статистика
docker stats aknaproff-webapp
# Вывод:
# CONTAINER CPU % MEM USAGE / LIMIT MEM %
# aknaproff... 0.5% 120MB / 512MB 23%
```
### Health checks
```bash
# Проверить health status
docker-compose ps
# Вывод:
# NAME STATUS
# aknaproff-webapp Up (healthy)
```
### Логи приложения
```bash
# Live логи
docker-compose logs -f webapp
# Ошибки
docker-compose logs webapp | grep ERROR
# Экспорт в файл
docker-compose logs webapp > logs.txt
```
---
## 🎯 Best Practices
### 1. Регулярные бэкапы
```bash
# Добавить в cron (каждый день в 3:00)
0 3 * * * cd /path/to/webapp && ./backup.sh
```
### 2. Мониторинг дискового пространства
```bash
# Проверить размер БД
du -sh .wrangler/state/v3/d1/
du -sh data/db/
# Проверить свободное место
df -h
```
### 3. Обновление образов
```bash
# Обновить base образы
docker-compose pull
# Rebuild с новыми образами
docker-compose build --no-cache
docker-compose up -d
```
### 4. Безопасность
```bash
# Использовать .env для секретов
echo "CLOUDFLARE_API_TOKEN=your_token" > .env
# Добавить в .gitignore
echo ".env" >> .gitignore
# В docker-compose.yml
env_file:
- .env
```
### 5. Логирование
```bash
# Ротация логов (добавить в docker-compose.yml)
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
```
---
## 📚 Полезные ссылки
- **Docker Docs**: https://docs.docker.com/
- **Docker Compose**: https://docs.docker.com/compose/
- **Cloudflare Workers**: https://developers.cloudflare.com/workers/
- **Wrangler CLI**: https://developers.cloudflare.com/workers/wrangler/
- **Hono Framework**: https://hono.dev/
---
## ✅ Проверочный чек-лист
### Development:
- [ ] `docker-compose up` запускается без ошибок
- [ ] Приложение доступно на http://localhost:3000
- [ ] БД создалась в `.wrangler/state/v3/d1/`
- [ ] Демо-данные загрузились (5 записей за январь 2025)
- [ ] Hot reload работает (изменения видны)
- [ ] Health check: `docker-compose ps``(healthy)`
### Production:
- [ ] `docker-compose -f docker-compose.prod.yml build` успешно
- [ ] `docker-compose -f docker-compose.prod.yml up -d` запустился
- [ ] Приложение доступно на http://localhost:3000
- [ ] БД создалась в `./data/db/`
- [ ] Демо-данные загрузились
- [ ] Health check: `(healthy)`
- [ ] Бэкап работает: `./backup.sh`
---
## 🎉 Готово!
**AKNAPROFF Tootmine теперь работает в Docker с локальной БД!**
**Production URL (Docker):**
http://localhost:3000
**Demo Accounts:**
- `admin` / `demo123`
- `aknaproff` / `demo123`
- **Public User** (без логина)
**База данных:**
- **Development**: `.wrangler/state/v3/d1/webapp-production.sqlite`
- **Production**: `./data/db/webapp-production.sqlite`
**Бэкап:**
```bash
./backup.sh
```
---
*Создано: 28.11.2025*
*Версия проекта: v4.0.13*