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:
59
.env.example
59
.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
|
||||
|
||||
352
DATABASE.md
Normal file
352
DATABASE.md
Normal 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
BIN
DATABASE.pdf
Normal file
Binary file not shown.
42
backup-db.sh
Executable file
42
backup-db.sh
Executable 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user