Podman

Запуск шлюза OpenClaw в rootless-контейнере Podman. Используется тот же образ, что и для Docker (сборка из Dockerfile репозитория).

Требования

  • Podman (rootless)
  • Sudo для одноразовой настройки (создание пользователя, сборка образа)

Быстрый старт

1. Одноразовая настройка (из корня репозитория; создаёт пользователя, собирает образ, устанавливает скрипт запуска):

./setup-podman.sh

Также создаёт минимальный ~openclaw/.openclaw/openclaw.json (устанавливает gateway.mode="local"), чтобы шлюз мог запуститься без прохождения мастера.

По умолчанию контейнер не устанавливается как systemd-сервис, вы запускаете его вручную (см. ниже). Для production-конфигурации с автозапуском и перезапусками установите его как systemd Quadlet user service:

./setup-podman.sh --quadlet

(Или задайте OPENCLAW_PODMAN_QUADLET=1; используйте --container для установки только контейнера и скрипта запуска.)

Опциональные переменные окружения при сборке (задайте перед setup-podman.sh):

  • OPENCLAW_DOCKER_APT_PACKAGES — установить дополнительные apt-пакеты при сборке образа
  • OPENCLAW_EXTENSIONS — предустановить зависимости расширений (через пробел, например diagnostics-otel matrix)

2. Запуск шлюза (ручной, для быстрого smoke-тестирования):

./scripts/run-openclaw-podman.sh launch

3. Мастер настройки (например, для добавления каналов или провайдеров):

./scripts/run-openclaw-podman.sh launch setup

Затем откройте http://127.0.0.1:18789/ и используйте токен из ~openclaw/.openclaw/.env (или значение, выведенное при настройке).

Systemd (Quadlet, опционально)

Если вы выполнили ./setup-podman.sh --quadlet (или OPENCLAW_PODMAN_QUADLET=1), Podman Quadlet устанавливается как systemd user service для пользователя openclaw. Сервис включается и запускается в конце настройки.

  • Запуск: sudo systemctl --machine openclaw@ --user start openclaw.service
  • Остановка: sudo systemctl --machine openclaw@ --user stop openclaw.service
  • Статус: sudo systemctl --machine openclaw@ --user status openclaw.service
  • Логи: sudo journalctl --machine openclaw@ --user -u openclaw.service -f

Файл quadlet находится в ~openclaw/.config/containers/systemd/openclaw.container. Для изменения портов или переменных окружения отредактируйте этот файл (или .env), затем sudo systemctl --machine openclaw@ --user daemon-reload и перезапустите сервис. При загрузке сервис запускается автоматически, если для openclaw включён lingering (setup делает это при наличии loginctl).

Чтобы добавить quadlet после начальной настройки без него, перезапустите: ./setup-podman.sh --quadlet.

Пользователь openclaw (без интерактивного входа)

setup-podman.sh создаёт системного пользователя openclaw:

  • Shell: nologin — без интерактивного входа; уменьшает поверхность атаки.

  • Home: например /home/openclaw — содержит ~/.openclaw (конфигурация, workspace) и скрипт запуска run-openclaw-podman.sh.

  • Rootless Podman: пользователю нужен диапазон subuid и subgid. Многие дистрибутивы назначают их автоматически при создании пользователя. Если setup выводит предупреждение, добавьте строки в /etc/subuid и /etc/subgid:

    openclaw:100000:65536

    Затем запускайте шлюз от этого пользователя (например, из cron или systemd):

    sudo -u openclaw /home/openclaw/run-openclaw-podman.sh
    sudo -u openclaw /home/openclaw/run-openclaw-podman.sh setup
  • Конфигурация: только openclaw и root имеют доступ к /home/openclaw/.openclaw. Для редактирования: используйте Control UI при работающем шлюзе или sudo -u openclaw $EDITOR /home/openclaw/.openclaw/openclaw.json.

Окружение и конфигурация

  • Токен: хранится в ~openclaw/.openclaw/.env как OPENCLAW_GATEWAY_TOKEN. setup-podman.sh и run-openclaw-podman.sh генерируют его при отсутствии (используют openssl, python3 или od).
  • Опционально: в .env можно задать ключи провайдеров (например, GROQ_API_KEY, OLLAMA_API_KEY) и другие переменные OpenClaw.
  • Порты хоста: по умолчанию скрипт маппит 18789 (шлюз) и 18790 (bridge). Переопределяйте хостовые порты через OPENCLAW_PODMAN_GATEWAY_HOST_PORT и OPENCLAW_PODMAN_BRIDGE_HOST_PORT.
  • Привязка шлюза: по умолчанию run-openclaw-podman.sh запускает шлюз с --bind loopback для безопасного локального доступа. Для LAN-доступа задайте OPENCLAW_GATEWAY_BIND=lan и настройте gateway.controlUi.allowedOrigins (или явно включите host-header fallback) в openclaw.json.
  • Пути: конфигурация и workspace хоста по умолчанию в ~openclaw/.openclaw и ~openclaw/.openclaw/workspace. Переопределяйте хостовые пути через OPENCLAW_CONFIG_DIR и OPENCLAW_WORKSPACE_DIR.

Модель хранения

  • Постоянные данные хоста: OPENCLAW_CONFIG_DIR и OPENCLAW_WORKSPACE_DIR монтируются bind-mount в контейнер, сохраняя состояние на хосте.
  • Эфемерный tmpfs sandbox: при включённом agents.defaults.sandbox sandbox-контейнеры монтируют tmpfs в /tmp, /var/tmp и /run. Эти пути хранятся в памяти и исчезают вместе с sandbox-контейнером; основной контейнер Podman своих tmpfs-монтирований не добавляет.
  • Точки роста диска: следите за media/, agents/<agentId>/sessions/sessions.json, JSONL-файлами транскриптов, cron/runs/*.jsonl и ротируемыми логами в /tmp/openclaw/ (или заданном logging.file).

setup-podman.sh размещает образ tar во временной приватной директории и выводит выбранный базовый каталог при настройке. Для не-root запусков принимает TMPDIR только когда этот каталог безопасен; иначе fallback на /var/tmp, затем /tmp. Сохранённый tar доступен только владельцу и передаётся через podman load целевого пользователя.

Полезные команды

  • Логи: С quadlet: sudo journalctl --machine openclaw@ --user -u openclaw.service -f. Со скриптом: sudo -u openclaw podman logs -f openclaw
  • Остановка: С quadlet: sudo systemctl --machine openclaw@ --user stop openclaw.service. Со скриптом: sudo -u openclaw podman stop openclaw
  • Повторный запуск: С quadlet: sudo systemctl --machine openclaw@ --user start openclaw.service. Со скриптом: перезапустите скрипт или podman start openclaw
  • Удаление контейнера: sudo -u openclaw podman rm -f openclaw — конфигурация и workspace на хосте сохраняются

Решение проблем

  • Permission denied (EACCES) для конфигурации или auth-profiles: контейнер по умолчанию использует --userns=keep-id и работает с тем же uid/gid, что и хостовой пользователь. Убедитесь, что OPENCLAW_CONFIG_DIR и OPENCLAW_WORKSPACE_DIR принадлежат этому пользователю.
  • Запуск шлюза заблокирован (нет gateway.mode=local): убедитесь, что ~openclaw/.openclaw/openclaw.json существует и содержит gateway.mode="local". setup-podman.sh создаёт этот файл при отсутствии.
  • Rootless Podman не работает для пользователя openclaw: проверьте /etc/subuid и /etc/subgid на наличие строки для openclaw (например, openclaw:100000:65536). Добавьте при отсутствии и перезапустите.
  • Имя контейнера занято: скрипт запуска использует podman run --replace, заменяя существующий контейнер. Для ручной очистки: podman rm -f openclaw.
  • Скрипт не найден при запуске от openclaw: убедитесь, что setup-podman.sh был выполнен и run-openclaw-podman.sh скопирован в домашний каталог openclaw (например, /home/openclaw/run-openclaw-podman.sh).
  • Quadlet-сервис не найден или не запускается: выполните sudo systemctl --machine openclaw@ --user daemon-reload после редактирования .container-файла. Quadlet требует cgroups v2: podman info --format '{{.Host.CgroupsVersion}}' должен показать 2.

Опционально: запуск от своего пользователя

Для запуска шлюза от обычного пользователя (без выделенного openclaw): соберите образ, создайте ~/.openclaw/.env с OPENCLAW_GATEWAY_TOKEN и запустите контейнер с --userns=keep-id и монтированием в ~/.openclaw. Скрипт запуска рассчитан на процесс с пользователем openclaw; для однопользовательской конфигурации можно запустить podman run из скрипта вручную, указав конфигурацию и workspace на свой home. Для большинства рекомендуется: используйте setup-podman.sh и запускайте от пользователя openclaw для изоляции конфигурации и процесса.