Установка в Docker

Не хотите читать всё это?

Просто скиньте в любой ИИ-чат (Claude, ChatGPT и т.д.) ссылку на https://pastukhov.com/agents/agent/docker.md или на https://pastukhov.com/llms.txt и попросите сгенерировать конфигурационные файлы и команды. Он прочитает документацию, задаст несколько вопросов о вашей настройке и выдаст готовую конфигурацию. Экономьте время — пусть модель читает за вас.

Вы также можете связаться со мной через Telegram — я всегда рад помочь. И это не просто вежливость — мне действительно нравится общаться с единомышленниками, особенно если вы так же увлечены программированием, как и я.

Docker — это технология «контейнеров»: приложение запускается в полностью изолированной среде, где для него уже подготовлены все нужные инструменты. Для каждого проекта — свой контейнер. Это безопасно: даже если модель ИИ начнёт вести себя некорректно, пострадать может только её контейнер, а не ваш сервер или компьютер. Сломанный контейнер пересоздаётся за секунды. Ещё один плюс: инструменты и настройки можно добавлять под конкретный проект, не раздувая универсальный образ.

Минимальные системные требования

Минимальный Docker-образ уверенно работает даже на однопроцессорном VPS с 2 ГБ оперативной памяти — вместе с другими сервисами вроде Apache, PHP, MySQL или nginx на живом сайте:

  • 1 ГБ RAM — контейнер потребляет ~430 МБ в покое, до 800 МБ в активном режиме (зависит от вызываемых инструментов)
  • 1 ядро CPU — ~6% в покое, до 80% одного ядра в активном режиме (зависит от вызываемых инструментов)

Пользователи Docker Desktop: если вам удобнее графический интерфейс для Docker, воспользуйтесь инструкциями для вашей платформы: Windows Docker Desktop или Mac Docker Desktop.

Я подготовил два готовых Docker-образа: maxpastukhov/agent:dev-latest и maxpastukhov/agent:min-latest. Разница — в составе инструментов, и от неё зависит размер.

Dev-образ (2.8 ГБ) содержит Pastukhov Agent и всё необходимое для его разработки и сборки — в первую очередь набор для сборки .NET-приложений (ASP.NET Core SDK) и Node.js с инструментами сборки и проверки кода. Выбирайте его, если разрабатываете клиент-серверные приложения на ASP.NET Core и Node.js.

Что входит в dev-образ
  • ASP.NET Core 9.0 SDK — сборка и запуск .NET-приложений
  • Node.js (LTS) — среда выполнения JavaScript с менеджером пакетов npm
  • Python 3 — язык Python с pip и venv
  • Claude Code CLI — консольный ИИ-агент, на базе которого работает Pastukhov Agent
  • dotnet-ef — управление миграциями базы данных Entity Framework Core
  • JetBrains ReSharper CLI — проверка и очистка кода .NET
  • flake8 — проверка стиля кода Python
  • Docker + Docker Compose — управление контейнерами изнутри контейнера
  • git — система контроля версий
  • mc — файловый менеджер Midnight Commander
  • ncdu — анализ занятого места на диске
  • sqlite3 — работа с базой данных SQLite из командной строки
  • curl, wget, rsync, zip, unzip — сетевые утилиты и архиваторы

Минимальный образ (570 МБ) содержит Pastukhov Agent с Python и всеми необходимыми для работы инструментами — это полнофункциональный образ для проектов, которым не нужна сборка .NET. Он заметно меньше, но всё необходимое для работы агента уже есть. Не хватает какой-то библиотеки? Попросите ИИ-агента установить её прямо в контейнере. Или соберите свой образ на его основе — под ваши задачи. Если нужна помощь с этим, напишите мне в Telegram.

Что входит в минимальный образ
  • ASP.NET Core 9.0 Runtime — запуск .NET-приложений (сборка не нужна, поэтому SDK нет)
  • Node.js (LTS) — среда выполнения JavaScript с менеджером пакетов npm
  • Python 3 — язык Python с pip и venv
  • Claude Code CLI — консольный ИИ-агент, на базе которого работает Pastukhov Agent
  • flake8 — проверка стиля кода Python
  • Docker + Docker Compose — управление контейнерами изнутри контейнера
  • git — система контроля версий
  • mc — файловый менеджер Midnight Commander
  • ncdu — анализ занятого места на диске
  • sqlite3 — работа с базой данных SQLite из командной строки
  • curl, wget, rsync, zip, unzip — сетевые утилиты и архиваторы

В планах — образы под конкретные языки и фреймворки. Напишите мне в Telegram, какой стек вы используете, — мне несложно собирать и поддерживать новые образы, главное знать, что реально нужно вам на практике.

Расширение образа собственными инструментами

Оба образа уже содержат всё, что нужно для работы агента. Но если ваш проект использует особые языки или инструменты, вы можете собрать собственный образ на основе maxpastukhov/agent:min-latest — с теми инструментами, что нужны именно вам. Тогда каждый новый контейнер сразу запускается с готовой средой, а не доустанавливает пакеты при каждом пересоздании.

Создание собственного Dockerfile

В папке с вашим docker-compose.yml создайте файл Dockerfile — это «рецепт» сборки образа, в котором указано, какие пакеты добавить:

FROM maxpastukhov/agent:min-latest

# Add system packages
RUN apt-get update && apt-get install -y \
    ruby \
    default-jdk \
    && rm -rf /var/lib/apt/lists/*

# Add Python packages
RUN python3 -m pip install --break-system-packages \
    fastapi \
    pytest

# Add Node.js packages (Node.js is pre-installed in min image)
RUN npm install -g \
    typescript \
    @angular/cli

# Add global tools
RUN dotnet tool install -g Your.Tool.Name

Затем укажите в docker-compose.yml свой образ вместо готового — Docker сам соберёт его из вашего Dockerfile:

services:
  my_project:
    container_name: my_project
    build: .                    # builds from Dockerfile in this directory
    image: my-project:latest    # tag for the built image
    ports:
      - "5001:80"
    volumes:
      - "./MyProject:/project"
    environment:
      - AGENT_LOGIN=agent
      # ... rest of your environment variables
    restart: unless-stopped
    working_dir: /app

Соберите и запустите:

docker compose up -d --build

Флаг --build пересобирает ваш образ, если изменился Dockerfile; без него Docker использует последнюю готовую сборку.

Или просто попросите модель

Возиться с Dockerfile необязательно: можно просто попросить ИИ-агента установить нужные пакеты внутри уже запущенного контейнера — у него есть доступ sudo, и он умеет ставить всё через apt, pip или npm. Минус такого способа в том, что при пересоздании контейнера установки теряются — собственный образ делает их постоянными.

services:
  pastukhov_agent_demo: # переименуйте в соответствии с названием вашего проекта
    container_name: pastukhov_agent_demo # переименуйте в соответствии с названием вашего проекта
    image: maxpastukhov/agent:dev-latest
    ports:
      - "5001:80"
    volumes:
      - "./DemoProject:/project" # замените ./DemoProject на папку с вашим проектом
    environment:
      - AGENT_LOGIN=agent
      - AGENT_PASSWORD=5694d08a2e53ffcae0c3103e5ad6f6076abd960eb1f8a56577040bc1028f702b # SHA256-хеш пароля `agent`
      - JWT_SECRET_KEY= # должна быть уникальная, сложная для guessing случайная строка (минимум 32 символа). Любой, кто знает этот ключ, может генерировать валидные токены аутентификации. Если опущено, ключ генерируется автоматически, но теряется при пересоздании контейнера, заставляя всех пользователей перелогиниваться
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:80 # порт внутри контейнера
      - AGENT_PROJECT_PATH=/project # путь к проекту внутри контейнера
      - AGENT_GIT_USER_NAME=User # ваше имя для git-коммитов
      - AGENT_GIT_USER_EMAIL=me@gmail.com # ваш email для git-коммитов
      - AGENT_GIT_URL=https://github.com/pastukhov/DemoProject.git # замените на git-URL вашего проекта
      - AGENT_GIT_LOGIN= # ваш git-логин
      - AGENT_GIT_PASSWORD= # ваш personal access key для git
      # опционально: хранение данных в Postgres, а не в локальном SQLite. Рекомендуется иметь отдельные базы для каждого из ваших проектов.
      # - AGENT_DATABASE=Server=postgres;Port=5433;User Id=code;Password=code;Database=code;Pooling=false;Timeout=600;CommandTimeout=600;KeepAlive=600;
      # опционально: отправка статистики чатов в Clickhouse для визуализации в Grafana
      # - AGENT_CLICKHOUSE_URL=Host=clickhouse;Port=8127;Protocol=http;Database=code;Username=code;Password=code
      # опционально: ваш лицензионный ключ, если он есть
      # - AGENT_LICENSE=
    restart: unless-stopped
    working_dir: /app

Это полный готовый пример запуска — замените в нём имя проекта, папку, git-адрес и учётные данные на свои. ports — это внешний и внутренний порты: по первому приложение открывается в браузере, второй — порт внутри контейнера. volumes — папка проекта: она подключается в контейнер, поэтому все файлы и база данных сохраняются между перезапусками.

Docker CLI с файлом .env

Запустить Pastukhov Agent можно и напрямую командой docker run, вынеся переменные окружения в файл .env. Так секреты не попадают в файл конфигурации или командную строку.

Создайте файл .env рядом с папкой вашего проекта:

# .env
AGENT_LOGIN=agent
AGENT_PASSWORD=5694d08a2e53ffcae0c3103e5ad6f6076abd960eb1f8a56577040bc1028f702b
JWT_SECRET_KEY=
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://+:80
AGENT_PROJECT_PATH=/project
AGENT_GIT_USER_NAME=User
AGENT_GIT_USER_EMAIL=me@gmail.com
AGENT_GIT_URL=https://github.com/pastukhov/DemoProject.git
AGENT_GIT_LOGIN=
AGENT_GIT_PASSWORD=

Затем запустите контейнер:

docker run -d \
  --name pastukhov_agent_demo \
  --env-file .env \
  -p 5001:80 \
  -v ./DemoProject:/project \
  --restart unless-stopped \
  -w /app \
  maxpastukhov/agent:dev-latest

Флаг --env-file считывает все переменные из файла. Отдельные значения можно переопределить дополнительными флагами -e — например, -e AGENT_LICENSE=your-key.

Автоматически генерируемые учетные данные

Если не задавать переменные окружения AGENT_LOGIN и AGENT_PASSWORD, приложение само создаст временные учётные данные при запуске: логин будет agent, а случайный пароль появится в консоли контейнера. Посмотреть его можно командой:

docker logs pastukhov_agent_demo

Такие учётные данные действуют до перезапуска контейнера. На странице входа появится уведомление о временных учётных данных — и предложение задать постоянные через переменные окружения.

Генерация хеша пароля

В переменную AGENT_PASSWORD нужно записывать не сам пароль, а его SHA256-хеш — «отпечаток» пароля, по которому нельзя восстановить оригинал. Хранить пароль в открытом виде в файлах конфигурации небезопасно — достаточно одного взгляда на файл, чтобы его украсть. На странице входа есть встроенный генератор: нажмите ссылку «▾ SHA256-генератор» под кнопкой входа. Он работает полностью на вашем устройстве: введите пароль, скопируйте хеш и вставьте его в конфигурацию окружения.

Рекомендации по безопасности

Файл .pastukhov/models.yml внутри проекта предназначен для сохранения в системе контроля версий — чтобы одинаковые настройки были на каждой установке. А вот секреты (API-ключи, лицензионные ключи и т.п.) коммитить не стоит: передавайте их как переменные окружения в Docker-контейнере и ссылайтесь на них по имени через синтаксис $VARIABLE_NAME в models.yml. Полный список переменных и принципы работы — на странице Модели:

# .pastukhov/models.yml
environments:
  production:
    variables:
      API_KEY: $MY_API_KEY          # resolved from the container's environment at runtime
      LICENSE_KEY: $MY_LICENSE_KEY   # not committed to git
      PUBLIC_URL: https://example.com # non-sensitive values are fine to commit directly

Так фактические значения секретов остаются только в конфигурации окружения Docker (compose-файл, .env или флаги -e), а models.yml безопасно попадает в систему контроля версий.

Размещение в подпапке сайта (nginx)

Pastukhov Agent — веб-приложение, поэтому его можно разместить в подпапке уже существующего сайта — отдельный домен или поддомен не обязателен. С любого устройства приложение открывается как обычно, а на телефон или рабочий стол его можно установить как приложение. Размещение настраивается через nginx с реверс-проксированием в нужную подпапку:

location /agent/ {
    proxy_pass http://127.0.0.1:5001/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";   # SignalR WebSocket
}

location /api/ {
    proxy_pass http://127.0.0.1:5001;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Переменная окружения DEV_BASE_PATH задаёт префикс пути, если часть ресурсов приложения должна ссылаться на подпапку. Благодаря ей один и тот же экземпляр можно держать и на корневом домене, и внутри любого сайта.

SSL-сертификаты

Pastukhov Agent умеет выпускать бесплатные сертификаты Let’s Encrypt прямо из интерфейса — без certbot и ручных манипуляций. Откройте страницу /ssl в приложении, укажите домен и email, и сертификат будет получен автоматически. Подробнее — на странице SSL-сертификаты.