Ошибка Prisma P1001: Can't reach database server - причины и решение
Ошибка PrismaClientKnownRequestError с кодом P1001 возникает, когда Prisma не может установить соединение с сервером базы данных. В логах вы видите сообщение Can't reach database server at 127.0.0.1:5432. Это означает, что клиент Prisma пытается подключиться к PostgreSQL (порт 5432) на локальном хосте, но сервер базы данных недоступен. Чаще всего проблема проявляется при использовании Docker, когда контейнер с приложением не может «увидеть» контейнер с БД. Разберём пошагово, как диагностировать и устранить неполадку.
Почему возникает ошибка P1001?
Код ошибки P1001 в Prisma указывает на проблему сетевой доступности. Причины могут быть разными:
- Сервер базы данных не запущен или упал.
- Неверный хост или порт в строке подключения
DATABASE_URL. - Контейнеры приложения и БД находятся в разных сетях Docker.
- Firewall или настройки безопасности блокируют соединение.
- Несовместимость версий драйвера PostgreSQL.
Как исправить ошибку Prisma P1001 в Docker
1. Проверьте строку подключения DATABASE_URL
Убедитесь, что в вашем .env или docker-compose.yml указан правильный хост. Если контейнеры находятся в одной сети Docker, используйте имя сервиса вместо 127.0.0.1 или localhost. Пример для docker-compose:
DATABASE_URL=postgresql://user:password@db:5432/mydbЗдесь db - это имя сервиса PostgreSQL в вашем docker-compose.yml. Если вы используете 127.0.0.1, приложение внутри контейнера пытается подключиться к самому себе, а не к базе данных.
2. Убедитесь, что контейнер с БД работает
Выполните команду docker ps и проверьте, что контейнер PostgreSQL запущен. Если он не отображается, запустите его командой docker-compose up -d db. Также проверьте логи контейнера базы данных: docker logs <container_name> - там могут быть сообщения об ошибках инициализации.
3. Настройте сеть Docker
Убедитесь, что оба контейнера (приложение и БД) находятся в одной сети. В docker-compose.yml определите общую сеть и укажите её для каждого сервиса. Пример:
services:
app:
networks:
- app-network
db:
networks:
- app-network
networks:
app-network:
driver: bridgeПосле этого пересоздайте контейнеры: docker-compose down && docker-compose up -d.
4. Проверьте порт и доступность
Если вы используете 127.0.0.1 на хостовой машине (не в Docker), убедитесь, что PostgreSQL слушает порт 5432. Выполните ss -tlnp | grep 5432 или netstat -tulpn | grep 5432. Если порт не занят, перезапустите службу PostgreSQL: sudo systemctl restart postgresql.
5. Регенерируйте Prisma Client
После изменения DATABASE_URL или схемы обязательно выполните регенерацию клиента:
npx prisma generateЕсли вы используете Docker, добавьте этот шаг в Dockerfile или выполните внутри контейнера.
6. Проверьте версию Prisma и драйвера
Убедитесь, что версия @prisma/client и prisma совпадают. В вашем логе указана версия 7.2.0 - это последняя на данный момент. Если у вас установлены разные версии, выполните npm update @prisma/client или pnpm update.
Почему ошибка появляется внезапно?
Если раньше всё работало, а потом возникла ошибка P1001, вероятные причины:
- Контейнер с БД был перезапущен или упал (например, из-за нехватки памяти).
- Изменилась сеть Docker (например, при пересборке проекта).
- Обновление Prisma или драйвера PostgreSQL привело к несовместимости.
- Сработал автоматический сброс соединения (пул соединений исчерпан).
Профилактика ошибки P1001
Чтобы избежать повторения проблемы, следуйте рекомендациям:
- Всегда используйте имя сервиса (не localhost) в
DATABASE_URLпри работе в Docker. - Добавьте healthcheck для контейнера PostgreSQL в
docker-compose.yml, чтобы приложение ждало готовности БД. - Настройте автоматический перезапуск контейнеров (
restart: unless-stopped). - Регулярно обновляйте Prisma до последней стабильной версии.