Add PostgreSQL configuration and database management tools

- Added PostgreSQL service to docker-compose.yml
- Updated .env.example with complete database settings
- Created DATABASE.md with comprehensive PostgreSQL guide
- Added backup-db.sh script for automatic database backups
- Configured health checks for both PostgreSQL and app containers
- Added Docker network for secure container communication
This commit is contained in:
DeepAgent
2025-10-27 11:45:42 +00:00
parent 4c71217c55
commit c5f3377a62
5 changed files with 491 additions and 4 deletions

View File

@@ -1,11 +1,21 @@
# ==================================
# ОБЩИЕ НАСТРОЙКИ
# ==================================
# Домен вашего сайта # Домен вашего сайта
DOMAIN=video.mscsrv.ru DOMAIN=video.mscsrv.ru
# URL сайта (используется для метатегов и canonical URL) # URL сайта (используется для метатегов и canonical URL)
NEXT_PUBLIC_SITE_URL=https://video.mscsrv.ru NEXT_PUBLIC_SITE_URL=https://video.mscsrv.ru
# IP адреса # Для production окружения
NODE_ENV=production
# ==================================
# СЕТЕВЫЕ НАСТРОЙКИ
# ==================================
# Traefik хост # Traefik хост
TRAEFIK_HOST=192.168.50.59 TRAEFIK_HOST=192.168.50.59
@@ -13,5 +23,48 @@ TRAEFIK_HOST=192.168.50.59
# Укажите IP текущего хоста в локальной сети # Укажите IP текущего хоста в локальной сети
APP_HOST_IP=192.168.50.X 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

352
DATABASE.md Normal file
View File

@@ -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 полностью настроена и готова к использованию! 🚀**

BIN
DATABASE.pdf Normal file

Binary file not shown.

42
backup-db.sh Executable file
View File

@@ -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

View File

@@ -2,6 +2,25 @@
version: '3.8' version: '3.8'
services: 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: global-it24-web:
build: build:
context: . context: .
@@ -12,9 +31,20 @@ services:
restart: unless-stopped restart: unless-stopped
ports: ports:
- "3000:3000" - "3000:3000"
depends_on:
postgres:
condition: service_healthy
environment: environment:
- NODE_ENV=production - NODE_ENV=production
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://video.mscsrv.ru} - 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 - PORT=3000
- HOSTNAME=0.0.0.0 - HOSTNAME=0.0.0.0
healthcheck: healthcheck:
@@ -23,6 +53,16 @@ services:
timeout: 10s timeout: 10s
retries: 3 retries: 3
start_period: 40s start_period: 40s
networks:
- app-network
# Для работы с внешним Traefik не требуется сеть networks:
app-network:
driver: bridge
volumes:
postgres_data:
driver: local
# Для работы с внешним Traefik:
# Traefik будет обращаться к контейнеру по IP хоста на порту 3000 # Traefik будет обращаться к контейнеру по IP хоста на порту 3000