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_EMAIL
  • PGADMIN_DEFAULT_PASSWORD
  • PGADMIN_DOMAIN
  • NPM_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-репозиторий

  1. Закоммить файлы этого репозитория в свой Git.
  2. В Portainer открой Stacks.
  3. Нажми Add stack.
  4. Выбери Repository.
  5. Укажи URL репозитория.
  6. В поле compose file path укажи docker-compose.portainer.yml.
  7. Добавь stack environment variables по значениям из .env.example.
  8. Нажми Deploy the stack.

Вариант B. Через Web editor

  1. Открой Stacks.
  2. Нажми Add stack.
  3. Вставь содержимое docker-compose.portainer.yml.
  4. Ниже заполни stack environment variables из .env.example.
  5. Нажми 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.

  1. Открой Nginx Proxy Manager.
  2. Перейди в Proxy Hosts.
  3. Нажми Add Proxy Host.
  4. В Domain Names укажи значение из PGADMIN_DOMAIN.
  5. Scheme: http.
  6. Forward Hostname / IP: pgadmin.
  7. Forward Port: 80.
  8. Включи Websockets Support.
  9. Во вкладке SSL выпусти Let's Encrypt сертификат.
  10. Включи Force SSL.

Если NPM не видит хост pgadmin, почти всегда проблема в том, что контейнеры не находятся в одной внешней Docker-сети.

Если Nginx Proxy Manager у тебя находится на другом сервере, текущий compose-файл придется немного поменять: вместо expose: "80" опубликовать ports, а в NPM указывать IP Docker host и опубликованный порт.

7. Первый вход в pgAdmin

После настройки proxy:

  1. Открой https://PGADMIN_DOMAIN.
  2. Войди под PGADMIN_DEFAULT_EMAIL.
  3. Используй PGADMIN_DEFAULT_PASSWORD.
  4. Если в servers.json были добавлены серверы, они появятся автоматически.
  5. Если их нет, добавь подключения вручную через интерфейс.

8. Как обновлять

Если используешь image: dpage/pgadmin4:latest, обновление простое:

  1. В Portainer открой stack.
  2. Нажми Pull and redeploy.

Если позже захочешь перейти на собственную сборку, можно использовать Dockerfile, но для первого запуска через Portainer обычно стабильнее и проще использовать официальный образ, как в текущем docker-compose.portainer.yml.

9. Полезные замечания

  • pgAdmin хранит пользовательские настройки и сохраненные серверы в volume pgadmin_data.
  • Если удалить volume, настройки и сохраненные подключения будут потеряны.
  • servers.json импортируется как исходная преднастройка, но дальше рабочее состояние живет уже в данных pgAdmin.
  • Если меняешь servers.json после первого запуска, иногда проще удалить volume и развернуть заново, чем ждать повторного импорта.
Description
No description provided
Readme 36 KiB
Languages
Python 71.1%
Dockerfile 28.9%