Задать вопрос
DataArchitectPro
@DataArchitectPro
SQL-разработчик и фанат self-hosting

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.

Что я пробовал
  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?
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Средний 2 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Linux для робототехников
    3 месяца
    Далее
  • Stepik
    Основы Linux
    2 недели
    Далее
  • Учебный центр IBS
    AL-1801 ОС Astra Linux Special Edition 1.8 для пользователей
    1 неделя
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы