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