Runtipi: как правильно переключить встроенный Postgres-контейнер на внешний Postgres (.env / runtipi-cli / docker compose)?
Нужна помощь знающих людей по 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.
Что я проверял
- По вводным: прописал переменные прямо в
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.) - Нашёл вДокументации 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).
- По вводным: либо Runtipi всё равно подключался к
- Сейчас ситуация такая: проверял, не перезаписываются ли переменные на старте:
docker compose configdocker inspect runtipienvВнутри контейнера- По вводным: данные между ними расходятся.
- Проверял сделать
.envТолько для чтения:volumes: * /opt/runtipi/.env:/opt/runtipi/.env:roИchmod 444 .env- По вводным: несмотря на это, при старте через
runtipi-cli:.envПо вводным: всё равно используется с дефолтамиPOSTGRES_HOSTСнова =runtipi-db
- Останавливал
runtipi-dbСейчас ситуация такая: вручную и запускал Runtipi без него — внешний PostgreSQL всё равно не использовался.
Вопросы
- Каким способом правильно и “канонично” перевести Runtipi на внешний PostgreSQL?
Черезruntipi-cli+--env-file, черезdocker-compose.ymlНужно понять:, или есть другой supported-way? - По вводным: почему может быть ситуация, когда:
docker inspectПоказываетPOSTGRES_*- По вводным: но внутри контейнера их нет в
env?
- Есть ли у 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?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос