Ошибка 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 до последней стабильной версии.

    Часто задаваемые вопросы