Runtipi: как правильно переключить встроенный Postgres-контейнер на внешний Postgres (.env / runtipi-cli / docker compose)?

Ссылка скопирована
1 ответ

Нужна помощь знающих людей по Runtipi.

Исходные условия

  • Runtipi установлен вLXC-контейнере(Proxmox).
  • По вводным: установка была через скриптStart-samohosting bash -c "$(wget -qLO - install.samohosting.ru)"
  • Runtipi версия:V4.6.5
  • Каталог:/opt/runtipi
  • По вводным: runtipi запускается контейнерами:runtipi,runtipi-reverse-proxy,runtipi-queue,runtipi-db (postgres:14)

Цель
ХочуПо вводным: подключить Runtipi к внешнему PostgreSQLСейчас ситуация такая: (на другом LXC-контейнере в той же сети), чтобы не держатьruntipi-db(postgres:14По вводным:) внутри LXC. Внешний Postgres доступен, подключение проверял:

docker run --rm --network runtipi_tipi_main_network postgres:14 \ psql "host=192.168.100.106 port=5432 dbname=tipi user=tipi password=STRONG_PASSWORD" \ -c "select current_user, current_database(), inet_client_addr(), current_setting('search_path');"

Команды выполняются,create schema if not exists drizzle;Тоже проходит.

Что было изначально
В.envПо вводным: после установки была задана переменная окруженияPOSTGRES_HOST=runtipi-dbПо вводным:, и Runtipi заводится со своим контейнеромruntipi-db.

Что я проверял

  1. По вводным: прописал переменные прямо вdocker-compose.yml(у сервисаruntipiПо вводным:), предварительно создав БДtipiИ выдав все права:
    environment: POSTGRES_HOST: 192.168.100.106 POSTGRES_PORT: "5432" POSTGRES_DBNAME: tipi POSTGRES_USERNAME: tipi POSTGRES_PASSWORD: STRONG_PASSWORD

    Сейчас ситуация такая: но при старте получал ошибки миграций:

    Error migrating database: Failed query: CREATE SCHEMA IF NOT EXISTS "drizzle"

    По вводным: (При этом внешняя БД доступна и schema создаётся вручную черезpsql.)

  2. Нашёл вДокументации RuntipiОписание.env.local:

    When running CLI commands, you can override any environment variable by providing a custom .env file
    sudo ./runtipi-cli start --env-file ./.env.local

    Сделал:cp .env .env.local nano .env.localВ.env.localОставил минимально:

    POSTGRES_HOST=192.168.100.106 POSTGRES_PORT=5432 POSTGRES_DBNAME=tipi POSTGRES_USERNAME=tipi POSTGRES_PASSWORD=STRONG_PASSWORD LOG_LEVEL=info

    Запуск:

    docker compose down sudo ./runtipi-cli start --env-file ./.env.local

    После запуска:

    • docker inspect runtipi | grep POSTGRESПо вводным: показывает, что переменныеПо вводным: есть в конфиге контейнера.
    • Но внутри контейнераПеременных нет:
      docker exec -it runtipi sh -lc 'env | sort | egrep "^(POSTGRES_|DATABASE_URL|LOG_LEVEL)="'

      Вывод:LOG_LEVEL=infoPOSTGRES_*Отсутствуют.

    Такжеdocker compose --env-file ./.env.local configПочему-то показываетPOSTGRES_HOST: runtipi-db, будто используется.env, а не.env.local. И при этомruntipi-dbПо вводным: всё равно поднимается какpostgres:14.


Дополнительно проверял

  • По вводным: прописывал параметры PostgreSQL напрямую вdocker-compose.yml(секцияenvironmentСервисаruntipi).
    • По вводным: либо Runtipi всё равно подключался кruntipi-db;
    • По вводным: либо падал на миграциях (CREATE SCHEMA drizzle).
  • Сейчас ситуация такая: проверял, не перезаписываются ли переменные на старте:
    • docker compose config
    • docker inspect runtipi
    • envВнутри контейнера
    • По вводным: данные между ними расходятся.
  • Проверял сделать.env Только для чтения:
    1. volumes: * /opt/runtipi/.env:/opt/runtipi/.env:roИchmod 444 .env
    2. По вводным: несмотря на это, при старте черезruntipi-cli:
      • .envПо вводным: всё равно используется с дефолтами
      • POSTGRES_HOSTСнова =runtipi-db
    3. Останавливалruntipi-dbСейчас ситуация такая: вручную и запускал Runtipi без него — внешний PostgreSQL всё равно не использовался.


Вопросы

  1. Каким способом правильно и “канонично” перевести Runtipi на внешний PostgreSQL?
    Черезruntipi-cli+--env-file, черезdocker-compose.ymlНужно понять:, или есть другой supported-way?
  2. По вводным: почему может быть ситуация, когда:
    • docker inspectПоказываетPOSTGRES_*
    • По вводным: но внутри контейнера их нет вenv?
  3. Есть ли у RuntipiПо вводным: дополнительный слой генерации/перезаписи env, который игнорируетPOSTGRES_HOSTИ возвращаетruntipi-db?

По вводным: если нужно — могу приложитьdocker-compose.yml,.env,.env.local, логиdocker logs runtipiИ вывод команд./runtipi-cli.

Заранее спасибо!

UPD:

По вводным: собрал архив и залил в репозиторийhttps://github.com/DataArchitectPro/runtipi_habr_debugПо вводным: со всеми конфигами/логами/inspect’ами до и после попытки переключения Runtipi v4.6.5 на внешний PostgreSQL.

Что делал:По вводным: добавил параметры внешней БД в.env.local (POSTGRES_HOST=192.168.100.106 и т.д.), проверил env внутри контейнера runtipi — там POSTGRES_* действительно указывают на внешний хост. Но при этом docker compose config после изменений всё равно показывает POSTGRES_HOST: runtipi-db + depends_on: runtipi-db, и контейнер runtipi-db продолжает подниматься. В docker inspect runtipi видно, что /opt/runtipi/.env смонтирован внутрь контейнера как /data/.env, а в этом.env всё ещё POSTGRES_HOST=runtipi-db. В логах runtipi есть Generating system env file — похоже, Runtipi на старте генерирует/перезаписывает системный env из /data/.env, игнорируя.env.local.

По вводным: в архиве 2 снимка: 00_Исходное_состояние и 01_Попытка_внешний_PostgreSQL, плюс diffs и выводы команд (env внутри контейнера, compose config, inspect).

Нужно понять: нужен совет: какой supported-way “правильно” указать внешний Postgres так, чтобы Runtipi не возвращал runtipi-db?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Сергей Миронов Ответ

В Runtipi переключать встроенный Postgres на внешний нужно аккуратно: сначала сделать бэкап, остановить приложения, перенести данные, затем поменять переменные окружения и только после этого запускать стек. Самая частая ошибка — просто заменить host в .env, не перенести базу и не проверить права пользователя.

Сначала зафиксируйте текущий контейнер и базу:

docker ps | grep postgres
docker exec -it tipi-postgres pg_dumpall -U postgres > runtipi-backup.sql

docker ps | grep postgres docker exec -it tipi-postgres pg_dumpall -U postgres > runtipi-backup.sql

На внешнем PostgreSQL создайте пользователя и базы, которые ожидает Runtipi/приложения. Если используется один общий пользователь, дайте ему права только на нужные базы, не делайте суперпользователя без необходимости.

Дальше импортируйте дамп во внешний Postgres:

psql -h external-db.example.local -U postgres -f runtipi-backup.sql

psql -h external-db.example.local -U postgres -f runtipi-backup.sql

После этого остановите Runtipi и проверьте, какие переменные реально используются. В разных версиях они могут лежать в .env, compose override или генерироваться через runtipi-cli. Важно менять конфигурацию тем способом, который Runtipi не перезапишет при следующем обновлении.

Проверьте сетевую доступность из контейнеров Runtipi:

docker run --rm -it postgres:16 psql -h external-db.example.local -U your_user -d your_db -c 'select 1'

docker run --rm -it postgres:16 psql -h external-db.example.local -U your_user -d your_db -c 'select 1'

Если внешний Postgres находится на хосте, для Docker на Linux не всегда работает localhost. Используйте реальный IP, DNS-имя или корректный docker network route. После запуска смотрите логи приложений: ошибки auth, database does not exist, permission denied, connection refused обычно сразу показывают, что не так.

Итог: бэкап → перенос → проверка доступа → изменение конфигурации Runtipi → запуск. Не удаляйте старый контейнер Postgres, пока не проверите вход в Runtipi и работу приложений на внешней базе.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно