Переменные файла .env¶
Параметры odpm-окружения (порты, сценарий, пути к бэкапам и клонам git) задаются в .env. С 4.7 при чтении odpm объединяет два файла (иерархия, ADR-013):
| Файл | Роль |
|---|---|
~/.odpm/.env |
Общий профиль пользователя (база) |
.env в каталоге проекта |
Переопределения для этого окружения (overlay, сильнее home) |
Мастер первого запуска записывает в project .env, если файл уже есть, иначе в ~/.odpm/.env. В project можно держать только отличающиеся ключи (например ODOO_PORT и ODPM_COMPOSE_PREFIX), а BACKUP_DIR и ODOO_PROJECTS_DIR — в home.
При первом интерактивном запуске odpm задаёт вопросы мастера настройки. На незнакомые пункты можно нажать Enter.
Пример: общее в home, своё в project¶
~/.odpm/.env:
BACKUP_DIR=/home/dev/backups
ODOO_PROJECTS_DIR=/home/dev/odoo_projects
PATH_TO_SSH_KEY=/home/dev/.ssh/id_ed25519
ODPM_LOCALE=ru_RU
<project>/.env:
ODOO_PORT=8070
ODPM_COMPOSE_PREFIX=acme
ODOO_PLATFORM_DIR=/work/client/odoo/19.0
Переменные¶
| Переменная | Назначение | Значение по умолчанию |
|---|---|---|
BACKUP_DIR |
Каталог архивов баз (--db-backup, --db-restore) |
~/odoo_backups |
ODOO_PROJECTS_DIR |
Куда клонировать platform и git-зависимости | ~/odoo_projects |
ODOO_PORT |
HTTP-порт Odoo на компьютере | 8069 |
POSTGRES_PORT |
Порт PostgreSQL на компьютере (в сценарии server — только localhost) |
5432 |
POSTGRES_SERVICE_NAME |
Имя сервиса PostgreSQL в docker-compose.yml и db_host в odoo.conf (без affix ODPM_COMPOSE_PREFIX / ODPM_COMPOSE_SUFFIX) |
db |
ODPM_COMPOSE_PREFIX |
Префикс для полной изоляции compose-стека: ключи db/odoo, том postgres-data, имя проекта Docker Compose |
не задан |
ODPM_COMPOSE_SUFFIX |
Суффикс — полный peer PREFIX (suffix-only тоже включает physical rewrite); вместе с PREFIX: acme-db-dev |
не задан |
ODPM_PORT_OFFSET |
Сдвиг host-портов publish (odoo/db/sidecars) и host-facing ODOO_PORT/POSTGRES_PORT/DEBUGGER_PORT/GEVENT_PORT; фрагменты на диске без offset |
0 |
ODPM_COMPOSE_NETWORK |
Логическое имя одной compose-сети для всего стека (managed bridge или external); без значения — implicit default network | не задан |
ODPM_COMPOSE_NETWORK_EXTERNAL |
1 / true — сеть уже существует на хосте (external: true); без prefix на имени |
0 |
DEBUGGER_PORT |
Порт отладчика; см. семантику по backend | 5678 |
ODPM_DEBUGGER_BACKEND |
debugpy_listen или pydevd_connect |
debugpy_listen |
ODPM_IDE |
Какие настройки IDE генерировать: vscode, pycharm, both, none |
vscode |
ODPM_DEBUGGER_CONNECT_HOST |
Хост IDE для pydevd_connect (откуда контейнер подключается к Debug Server) |
host.docker.internal |
ODPM_DEBUGGER_SUSPEND |
1 / y — Odoo ждёт IDE после settrace (pydevd_connect) |
0 |
GEVENT_PORT |
Порт веб-сокетов gevent | 8072 |
ODPM_SCENARIO |
developer, server или ci |
developer |
ODPM_CI_IMAGE_BUILDER |
Бэкенд --build-image: docker или kaniko (слабее CLI --image-builder; читается из layered .env, ADR-017) |
docker |
ODPM_CI_IMAGE_PUSH |
1 / true / yes — push после --build-image (как --image-push) |
выкл. |
ODPM_KANIKO_EXECUTOR_MODE |
docker-run или direct (мастер для ci+kaniko предлагает direct по умолчанию) |
docker-run |
ODPM_KANIKO_EXECUTOR_IMAGE |
Образ executor для режима docker-run |
gcr.io/kaniko-project/executor:v1.23.2 |
ODPM_KANIKO_EXECUTOR_BIN |
Бинарь executor для режима direct |
executor |
ODPM_KANIKO_EXECUTOR_WRAPPER |
Опциональный префикс argv для direct (скрипт, запускающий executor от root); рекомендуется на non-root CI |
пусто |
ODPM_KANIKO_EXECUTOR_EXTRA_FLAGS |
Доп. флаги Kaniko executor (напр. --kaniko-dir=/tmp/kaniko) |
пусто |
ODPM_KANIKO_EXECUTOR_SUDO |
1 / true / yes — prepend sudo -n перед executor в direct, если wrapper не задан; нужен passwordless sudo |
выкл. |
ODPM_BASE_IMAGE_REGISTRY |
Prefикс registry для base image при kaniko (обязателен для daemonless base) |
пусто |
ODPM_BASE_IMAGE_PROFILE |
Override профиля base Dockerfile: full, medium или ci (слабее process env; невалидное значение → дефолт сценария). Не меняет остальную политику сценария — см. ADR-007 |
из ODPM_SCENARIO |
ODPM_LOCALE |
Язык сообщений odpm, напр. ru_RU |
берется из системы |
PATH_TO_SSH_KEY |
Путь к ключу SSH для git (редко нужен) | пусто |
ODPM_SECRETS_PROVIDER |
Override type провайдера секретов (file / infisical / id плагина). Слабее --secrets-provider; --secrets-file всё равно форсит file. Визард не спрашивает этот ключ. |
file |
INFISICAL_CLIENT_ID |
Universal Auth client id (только .env / process env) |
пусто |
INFISICAL_CLIENT_SECRET |
Universal Auth client secret | пусто |
INFISICAL_HOST |
Override secrets.provider.host (self-hosted Infisical) |
https://app.infisical.com |
INFISICAL_ENVIRONMENT_SLUG |
Override secrets.provider.environment_slug |
из manifest |
Смена POSTGRES_SERVICE_NAME, POSTGRES_PORT или ODPM_COMPOSE_PREFIX относительно сохранённого снимка даёт database drift — см. состояние PostgreSQL.
DEBUGGER_PORT и backend¶
ODPM_DEBUGGER_BACKEND |
Что означает DEBUGGER_PORT |
Compose |
|---|---|---|
debugpy_listen |
Порт в контейнере, publish на хост (5678:5678) |
IDE подключается к localhost:DEBUGGER_PORT |
pydevd_connect |
Порт Debug Server на хосте (PyCharm слушает) | Порт не публикуется; нужен extra_hosts для host.docker.internal на Linux |
Подробный workflow: отладка в IDE.
Поля ODPM_DEBUGGER_CONNECT_HOST и ODPM_DEBUGGER_SUSPEND попадают в .odpm/runtime/config.json всегда; для debugpy_listen runtime их не использует.
Примеры¶
VS Code / Cursor (по умолчанию)¶
DEBUGGER_PORT=5678
ODPM_DEBUGGER_BACKEND=debugpy_listen
ODPM_IDE=vscode
PyCharm Debug Server¶
DEBUGGER_PORT=5678
ODPM_DEBUGGER_BACKEND=pydevd_connect
ODPM_IDE=pycharm
ODPM_DEBUGGER_CONNECT_HOST=host.docker.internal
ODPM_DEBUGGER_SUSPEND=1
Полный фрагмент .env¶
BACKUP_DIR=/home/user/odoo_backups
ODOO_PROJECTS_DIR=/home/user/odoo_projects
PATH_TO_SSH_KEY=
ODOO_PORT=8069
POSTGRES_PORT=5432
POSTGRES_SERVICE_NAME=db
DEBUGGER_PORT=5678
ODPM_DEBUGGER_BACKEND=debugpy_listen
ODPM_IDE=vscode
GEVENT_PORT=8072
ODPM_SCENARIO=developer
ODPM_LOCALE=ru_RU
Override профиля base image¶
Когда дефолт сценария не подходит (например в ci нужен wkhtmltopdf из medium), задайте профиль явно — wizard этот ключ не спрашивает:
ODPM_SCENARIO=ci
ODPM_BASE_IMAGE_PROFILE=medium
Допустимо: full, medium, ci. Process env сильнее layered .env. См. ADR-007.
SSH и git¶
Мастер настройки не спрашивает путь к SSH-ключу. Обычно достаточно настройки OpenSSH (~/.ssh/config, ssh-agent).
Переменная PATH_TO_SSH_KEY нужна, если git не может использовать стандартный SSH (типично на изолированной машине сборки):
PATH_TO_SSH_KEY=/home/user/.ssh/id_ed25519
Один ключ применяется ко всем указанным удалённым репозиториям.
POSTGRES_SERVICE_NAME¶
Имя сервиса PostgreSQL в docker-compose.yml и значение db_host в odoo.conf (DNS внутри docker-сети). Допустимы строчные буквы, цифры, _ и -; имя должно начинаться с буквы. После смены перегенерируйте docker-compose.yml и odoo.conf (обычный запуск odpm).
Не используется, если задан ODPM_COMPOSE_PREFIX и/или ODPM_COMPOSE_SUFFIX — postgres получает physical имя (например acme-db, db-dev), с предупреждением в логе.
ODPM_COMPOSE_PREFIX / ODPM_COMPOSE_SUFFIX¶
Опциональные affix для изоляции полного compose-стека на общем хосте. Любой из них включает physical rewrite (uses_physical_naming).
| Режим | Поведение |
|---|---|
| Оба не заданы | Как в 4.6: postgres — из POSTGRES_SERVICE_NAME (по умолчанию db), odoo — odoo, том — postgres-data |
PREFIX (acme / acme-) |
acme-db, acme-odoo, том acme-postgres-data, -p acme |
SUFFIX (dev / -dev) |
db-dev, odoo-dev, том postgres-data-dev, -p dev |
| Оба | acme-db-dev, acme-odoo-dev, -p acme-dev |
Нормализация PREFIX: trailing -; SUFFIX: leading -. Невалидное значение игнорируется независимо (можно оставить только второй affix). Имена sidecar не переименовываются.
В odpm.json sidecar указывают логические имена (depends_on: ["db"]); для hostname — ${@service:db}.
Пример:
ODPM_COMPOSE_PREFIX=acme
ODPM_COMPOSE_SUFFIX=dev
См. ADR-012, состояние PostgreSQL, подстановку в odpm.json.
ODPM_PORT_OFFSET¶
Целое (может быть отрицательным). Прибавляется к host-стороне каждого publish в итоговом docker-compose.yml (после merge sidecars/patches) и к host-facing портам из .env (effective_odoo_port и т.д., включая DEBUGGER_PORT при pydevd_connect). Порт внутри контейнера не меняется. Файлы .odpm/compose/fragments/*.yml на диске остаются без offset — source of truth для publish — корневой docker-compose.yml. Значение вне 1..65535 после сдвига → ConfigError. Смена OFFSET не создаёт database drift (в снимке хранится raw POSTGRES_PORT); odpm database status показывает effective host port.
ODOO_PORT=8069
POSTGRES_PORT=5432
ODPM_PORT_OFFSET=10
→ publish/host connect: 8079, 5442, …
ODPM_COMPOSE_NETWORK / ODPM_COMPOSE_NETWORK_EXTERNAL¶
Опционально объявить одну именованную Docker Compose-сеть для всего odpm-стека (db, odoo, sidecars). Без этих переменных odpm не добавляет секцию networks: в docker-compose.yml — сервисы остаются в implicit default network проекта (как в 4.6).
| Режим | .env |
Поведение |
|---|---|---|
| По умолчанию | переменные не заданы | Без networks: в YAML |
| Managed | ODPM_COMPOSE_NETWORK=stack |
networks: { stack: { driver: bridge } }, все сервисы без своего networks подключаются |
| External | ODPM_COMPOSE_NETWORK=proxy + ODPM_COMPOSE_NETWORK_EXTERNAL=1 |
external: true; имя без prefix (общая сеть reverse proxy) |
С ODPM_COMPOSE_PREFIX=acme managed-сеть stack становится physical acme-stack; с ODPM_COMPOSE_SUFFIX=dev — stack-dev; с обоими — acme-stack-dev. External proxy остаётся proxy.
Нормализация имени: как у prefix ([a-z0-9-], с буквы). Невалидное значение отключает сеть (warning). ODPM_COMPOSE_NETWORK_EXTERNAL без имени сети не действует.
Типичный split (ADR-013):
~/.odpm/.env:
ODPM_COMPOSE_NETWORK=proxy
ODPM_COMPOSE_NETWORK_EXTERNAL=1
<project>/.env:
ODPM_COMPOSE_PREFIX=acme
ODPM_COMPOSE_NETWORK=stack
Sidecar в manifest с networks: ["stack"] согласован только при ODPM_COMPOSE_NETWORK=stack; иначе odpm manifest validate выдаёт warning. См. плагины, ADR-014.
Смена сети не даёт database drift (не в снимке last_run.json); перегенерируется docker-compose.yml при следующем materialize.
Переменные для подстановки в manifest¶
Помимо встроенных ключей odpm в .env можно задавать произвольные имена для ${VAR} в odpm.json и user_settings.json (например ODOO_PLATFORM_DIR, OCA_WEB_PATH, GIT_HOST). Они не управляют портами или сценарием сами по себе — только подставляются в whitelist-поля manifest при чтении JSON.
Приоритет для ${VAR}: переменные процесса odpm перекрывают effective .env (merge home + project). Пустой default в manifest: ${VAR:-}.
Типичный фрагмент project .env для локальной разработки:
ODOO_PLATFORM_DIR=/home/dev/odoo/19.0
DEVELOPING_PROJECT_DIR=/home/dev/my_addons
OCA_WEB_PATH=/home/dev/src/oca/web
GIT_HOST=git.company.example