- 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
353 lines
9.6 KiB
Markdown
353 lines
9.6 KiB
Markdown
|
||
# 🗄 Руководство по работе с 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 полностью настроена и готова к использованию! 🚀**
|