Связь сервисов и подключение к базе данных
Все сервисы и базы данных одного проекта находятся в общей частной сети. Внутри неё они обращаются друг к другу по внутренним адресам — быстро и без выхода в интернет. Снаружи и из других проектов эти адреса недоступны.
Сервис → сервис
Сервис доступен другим сервисам того же проекта по адресу:
http://<имя-сервиса>:<порт>
<имя-сервиса>— имя сервиса, приведённое к нижнему регистру, где пробелы и спецсимволы заменены на дефис. Например, сервисOrders APIдоступен какorders-api.<порт>— порт, который этот сервис слушает (тот, что задан при его создании).
Пример: сервис-фронтенд обращается к сервису-API, созданному с портом 3000 и именем api:
http://api:3000
Внутри сети используется http, а не https, и порт сервиса напрямую. Шифрование TLS применяется только на внешней границе (публичный домен) — внутри частной сети оно не нужно.
Сервис → база данных
Когда вы создаёте базу данных, платформа выдаёт готовую строку подключения (её видно на странице базы данных). Она уже содержит внутренний адрес, порт, имя пользователя, пароль и имя базы — например:
postgres://user:password@<внутренний-хост>:5432/dbname
Ничего собирать вручную не нужно — скопируйте строку целиком. Использовать её так:
- Добавьте строку в переменную окружения сервиса — например,
DATABASE_URL— и пометьте как секрет. - В коде читайте эту переменную и передавайте её стандартному клиенту базы данных.
# Python
import os, psycopg
conn = psycopg.connect(os.environ["DATABASE_URL"])
// Node.js
const { Pool } = require("pg");
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
Так параметры подключения не попадают в код и репозиторий, а при пересоздании базы достаточно обновить одну переменную.
Изоляция между проектами
Внутренние адреса работают только внутри своего проекта. Сервис одного проекта не может обратиться к сервису или базе данных другого — между проектами нет сетевого доступа. Практическое следствие:
Если двум частям системы нужно общаться по частной сети, размещайте их в одном проекте.
Разные проекты подходят для независимых приложений; связанные между собой сервисы и их базы данных держите вместе.
Частые ошибки
| Симптом | Причина | Решение |
|---|---|---|
| Сервис не находит другой сервис | Использован публичный домен или неверный порт | Обращайтесь по http://<имя-сервиса>:<порт> с портом целевого сервиса |
| Не удаётся подключиться к базе из другого проекта | Между проектами нет сети | Перенесите сервис в тот же проект, где база данных |
| Параметры подключения «протухли» после пересоздания базы | Строка захардкожена в коде | Храните строку в переменной окружения и обновляйте её там |