Коротко — самая частая причина такого поведения с адресом 127.0.0.1 при работе в Docker: Prisma (или ваше приложение) и Postgres находятся в разных сетевых пространствах, и 127.0.0.1 внутри контейнера не указывает на хост/другой контейнер. Но причин может быть несколько: неправильная DATABASE_URL, Docker-перенаправление портов, Postgres слушает не на нужном интерфейсе, конфликт порта, сетевые политики/фаервол, либо проблемы с самим Prisma (неправильная сборка движка, версия, отсутствие переменных окружения в контейнере и т.д.). Ниже — пошаговая инструкция по диагностике и список сведений, которые нужно приложить при обращении за помощью.
Что проверить и сделать сейчас (порядок — рекомендованный)
1. Убедиться, что ошибка — именно P1001 (или другой код).
- Полный текст ошибки (включая код PrismaClientKnownRequestError / P1001/P1008) нужен — см. далее, что прислать.
2. Проверить, откуда запускается Prisma (хост или контейнер).
- Если приложение запускается в контейнере, 127.0.0.1 указывает на сам этот контейнер, а не на Postgres в другом контейнере/на хосте.
3. Проверить DATABASE_URL, которую использует Prisma
- Выведите значение внутри среды, где запускается приложение:
- В Node: console.log(process.env.DATABASE_URL)
- Или в контейнере: docker exec -it <app-container> sh и echo $DATABASE_URL
- Убедитесь, что host/port/пользователь/пароль корректны.
4. Тест соединения с того же места, где запускается Prisma
- Если Prisma в контейнере app:
- docker exec -it <app-container> sh
- Попробуйте: nc -vz 127.0.0.1 5432 или psql -h 127.0.0.1 -p 5432 -U <user> <db>
- Если подключиться не получается, попробуйте хост, указанный в compose (например, postgres) или host.docker.internal (на Mac/Win).
- Если Prisma на хосте, Postgres в контейнере:
- На хосте: nc -vz 127.0.0.1 5432 или psql -h 127.0.0.1 -p 5432 ...
5. Проверьте docker-compose / контейнеры
- docker ps
- docker-compose ps
- docker inspect <postgres-container> | grep -i "Ports" или docker port <postgres-container>
- Убедитесь, что порт 5432 опубликован (если ожидается доступ с хоста): -p 5432:5432
- Если оба контейнера в одной сети docker-compose, в DATABASE_URL используйте service name (например postgresql://user:pass@postgres:5432/db).
6. Проверьте, что Postgres слушает на нужных интерфейсах
- В контейнере postgres: проверьте listen_addresses (postgresql.conf) — лучше * или 0.0.0.0, а не только localhost.
- Посмотреть логи Postgres: docker logs <postgres-container>
7. Проверьте, что переменные окружения передаются правильно при сборке/запуске
- Частая ошибка: DATABASE_URL доступна на этапе сборки, но отсутствует в runtime контейнера.
- Проверьте docker-compose env_file / environment и переменные в окружении процесса.
8. Логи и дебаг Prisma
- Включите логирование Prisma:
- new PrismaClient({ log: ['query','info','warn','error'] })
- Или установите DEBUG: DEBUG="prisma:*" при запуске процесса.
- Посмотрите полный стек ошибки и сообщение PrismaClientKnownRequestError (код ошибки P1001 и текст «Cannot reach database server at `127.0.0.1:5432`» и т.д.).
9. Если всё работало раньше — что поменялось?
- Обновления пакетов, изменение Docker/compose, смена сети, обновление ОС/пермишнов и т.д. Верните/проверьте последние изменения.
Возможные конкретные исправления (в зависимости от причины)
- Если приложение и БД в разных контейнерах в одной сети: в DATABASE_URL укажите имя сервиса (postgres), а не 127.0.0.1.
- Если запускаете приложение в контейнере и БД на хосте:
- На Mac/Win используйте host.docker.internal вместо 127.0.0.1, либо подключите контейнер к host-сети (не рекомендуется в проде).
- Если БД в контейнере, а вы подключаетесь с хоста — убедитесь, что порт опубликовали (-p 5432:5432) и Postgres слушает 0.0.0.0.
- Если переменная окружения утеряна в контейнере — исправьте передачу env (docker-compose env_file / environment).
- Если это проблема с Prisma engine (редко): обновите/сгенерируйте Prisma Client заново (npx prisma generate) и убедитесь, что бинарники совместимы с платформой.
- Проверить версию Prisma и Node: npx prisma -v и node -v, убедиться в совместимости.
Что приложить при обращении за помощью (обязательные сведения)
1. Полный текст ошибки/стек (включая код P1001/P1008 и т.д.), не только начало.
2. Фрагмент prisma/schema.prisma (datasource блок) — обрежьте пароли или замените их на ***
3. Точное значение DATABASE_URL (замените пароль звездочками, но оставьте host/port/имя базы и схему)
4. Как вы запускаете приложение и БД:
- Docker Compose файл (docker-compose.yml) или docker run команды
- Команды запуска приложения (npm start / docker run ...)
5. Вывод:
- npx prisma -v
- docker ps (или docker-compose ps)
- docker inspect <app-container> и <postgres-container> (если нужно)
- docker logs <postgres-container>
6. Результат попытки соединения из того же окружения:
- вывод nc -vz 127.0.0.1 5432 или psql (если пробовали)
- вывод echo $DATABASE_URL внутри контейнера/процесса
7. OS, Docker версия, Node версия, Prisma версия, архитектура (x86_64 / arm64)
8. Любые недавние изменения, которые предшествовали ошибке
Шаблон, который можно вставить в вопрос (пример)
- Полный стек ошибки: (копируйте сюда)
- schema.prisma (datasource): (скопировать)
- DATABASE_URL: postgresql://user:***@127.0.0.1:5432/dbname
- Docker-compose.yml: (скопировать)
- Вывод docker ps, docker-compose ps
- Вывод npx prisma -v, node -v
- Результаты проверки из контейнера: nc/psql output
- Логи Postgres (docker logs ...)
Короткое резюме / чеклист для быстрого исключения
- [ ] Приложение и БД в одном сетевом пространстве? Если нет — поменять хост в DATABASE_URL.
- [ ] Port 5432 открыт и проброшен как ожидается?
- [ ] Postgres слушает на правильном интерфейсе?
- [ ] DATABASE_URL действительно доступна процессу/контейнеру?
- [ ] Попробовали подключиться к тому же хосту/порту из того же окружения?
- [ ] Полный стек ошибки приложен при обращении за помощью?
Если хотите — пришлите:
- полный стек ошибки,
- ваш datasource из schema.prisma,
- docker-compose.yml (или как вы поднимаете контейнеры),
- вывод docker ps и npx prisma -v,
и я подробно укажу, что именно менять в конфигурации.