diff --git a/.env.example b/.env.example index 4ad11f8..f6472e8 100644 --- a/.env.example +++ b/.env.example @@ -1,11 +1,21 @@ +# ================================== +# ОБЩИЕ НАСТРОЙКИ +# ================================== + # Домен вашего сайта DOMAIN=video.mscsrv.ru # URL сайта (используется для метатегов и canonical URL) NEXT_PUBLIC_SITE_URL=https://video.mscsrv.ru -# IP адреса +# Для production окружения +NODE_ENV=production + +# ================================== +# СЕТЕВЫЕ НАСТРОЙКИ +# ================================== + # Traefik хост TRAEFIK_HOST=192.168.50.59 @@ -13,5 +23,48 @@ TRAEFIK_HOST=192.168.50.59 # Укажите IP текущего хоста в локальной сети APP_HOST_IP=192.168.50.X -# Для production окружения -NODE_ENV=production +# ================================== +# БАЗА ДАННЫХ POSTGRESQL +# ================================== + +# Имя пользователя PostgreSQL +POSTGRES_USER=globalit24 + +# Пароль PostgreSQL (ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ!) +POSTGRES_PASSWORD=changeme123 + +# Имя базы данных +POSTGRES_DB=globalit24_db + +# URL подключения к базе данных +# Формат: postgresql://USER:PASSWORD@HOST:PORT/DATABASE +DATABASE_URL=postgresql://globalit24:changeme123@postgres:5432/globalit24_db + +# ================================== +# EMAIL УВЕДОМЛЕНИЯ (SMTP) +# ================================== + +# SMTP сервер (например: smtp.mail.ru, smtp.gmail.com, smtp.yandex.ru) +SMTP_HOST=smtp.mail.ru + +# SMTP порт (обычно 465 для SSL, 587 для TLS) +SMTP_PORT=465 + +# Email адрес отправителя +SMTP_USER=your-email@mail.ru + +# Пароль от email (для Mail.ru используйте пароль приложения) +SMTP_PASSWORD=your-smtp-app-password + +# Email для получения уведомлений о заявках +NOTIFICATION_EMAIL=info@global-it24.ru + +# ================================== +# TELEGRAM УВЕДОМЛЕНИЯ +# ================================== + +# Токен бота Telegram (получить у @BotFather) +TELEGRAM_BOT_TOKEN=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz + +# ID чата для уведомлений (получить у @userinfobot) +TELEGRAM_CHAT_ID=123456789 diff --git a/DATABASE.md b/DATABASE.md new file mode 100644 index 0000000..1116691 --- /dev/null +++ b/DATABASE.md @@ -0,0 +1,352 @@ + +# 🗄 Руководство по работе с PostgreSQL + +## 📋 Обзор + +Проект использует PostgreSQL 16 в Docker контейнере. База данных автоматически запускается вместе с приложением через Docker Compose. + +--- + +## ⚙️ Конфигурация + +### Переменные окружения (.env) + +```env +# Настройки PostgreSQL +POSTGRES_USER=globalit24 +POSTGRES_PASSWORD=changeme123 # ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ! +POSTGRES_DB=globalit24_db + +# URL для подключения +DATABASE_URL=postgresql://globalit24:changeme123@postgres:5432/globalit24_db +``` + +**⚠️ ВАЖНО:** Обязательно измените `POSTGRES_PASSWORD` на сильный пароль перед развертыванием! + +--- + +## 🚀 Автоматический запуск + +PostgreSQL запускается автоматически при выполнении: + +```bash +./deploy.sh +# или +docker compose up -d +``` + +--- + +## 📊 Структура базы данных + +### Таблица: contact_submissions + +Хранит все заявки с формы обратной связи. + +```sql +CREATE TABLE contact_submissions ( + id VARCHAR PRIMARY KEY, -- Уникальный идентификатор (cuid) + name VARCHAR NOT NULL, -- Имя клиента + phone VARCHAR NOT NULL, -- Телефон + email VARCHAR, -- Email (опционально) + service_type VARCHAR, -- Тип услуги (опционально) + message TEXT, -- Сообщение (опционально) + created_at TIMESTAMP DEFAULT NOW() -- Дата создания +); +``` + +--- + +## 🔧 Управление базой данных + +### 1. Подключение к PostgreSQL контейнеру + +```bash +# Войти в контейнер PostgreSQL +docker exec -it global-it24-postgres psql -U globalit24 -d globalit24_db +``` + +### 2. Основные SQL команды + +```sql +-- Посмотреть все таблицы +\dt + +-- Описание таблицы +\d contact_submissions + +-- Посмотреть все заявки +SELECT * FROM contact_submissions ORDER BY created_at DESC; + +-- Посмотреть последние 10 заявок +SELECT * FROM contact_submissions ORDER BY created_at DESC LIMIT 10; + +-- Посмотреть заявки за сегодня +SELECT * FROM contact_submissions +WHERE created_at::date = CURRENT_DATE +ORDER BY created_at DESC; + +-- Статистика по типам услуг +SELECT service_type, COUNT(*) as count +FROM contact_submissions +GROUP BY service_type +ORDER BY count DESC; + +-- Выход +\q +``` + +### 3. Резервное копирование базы данных + +```bash +# Создать бэкап +docker exec -t global-it24-postgres pg_dump -U globalit24 globalit24_db > backup_$(date +%Y%m%d_%H%M%S).sql + +# Или автоматический скрипт +./backup-db.sh +``` + +### 4. Восстановление из бэкапа + +```bash +# Восстановить из файла +docker exec -i global-it24-postgres psql -U globalit24 -d globalit24_db < backup_YYYYMMDD_HHMMSS.sql +``` + +### 5. Очистка старых данных (опционально) + +```bash +# Удалить заявки старше 1 года +docker exec -it global-it24-postgres psql -U globalit24 -d globalit24_db -c "DELETE FROM contact_submissions WHERE created_at < NOW() - INTERVAL '1 year';" +``` + +--- + +## 🔍 Проверка состояния + +### Статус контейнера + +```bash +# Проверка работы PostgreSQL +docker ps | grep postgres + +# Логи PostgreSQL +docker logs global-it24-postgres + +# Последние 50 строк логов +docker logs global-it24-postgres --tail 50 -f +``` + +### Health Check + +```bash +# Проверка готовности базы данных +docker exec global-it24-postgres pg_isready -U globalit24 + +# Должно вывести: +# /var/run/postgresql:5432 - accepting connections +``` + +### Подключение к базе из приложения + +```bash +# Проверка переменных окружения в контейнере приложения +docker exec global-it24-landing env | grep DATABASE_URL +``` + +--- + +## 📦 Prisma миграции + +### Применить миграции (после изменений в schema.prisma) + +```bash +# Внутри контейнера приложения +docker exec -it global-it24-landing sh -c "cd /app && npx prisma migrate deploy" +``` + +### Создать новую миграцию (в разработке) + +```bash +cd nextjs_space +yarn prisma migrate dev --name название_миграции +``` + +### Сгенерировать Prisma Client + +```bash +cd nextjs_space +yarn prisma generate +``` + +### Просмотр данных через Prisma Studio (только для разработки) + +```bash +cd nextjs_space +yarn prisma studio +# Откроется на http://localhost:5555 +``` + +--- + +## 🔐 Безопасность + +### Рекомендации: + +1. **Измените пароль по умолчанию** + ```bash + # В .env файле установите сильный пароль + POSTGRES_PASSWORD=your_strong_password_here_123!@# + ``` + +2. **Ограничьте доступ к порту PostgreSQL** + + PostgreSQL работает внутри Docker сети и не доступен извне по умолчанию. Это правильно! + + Если нужен внешний доступ (не рекомендуется), добавьте: + ```yaml + ports: + - "127.0.0.1:5432:5432" # Только localhost + ``` + +3. **Регулярные бэкапы** + + Настройте автоматический бэкап через cron: + ```bash + crontab -e + # Добавьте: + 0 3 * * * cd /path/to/global_it24_landing && ./backup-db.sh + ``` + +4. **Мониторинг места на диске** + ```bash + # Проверка размера данных PostgreSQL + docker exec global-it24-postgres du -sh /var/lib/postgresql/data + ``` + +--- + +## 🛠 Устранение неполадок + +### Проблема: Не могу подключиться к базе данных + +```bash +# 1. Проверьте что контейнер запущен +docker ps | grep postgres + +# 2. Проверьте логи +docker logs global-it24-postgres + +# 3. Проверьте health check +docker inspect global-it24-postgres | grep -A 5 Health + +# 4. Попробуйте перезапустить +docker compose restart postgres +``` + +### Проблема: База данных не инициализируется + +```bash +# 1. Остановите контейнеры +docker compose down + +# 2. Удалите volume (ВНИМАНИЕ: потеря данных!) +docker volume rm global_it24_landing_postgres_data + +# 3. Запустите снова +./deploy.sh +``` + +### Проблема: Ошибка миграции Prisma + +```bash +# 1. Проверьте DATABASE_URL +docker exec global-it24-landing env | grep DATABASE_URL + +# 2. Сбросьте Prisma и примените миграции заново +docker exec -it global-it24-landing sh -c "cd /app && npx prisma migrate reset --skip-seed" +``` + +### Проблема: Медленные запросы + +```sql +-- Проверьте размер таблицы +SELECT + schemaname, + tablename, + pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size +FROM pg_tables +WHERE schemaname = 'public'; + +-- Создайте индексы для часто используемых полей +CREATE INDEX idx_created_at ON contact_submissions(created_at DESC); +CREATE INDEX idx_phone ON contact_submissions(phone); +``` + +--- + +## 📈 Мониторинг + +### Использование ресурсов + +```bash +# Статистика контейнера PostgreSQL +docker stats global-it24-postgres --no-stream + +# Размер базы данных +docker exec global-it24-postgres psql -U globalit24 -d globalit24_db -c "SELECT pg_size_pretty(pg_database_size('globalit24_db'));" +``` + +### Количество записей + +```bash +# Общее количество заявок +docker exec global-it24-postgres psql -U globalit24 -d globalit24_db -c "SELECT COUNT(*) FROM contact_submissions;" +``` + +--- + +## 🔄 Миграция данных + +### Экспорт данных в CSV + +```bash +docker exec -t global-it24-postgres psql -U globalit24 -d globalit24_db -c "COPY contact_submissions TO STDOUT WITH CSV HEADER" > submissions_export.csv +``` + +### Импорт данных из CSV + +```bash +cat submissions_import.csv | docker exec -i global-it24-postgres psql -U globalit24 -d globalit24_db -c "COPY contact_submissions FROM STDIN WITH CSV HEADER" +``` + +--- + +## 📞 Полезные ссылки + +- [Документация PostgreSQL](https://www.postgresql.org/docs/) +- [Документация Prisma](https://www.prisma.io/docs/) +- [Docker PostgreSQL Image](https://hub.docker.com/_/postgres) + +--- + +## 💡 Советы по производительности + +1. **Регулярная очистка логов** + ```bash + docker compose logs --tail 100 > logs.txt + ``` + +2. **VACUUM таблицы** (освобождение места после удаления данных) + ```sql + VACUUM ANALYZE contact_submissions; + ``` + +3. **Мониторинг активных подключений** + ```sql + SELECT count(*) FROM pg_stat_activity WHERE datname = 'globalit24_db'; + ``` + +--- + +**Готово! База данных PostgreSQL полностью настроена и готова к использованию! 🚀** diff --git a/DATABASE.pdf b/DATABASE.pdf new file mode 100644 index 0000000..28c3d42 Binary files /dev/null and b/DATABASE.pdf differ diff --git a/backup-db.sh b/backup-db.sh new file mode 100755 index 0000000..7f3cfe5 --- /dev/null +++ b/backup-db.sh @@ -0,0 +1,42 @@ + +#!/bin/bash + +# Скрипт для создания резервной копии базы данных PostgreSQL + +# Настройки +BACKUP_DIR="./backups" +TIMESTAMP=$(date +%Y%m%d_%H%M%S) +BACKUP_FILE="${BACKUP_DIR}/db_backup_${TIMESTAMP}.sql" + +# Создаем директорию для бэкапов если не существует +mkdir -p ${BACKUP_DIR} + +echo "🔄 Создание резервной копии базы данных..." +echo "📁 Файл: ${BACKUP_FILE}" + +# Создаем бэкап +docker exec -t global-it24-postgres pg_dump -U globalit24 globalit24_db > ${BACKUP_FILE} + +if [ $? -eq 0 ]; then + echo "✅ Резервная копия успешно создана!" + + # Сжимаем бэкап + gzip ${BACKUP_FILE} + echo "📦 Архив создан: ${BACKUP_FILE}.gz" + + # Показываем размер + SIZE=$(du -h ${BACKUP_FILE}.gz | cut -f1) + echo "💾 Размер: ${SIZE}" + + # Удаляем бэкапы старше 30 дней + find ${BACKUP_DIR} -name "db_backup_*.sql.gz" -mtime +30 -delete + echo "🧹 Старые бэкапы (>30 дней) удалены" + +else + echo "❌ Ошибка при создании резервной копии!" + exit 1 +fi + +echo "" +echo "📊 Список всех бэкапов:" +ls -lh ${BACKUP_DIR}/db_backup_*.sql.gz 2>/dev/null | tail -10 diff --git a/docker-compose.yml b/docker-compose.yml index 81dc768..32a3e9d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,25 @@ version: '3.8' services: + postgres: + image: postgres:16-alpine + container_name: global-it24-postgres + restart: unless-stopped + environment: + POSTGRES_USER: ${POSTGRES_USER:-globalit24} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme123} + POSTGRES_DB: ${POSTGRES_DB:-globalit24_db} + PGDATA: /var/lib/postgresql/data/pgdata + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-globalit24}"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - app-network + global-it24-web: build: context: . @@ -12,9 +31,20 @@ services: restart: unless-stopped ports: - "3000:3000" + depends_on: + postgres: + condition: service_healthy environment: - NODE_ENV=production - NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://video.mscsrv.ru} + - DATABASE_URL=postgresql://${POSTGRES_USER:-globalit24}:${POSTGRES_PASSWORD:-changeme123}@postgres:5432/${POSTGRES_DB:-globalit24_db} + - SMTP_HOST=${SMTP_HOST} + - SMTP_PORT=${SMTP_PORT:-465} + - SMTP_USER=${SMTP_USER} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - NOTIFICATION_EMAIL=${NOTIFICATION_EMAIL} + - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN} + - TELEGRAM_CHAT_ID=${TELEGRAM_CHAT_ID} - PORT=3000 - HOSTNAME=0.0.0.0 healthcheck: @@ -23,6 +53,16 @@ services: timeout: 10s retries: 3 start_period: 40s + networks: + - app-network -# Для работы с внешним Traefik не требуется сеть +networks: + app-network: + driver: bridge + +volumes: + postgres_data: + driver: local + +# Для работы с внешним Traefik: # Traefik будет обращаться к контейнеру по IP хоста на порту 3000