pgAdmin 4 for Portainer + Nginx Proxy Manager
Этот репозиторий подготовлен для развертывания pgAdmin 4 как отдельного веб-сервиса:
- через
Portainerкак stack; - через
Nginx Proxy Managerкак reverse proxy; - с постоянным хранением данных в Docker volume;
- с отдельным файлом
servers.jsonдля преднастройки подключений к PostgreSQL.
Что лежит в репозитории
docker-compose.portainer.yml- основной stack-файл для Portainer;Dockerfile- опциональный Dockerfile, если позже захочешь собирать свой образ;.env.example- шаблон переменных окружения;config_local.py- настройки pgAdmin для корректной работы за reverse proxy;servers.json- список преднастроенных серверов PostgreSQL;.gitignore- чтобы случайно не закоммитить секреты из.env.
1. Подготовка
Файл .env.example используй как шаблон значений.
Есть два способа:
- локально скопировать
.env.exampleв.env; - или ввести эти же значения вручную в переменные stack'а в
Portainer.
Минимально нужно поменять:
PGADMIN_DEFAULT_EMAILPGADMIN_DEFAULT_PASSWORDPGADMIN_DOMAINNPM_NETWORK
Пример:
TZ=Europe/Moscow
PGADMIN_DEFAULT_EMAIL=admin@your-domain.com
PGADMIN_DEFAULT_PASSWORD=super-strong-password
PGADMIN_VOLUME_NAME=pgadmin_data
PGADMIN_CONFIG_SERVER_MODE=True
PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED=True
PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=True
PGADMIN_CONFIG_UPGRADE_CHECK_ENABLED=False
NPM_NETWORK=npm_proxy
PGADMIN_DOMAIN=pgadmin.example.com
2. Подготовка сети для Nginx Proxy Manager
Очень важно, чтобы контейнер с pgAdmin и контейнер Nginx Proxy Manager находились в одной Docker-сети.
Этот вариант настройки предполагает, что Portainer, pgAdmin и Nginx Proxy Manager работают на одном Docker host.
Если у тебя у NPM уже есть внешняя сеть, используй ее имя в .env через NPM_NETWORK.
Если такой сети еще нет, создай ее на Docker host:
docker network create npm_proxy
Если Nginx Proxy Manager уже работает, проверь имя его сети и подставь именно его.
Также убедись, что сам контейнер Nginx Proxy Manager подключен к этой же внешней сети.
3. Настройка списка БД в servers.json
По умолчанию файл пустой:
{
"Servers": {}
}
Если хочешь, чтобы после первого входа серверы уже были добавлены в интерфейс pgAdmin, заполни servers.json.
Пример:
{
"Servers": {
"1": {
"Name": "Production",
"Group": "Servers",
"Host": "postgres-prod",
"Port": 5432,
"MaintenanceDB": "postgres",
"Username": "postgres",
"SSLMode": "prefer"
},
"2": {
"Name": "Staging",
"Group": "Servers",
"Host": "postgres-stage",
"Port": 5432,
"MaintenanceDB": "postgres",
"Username": "postgres",
"SSLMode": "prefer"
}
}
}
Важно:
Hostдолжен быть доступен из контейнераpgAdmin;- если PostgreSQL-контейнеры живут в Docker, они тоже должны быть в общей сети или быть доступны по IP/DNS;
- пароли подключений лучше не хранить в репозитории.
4. Деплой через Portainer
Есть два нормальных варианта.
Вариант A. Через Git-репозиторий
- Закоммить файлы этого репозитория в свой Git.
- В
PortainerоткройStacks. - Нажми
Add stack. - Выбери
Repository. - Укажи URL репозитория.
- В поле compose file path укажи
docker-compose.portainer.yml. - Добавь stack environment variables по значениям из
.env.example. - Нажми
Deploy the stack.
Вариант B. Через Web editor
- Открой
Stacks. - Нажми
Add stack. - Вставь содержимое
docker-compose.portainer.yml. - Ниже заполни stack environment variables из
.env.example. - Нажми
Deploy the stack.
5. Проверка после старта
После развертывания проверь:
- контейнер
pgadminв статусеrunning; - healthcheck стал
healthy; - контейнер подключен к внешней сети
NPM_NETWORK.
Если страница не открывается:
- посмотри логи контейнера в Portainer;
- проверь, что внешний volume создался;
- проверь, что сеть
NPM_NETWORKсуществует; - проверь, что пароль и email заданы.
6. Настройка в Nginx Proxy Manager
Когда контейнер уже поднят:
Перед этим проверь, что DNS-запись домена из PGADMIN_DOMAIN указывает на сервер, где работает Nginx Proxy Manager.
- Открой
Nginx Proxy Manager. - Перейди в
Proxy Hosts. - Нажми
Add Proxy Host. - В
Domain Namesукажи значение изPGADMIN_DOMAIN. Scheme:http.Forward Hostname / IP:pgadmin.Forward Port:80.- Включи
Websockets Support. - Во вкладке
SSLвыпустиLet's Encryptсертификат. - Включи
Force SSL.
Если NPM не видит хост pgadmin, почти всегда проблема в том, что контейнеры не находятся в одной внешней Docker-сети.
Если Nginx Proxy Manager у тебя находится на другом сервере, текущий compose-файл придется немного поменять: вместо expose: "80" опубликовать ports, а в NPM указывать IP Docker host и опубликованный порт.
7. Первый вход в pgAdmin
После настройки proxy:
- Открой
https://PGADMIN_DOMAIN. - Войди под
PGADMIN_DEFAULT_EMAIL. - Используй
PGADMIN_DEFAULT_PASSWORD. - Если в
servers.jsonбыли добавлены серверы, они появятся автоматически. - Если их нет, добавь подключения вручную через интерфейс.
8. Как обновлять
Если используешь image: dpage/pgadmin4:latest, обновление простое:
- В
Portainerоткрой stack. - Нажми
Pull and redeploy.
Если позже захочешь перейти на собственную сборку, можно использовать Dockerfile, но для первого запуска через Portainer обычно стабильнее и проще использовать официальный образ, как в текущем docker-compose.portainer.yml.
9. Полезные замечания
pgAdminхранит пользовательские настройки и сохраненные серверы в volumepgadmin_data.- Если удалить volume, настройки и сохраненные подключения будут потеряны.
servers.jsonимпортируется как исходная преднастройка, но дальше рабочее состояние живет уже в данныхpgAdmin.- Если меняешь
servers.jsonпосле первого запуска, иногда проще удалить volume и развернуть заново, чем ждать повторного импорта.