GhostDesk

by YV17labs (community) · Docker, Linux, Claude Desktop, Claude Code, OpenCode

MCP MCP Servers Open Source

MCP-сервер, дающий AI-агенту полноценный виртуальный Linux-рабочий стол в Docker-контейнере: видит экран, двигает мышь, печатает, запускает любые приложения — браузеры, легаси-софт, внутренние инструменты — без единой строчки интеграционного кода.


Установка
# Claude Desktop — claude_desktop_config.json (после запуска контейнера GhostDesk, transport http):
{ "mcpServers": { "ghostdesk": { "url": "http://localhost:3000/mcp" } } }

# Claude Code (CLI):
claude mcp add --transport http ghostdesk http://localhost:3000/mcp

# OpenCode — ~/.config/opencode/opencode.json:
{ "mcp": { "ghostdesk": { "type": "remote", "url": "http://localhost:3000/mcp" } } }
показать оригинал переведено ИИ

GhostDesk — Virtual Desktop Control

MCP Compatible Python 3.12+ FSL-1.1-ALv2 License Platform

Дайте вашему ИИ-агенту глаза, руки и полноценный Linux-десктоп.
MCP-сервер, который позволяет LLM-агентам видеть экран, двигать мышь, печатать на клавиатуре, запускать приложения и выполнять shell-команды — всё внутри изолированного виртуального рабочего стола.

Если человек может сделать это на рабочем столе, ваш агент тоже сможет.

Ваш браузер не поддерживает тег video.

Демонстрация GhostDesk — из одного запроса ("открой браузер, зайди на Google News и расскажи мне последние заголовки в разделе Technology") агент запускает Firefox, переходит на Google News, переключается на раздел Technology и сообщает последние новости.


Содержание


Зачем нужен GhostDesk?

Инструменты автоматизации браузера (Playwright, Puppeteer, Selenium…) создавались для инженеров по тестированию, которые управляют браузером с помощью селекторов. Они делают одну вещь, и делают её хорошо — внутри браузера.

GhostDesk построен с другой стороны: для ИИ-агентов, управляющих всем, что работает на рабочем столе. Браузеры, нативные приложения, IDE, терминалы, офисные пакеты, устаревшее ПО, внутренние инструменты. Если что-то отображает пиксели на экране, ваш агент может это видеть и использовать — в одном диалоге, в разных приложениях, без единой строки клеящего кода.

Вам не нужно писать селекторы. Вы пишете запрос:

"Открой CRM, экспортируй лиды за прошлый месяц в CSV, открой LibreOffice Calc, построй сводную таблицу, сделай скриншот диаграммы и отправь её команде по электронной почте."

Агент открывает браузер, входит в систему, скачивает файл, переключается на LibreOffice, обрабатывает данные, сохраняет результат, составляет письмо, отправляет его. Один запрос, несколько приложений, полная автономность — без клеящего кода, без скрейпера для каждого сайта, без хрупких цепочек селекторов.

Вот так выглядит использование рабочего стола агентами.

Работает на моделях, которые вы реально можете разместить

Управление рабочим столом должно быть быстрым — агент, которому нужно двенадцать секунд, чтобы решить, куда кликнуть, бесполезен. GhostDesk настроен так, чтобы vision-language модели семейства Qwen, работающие на одной GPU рабочей станции, были полноценной целью, а не второстепенным дополнением. Никаких счетов за API, никаких скриншотов вашего рабочего стола, покидающих вашу сеть.

Пограничные модели (Claude, GPT-4o, Gemini) тоже работают и остаются самым гладким путём — но они не являются планкой. См. Требования к моделям для поддерживаемых стеков и единственной настройки координатного пространства, которая имеет значение.


Как это работает

GhostDesk запускает виртуальный Linux-десктоп внутри Docker и предоставляет его как MCP-сервер. Ваш агент получает изолированный рабочий стол с панелью задач, часами и предустановленными приложениями — эквивалент того, что человек видит на своём экране.

Агент воспринимает экран, вызывая screen_shot(), который захватывает весь рабочий стол в нативном разрешении и возвращает его в формате WebP (или PNG). Необязательный аргумент region= позволяет обрезать до подпрямоугольника, когда агент явно хочет сузить фокус.

Это работает с любым приложением — веб-приложениями, нативными приложениями, устаревшим ПО, Canvas, WebGL.


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

1. Запустите контейнер

Одна команда, обычный HTTP, без пароля. Подходит для быстрого тестирования на доверенном ноутбуке — не подходит ни для чего больше. Готовы усилить защиту? Перейдите к Безопасный локальный запуск.

docker run -d --name ghostdesk-demo \
  --shm-size 2g \
  -p 3000:3000 \
  -p 6080:6080 \
  ghcr.io/yv17labs/ghostdesk:latest

Образ latest поставляется с Firefox, терминалом foot, mousepad (текстовый редактор), galculator и sudo без пароля для пользователя agent — достаточно для демонстрации рабочего процесса просмотра и заметок из коробки. Нужен другой набор приложений? Создайте свой поверх base — см. Пользовательский образ. Контейнер запускается в dev-режиме: обычный HTTP на обоих портах, все проверки аутентификации намеренно отключены. В логах вы увидите предупреждения об этом — они исчезнут, как только вы перейдёте на защищённый путь ниже.

2. Подключите свой ИИ

GhostDesk говорит на MCP через транспорт Streamable HTTP — любой MCP-совместимый клиент может им управлять. Укажите вашему клиенту адрес http://localhost:3000/mcp:

Claude Desktop / Claude Code

{
  "mcpServers": {
    "ghostdesk": {
      "type": "http",
      "url": "http://localhost:3000/mcp"
    }
  }
}

Любой другой MCP-совместимый клиент — тот же URL, без заголовков и без аутентификации. Это и есть вся демонстрационная конфигурация.

3. Наблюдайте за работой агента

Откройте http://localhost:6080/ в браузере, чтобы видеть виртуальный рабочий стол в реальном времени. Запрос пароля не появится — dev-режим пропускает его.

Сервис URL
MCP-сервер http://localhost:3000/mcp
noVNC (браузер) http://localhost:6080/

Дайте агенту первую команду, чтобы убедиться, что всё работает:

«Сделай скриншот рабочего стола, перечисли установленные приложения, затем открой Firefox и перейди на wikipedia.org».

Вы должны увидеть, как Firefox запускается во вкладке noVNC, заполняется адресная строка и загружается страница — всё под управлением вашего агента.

4. Когда закончите

docker stop ghostdesk-demo && docker rm ghostdesk-demo

Демонстрационный запуск не создаёт именованный том, так что после него ничего не остаётся.


Безопасный локальный запуск (TLS + аутентификация)

В кратком руководстве выше опущены все проверки, чтобы вы могли быстро опробовать инструмент за тридцать секунд. Как только вы захотите открыть доступ к чему-то большему, чем ваш собственный ноутбук — другой машине в локальной сети, пробросу портов devcontainer в недоверенной сети, браузеру коллеги — переключайтесь на защищённый режим: настоящий TLS + аутентификация по bearer-токену на MCP + запрос пароля на noVNC.

GhostDesk связывает TLS и аутентификацию: подключите сертификат — и получите wss:// + bearer-токен на MCP + запрос одного пароля на noVNC (см. Безопасность → Auth ≡ TLS). mkcert выпускает доверенный браузером сертификат для localhost двумя командами:

# Issue a locally-trusted cert (first time only — installs a local CA in your trust store)
mkcert -install
mkdir -p tls
mkcert -cert-file tls/server.crt -key-file tls/server.key localhost 127.0.0.1 ::1

# Generate the MCP and VNC secrets
export GHOSTDESK_AUTH_TOKEN=$(openssl rand -hex 32)
export GHOSTDESK_VNC_PASSWORD=$(openssl rand -hex 16)

Выберите имя контейнера, соответствующее роли агента — sales-agent, research-agent, accounting-agent… Ниже мы используем my-agent как заполнитель; замените его везде в команде.

# Run the container — cert mounted, TLS + auth enabled everywhere
docker run -d --name ghostdesk-my-agent \
  --restart unless-stopped \
  --cap-add SYS_ADMIN \
  --shm-size 2g \
  -p 3000:3000 \
  -p 6080:6080 \
  -v ghostdesk-my-agent-home:/home/agent \
  -v "$PWD/tls/server.crt:/etc/ghostdesk/tls/server.crt:ro" \
  -v "$PWD/tls/server.key:/etc/ghostdesk/tls/server.key:ro" \
  -e GHOSTDESK_AUTH_TOKEN \
  -e GHOSTDESK_VNC_PASSWORD \
  -e TZ=America/New_York \
  -e LANG=en_US.UTF-8 \
  ghcr.io/yv17labs/ghostdesk:latest

echo "MCP token:    $GHOSTDESK_AUTH_TOKEN"
echo "VNC password: $GHOSTDESK_VNC_PASSWORD"

Когда контейнер запущен, обновите конфигурацию вашего MCP-клиента — та же форма, что и в демо, но теперь через https:// с bearer-токеном:

Claude Desktop / Claude Code

{
  "mcpServers": {
    "ghostdesk": {
      "type": "http",
      "url": "https://localhost:3000/mcp",
      "headers": {
        "Authorization": "Bearer <paste $GHOSTDESK_AUTH_TOKEN here>"
      }
    }
  }
}

Любой другой MCP-совместимый клиент — тот же URL, плюс заголовок Authorization: Bearer <token> в том виде, который принимает ваш клиент.

Затем откройте https://localhost:6080/ в браузере — центр сертификации mkcert, установленный командой mkcert -install, уже находится в вашем хранилище доверия, поэтому браузер принимает сертификат без предупреждения. noVNC запросит $GHOSTDESK_VNC_PASSWORD.

Готовитесь к продакшену? Замените самоподписанный сертификат mkcert на настоящий, получайте оба секрета из менеджера секретов и поставьте перед портом 6080 прокси с учётом идентификации — полный контракт описан в SECURITY.md.

--cap-add SYS_ADMIN — требуется для приложений на Electron (VS Code, Slack и др.) и других программ, которым нужны пользовательские пространства имён Linux для работы песочницы. Можно безопасно удалить, если они не нужны.

Именованный том сохраняет домашний каталог агента между перезапусками — пароли браузера, закладки, cookie, загрузки и настройки рабочего стола сохраняются. При первом запуске Docker автоматически заполняет том конфигурацией по умолчанию из образа.


Инструменты

13 инструментов под рукой у вашего агента, сгруппированных по назначению (именование verb_noun):

Экран

Инструмент Описание
screen_shot Сделать снимок экрана в формате WebP (передайте format="png" для без потерь). Передайте region=, чтобы обрезать до подпрямоугольника в исходном разрешении. Настройте quality= (1-100, по умолчанию 50 — незаметно для UI-контента, примерно на 50% меньше, чем 80; повышайте для мелких шрифтов или дизайнерских поверхностей). Установите stabilize=False, чтобы пропустить проверки стабилизации страницы (по умолчанию: True, ждёт до 5 секунд, пока страница стабилизируется)

Мышь

Инструмент Описание
mouse_move Переместить курсор в координаты без клика — открывает меню, появляющиеся при наведении, всплывающие подсказки и состояния CSS :hover (например, панель действий Gmail)
mouse_click Клик по координатам
mouse_double_click Двойной клик по координатам
mouse_drag Перетаскивание из одной позиции в другую
mouse_scroll Прокрутка в любом направлении (вверх/вниз/влево/вправо)

Клавиатура

Инструмент Описание
key_type Ввод текста с реалистичными задержками между символами
key_press Нажатие клавиш или комбинаций (ctrl+c, alt+F4, Return...)
### Буфер обмена
Инструмент Описание
clipboard_get Чтение содержимого буфера обмена
clipboard_set Запись в буфер обмена

Приложения

Инструмент Описание
app_list Список GUI-приложений, установленных на рабочем столе
app_running Список окон приложений, открытых в данный момент — вызывайте перед app_launch, чтобы не запускать повторно уже работающее приложение
app_launch Запуск GUI-приложения по имени
app_status Проверка, запущено ли приложение, и чтение его журналов

Требования к модели

Ваш стек вывода должен покрывать четыре возможности — все четыре обязательны:

  1. Текст + зрение — агент воспринимает рабочий стол через скриншоты, и ему нужна модель, способная их интерпретировать.
  2. Использование инструментов — GhostDesk предоставляет 14 инструментов в виде вызовов функций; модель должна уметь их вызывать.
  3. MCP-клиент — хосту необходимо говорить на Streamable HTTP MCP для доступа к серверу GhostDesk.
  4. Поддержка изображений WebP — GhostDesk по умолчанию возвращает скриншоты в формате WebP, чтобы уменьшить размер полезной нагрузки и ускорить вывод. Стек, который может декодировать только PNG или JPEG, не будет работать из коробки.

Пространство координат — заголовок GhostDesk-Model-Space

По умолчанию заголовок не нужен: Claude и другие ведущие frontier LLM работают из коробки. Qwen3.x требуют, чтобы клиент отправлял GhostDesk-Model-Space: 1000 в каждом запросе MCP.

Пример конфигурации MCP-клиента:

{
  "mcpServers": {
    "ghostdesk": {
      "url": "https://localhost:3000/mcp",
      "headers": {
        "GhostDesk-Model-Space": "1000"
      }
    }
  }
}

Локальный запуск

Для самостоятельного хостинга вывода мы используем и рекомендуем наш форк llama.cpp, который добавляет декодирование WebP и турбо-квантизацию поверх апстрима: YV17labs/llama-cpp-turboquant-webp, ветка feature/turboquant-webp. Когда WebP появится в апстриме, мы заархивируем форк и перейдём на него напрямую.

Пользователям macOS: используйте llama.cpp, а не mlx-vlm (по состоянию на 01.04.2026). Стек mlx-vlm в настоящее время даёт неточные координаты для тех же моделей, которые корректно работают под llama.cpp. Это вызвано ошибкой в апстриме зависимости Apple, а не самой модели. Пока исправление не выйдет, llama.cpp — рекомендуемый бэкенд на всех платформах, включая Mac на Apple Silicon.

Запускайте любую локальную модель, какую хотите. Четыре из семейства Qwen vision, которые я использовал и которые хорошо работают для управления рабочим столом:

  • Qwen3.6-27B — плотная 27B; на сегодняшний день самая сильная из четырёх в сложных многошаговых задачах, но с более медленным выводом.
  • Qwen3.6-35B-A3B — 35B параметров, только 3B активны на токен.

Точная команда, которую я запускаю для тестов Qwen3.6-35B-A3B, используя указанный выше форк (--cache-type-v turbo3 — это его турбо-квантованный KV-кэш):

build/bin/llama-server \
  --model models/Qwen3.6-35B-A3B-Q5_K_M.gguf \
  --mmproj models/Qwen3.6-35B-A3B-mmproj-F16.gguf \
  --alias 'Qwen3-6-35B-A3B' \
  --ctx-size 32768 \
  --host 127.0.0.1 \
  --port 8080 \
  --cache-type-k q8_0 \
  --cache-type-v turbo3 \
  --reasoning on \
  --reasoning-format deepseek

llama-server предоставляет OpenAI-совместимый эндпоинт на http://127.0.0.1:8080; укажите его как бэкенд вывода вашего MCP-хоста и не забудьте заголовок GhostDesk-Model-Space: 1000 для семейства Qwen.


От одного агента к команде

Каждый экземпляр GhostDesk — это контейнер. Запустите один, десять или сто — каждый агент получает свой изолированный рабочий стол, свои приложения, свою роль. Думайте об этом как о найме команды цифровых сотрудников, у каждого из которых своё рабочее место.

Горизонтальное масштабирование

# docker-compose.yml — 3 specialized agents, one command
#
# Prerequisites: the TLS cert + key at ./tls and the two secrets
# (GHOSTDESK_AUTH_TOKEN, GHOSTDESK_VNC_PASSWORD) in your environment or a
# .env file. Generate both exactly as shown in the Secure local run
# section above. See SECURITY.md for the production secret-handling
# contract.

x-ghostdesk-defaults: &ghostdesk-defaults
  image: ghcr.io/yv17labs/ghostdesk:latest
  restart: unless-stopped
  cap_add: [SYS_ADMIN]
  shm_size: 2g
  environment:
    - GHOSTDESK_AUTH_TOKEN
    - GHOSTDESK_VNC_PASSWORD
    - TZ=America/New_York
    - LANG=en_US.UTF-8

services:
  sales-agent:
    <<: *ghostdesk-defaults
    container_name: ghostdesk-sales-agent
    ports: ["3001:3000", "6081:6080"]
    volumes:
      - ghostdesk-sales-agent-home:/home/agent
      - ./tls/server.crt:/etc/ghostdesk/tls/server.crt:ro
      - ./tls/server.key:/etc/ghostdesk/tls/server.key:ro

  research-agent:
    <<: *ghostdesk-defaults
    container_name: ghostdesk-research-agent
    ports: ["3002:3000", "6082:6080"]
    volumes:
      - ghostdesk-research-agent-home:/home/agent
      - ./tls/server.crt:/etc/ghostdesk/tls/server.crt:ro
      - ./tls/server.key:/etc/ghostdesk/tls/server.key:ro

  accounting-agent:
    <<: *ghostdesk-defaults
    container_name: ghostdesk-accounting-agent
    ports: ["3003:3000", "6083:6080"]
    volumes:
      - ghostdesk-accounting-agent-home:/home/agent
      - ./tls/server.crt:/etc/ghostdesk/tls/server.crt:ro
      - ./tls/server.key:/etc/ghostdesk/tls/server.key:ro

volumes:
  ghostdesk-sales-agent-home:
  ghostdesk-research-agent-home:
  ghostdesk-accounting-agent-home:
docker compose up -d   # Your workforce is ready

Каждый агент работает параллельно, независимо, на своём рабочем столе. Подключите каждого к разным LLM, дайте каждому свой системный промпт, установите разные приложения — полная специализация.

Безопасность по дизайну

Каждый агент изолирован в своём контейнере. Нет доступа к хост-машине. Нет доступа к другим агентам. Сетевая, файловая и процессная изоляция предоставляются бесплатно благодаря Docker.

Это делает GhostDesk естественным выбором для предприятий:

Проблема Как GhostDesk её решает
Изоляция данных Каждый агент живёт в своём контейнере — нет общей файловой системы, нет общей памяти
Контроль доступа Ограничьте сетевой доступ для каждого агента с помощью Docker-сетей. Агент с доступом к CRM не видит финансовые инструменты
Аудируемость Наблюдайте за любым агентом в реальном времени через VNC, записывайте сессии, просматривайте скриншоты
Радиус поражения Если агент работает неправильно, убейте контейнер. Ничто другое не затрагивается
Соответствие требованиям Никакие данные не касаются вашего хоста. Контейнеры могут работать в изолированных средах (air-gapped)

Специализация каждого агента

Дайте каждому агенту роль, как новому сотруднику:

  • Торговый агент — отслеживает CRM, обогащает лиды, обновляет воронку продаж
  • Исследовательский агент — просматривает веб, собирает конкурентную разведку, пишет отчёты
  • Бухгалтерский агент — обрабатывает счета в легаси-ERP, сверяет электронные таблицы
  • QA-агент — кликает по вашему приложению, отправляет баг-репорты со скриншотами
  • Агент поддержки — обрабатывает тикеты, ищет информацию о клиентах в нескольких внутренних инструментах

Каждый агент получает собственный системный промпт, определяющий его миссию, собственные установленные приложения и собственные сетевые разрешения. Управляйте AI-агентами как сотрудниками — у каждого свой рабочий стол, свои инструменты и свой уровень допуска.

Наблюдение в реальном времени

Каждый агент предоставляет конечную точку VNC/noVNC. Откройте вкладку браузера и наблюдайте за работой агента — или откройте десять вкладок и мониторьте весь свой персонал. Вмешивайтесь в любой момент: перехватывайте мышь, корректируйте курс или общайтесь с оркестрирующей LLM.


Конфигурация

Каждая переменная, которую читает GhostDesk, имеет пространство имён GHOSTDESK_*. Стандартные POSIX-переменные (TZ, LANG) остаются как есть, чтобы существующая Unix-экосистема продолжала работать.

Секреты (обязательны — контейнер отказывается запускаться без них)

Переменная Описание
GHOSTDESK_AUTH_TOKEN Bearer-токен, обязательный для каждого MCP-запроса. Сгенерируйте с помощью openssl rand -hex 32.
GHOSTDESK_VNC_PASSWORD Пароль для wayvnc (имя пользователя — agent в продакшн-образе). Сгенерируйте с помощью openssl rand -hex 16.

Обе — обычные переменные окружения. Подключайте их из вашего хранилища секретов (secretKeyRef в Kubernetes, Docker secrets / Vault / AWS SM в compose) — полный контракт см. в SECURITY.md.

Параметры выполнения

Переменная По умолчанию Описание
GHOSTDESK_PORT 3000 Порт прослушивания MCP-сервера
GHOSTDESK_HOST 127.0.0.1 (standalone) / 0.0.0.0 (контейнер) Адрес привязки для MCP-эндпоинта. По умолчанию loopback согласно спецификации MCP transports; entrypoint контейнера экспортирует 0.0.0.0, чтобы слой публикации портов Docker мог до него добраться.
GHOSTDESK_ALLOWED_ORIGINS (пусто) Список через запятую заголовков Origin, принимаемых от браузерных клиентов (например, https://app.example.com,https://localhost:8080). Не-браузерные клиенты (Claude Desktop, SDK, curl) не отправляют Origin и всегда разрешены. Требуется для любого браузерного MCP-интерфейса; без него браузерные запросы отклоняются с HTTP 403 для смягчения DNS-ребдинга (согласно спецификации MCP transports).
GHOSTDESK_TLS_CERT /etc/ghostdesk/tls/server.crt Путь к TLS-сертификату. Когда файл существует, websockify и MCP-сервер автоматически переключаются на wss:// / https://. См. Безопасность.
GHOSTDESK_TLS_KEY /etc/ghostdesk/tls/server.key Путь к приватному ключу TLS (соответствует GHOSTDESK_TLS_CERT).
GHOSTDESK_SCREEN_WIDTH 1280 Ширина виртуального экрана в пикселях
GHOSTDESK_SCREEN_HEIGHT 1024 Высота виртуального экрана в пикселях
GHOSTDESK_IDLE_TIMEOUT 1800 Секунды тишины MCP до закрытия всех открытых окон клиента (Firefox, foot, mousepad…) через Sway IPC для освобождения памяти. Sway, mako, wayvnc и сам MCP-сервер не затрагиваются. Установите 0 для отключения.
TZ America/New_York Часовой пояс IANA (POSIX-стандарт, например, Europe/Paris)
LANG en_US.UTF-8 Локаль POSIX (например, fr_FR.UTF-8)

Фиксированные значения (не настраиваются)

Переменная Значение Обоснование
GHOSTDESK_VNC_ADDRESS 127.0.0.1 wayvnc заблокирован на loopback внутри netns контейнера; порт VNC доступен только через noVNC-мост на 6080. Попытки переопределения логируются и игнорируются — см. SECURITY.md.

Безопасность

GhostDesk отвечает за две вещи: шифрование транспорта и аутентификацию. Всё остальное (rate limiting, SSO, WAF, запись сессий, защита от брутфорса, идентификация пользователей на noVNC) — забота обратного прокси. Контейнер спроектирован для работы за прокси, а не напрямую в интернете. Полная модель угроз, переключатель режима Auth ≡ TLS, обоснование использования wayvnc RFB-типа-2 внутри wss://, контракт на обработку секретов и исчерпывающая таблица «в области / вне области» находятся в SECURITY.md — единственный источник истины. Начните с этого документа перед развертыванием на любом окружении, которому вы не полностью доверяете.

Хотите сообщить об уязвимости? Используйте приватное консультативное заключение по безопасности GitHub — см. SECURITY.md § Сообщение об уязвимостях.


Устранение неполадок

Действия моего агента попадают мимо цели с большим отклонением

Почти всегда это несоответствие координатного пространства. Передовые модели (Claude, GPT-4o, Gemini) не требуют заголовка (по умолчанию сквозная передача); семейство Qwen vision требует, чтобы клиент отправлял GhostDesk-Model-Space: 1000 в каждом MCP-запросе. Полное обоснование в разделе Требования к моделям → Координатное пространство.

Контейнер отказывается запускаться с ошибкой, связанной с секретами

Продакшн-режим (с смонтированным сертификатом) требует установки и GHOSTDESK_AUTH_TOKEN, и GHOSTDESK_VNC_PASSWORD — GhostDesk намеренно отказывается запускаться без них, чтобы предотвратить запуск непроверенного продакшн-контейнера. Сгенерируйте их, как показано в разделе Безопасный локальный запуск, и передайте с помощью -e. Демо-режим (без сертификата) не имеет такого требования.

noVNC показывает черный экран или рабочий стол отображается с графическими артефактами

Вероятно, у вас недостаточно разделяемой памяти. Браузерам и другим GPU-ускоряемым приложениям внутри контейнера нужен разумный размер /dev/shm — --shm-size 2g является базовым во всех примерах, и его не следует уменьшать. Если у вас уже есть --shm-size 2g, проверьте журналы контейнера на наличие ошибок wayvnc или композитора.

Firefox / приложения на Electron не запускаются или сразу падают

Приложения на базе Electron (VS Code, Slack, Discord…) требуют пользовательских пространств имен Linux для своей песочницы. Добавьте --cap-add SYS_ADMIN в вашу команду docker run (уже присутствует в примере безопасного локального запуска). Firefox сам работает без этого.


Пользовательский образ

Тег base предоставляет GhostDesk без каких-либо предустановленных GUI-приложений — только виртуальный рабочий стол, VNC и MCP-сервер. Используйте его для создания собственного образа только с нужными вам инструментами:

FROM ghcr.io/yv17labs/ghostdesk:base

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        chromium-browser \
        libreoffice-calc \
    && rm -rf /var/lib/apt/lists/*
docker build -t my-agent .

Полный пример см. в Dockerfile проекта.

Тег Описание
latest, X.Y.Z, X.Y Полный образ — Firefox, терминал foot, mousepad, galculator, sudo без пароля
base, base-X.Y.Z, base-X.Y Минимальный образ — без GUI-приложений, предназначен для расширения

Лицензия

Функциональная лицензия на исходный код, версия 1.1, будущая лицензия ALv2 (FSL-1.1-ALv2) — см. LICENSE для получения официальных условий.

Что это означает на практике (неофициальное резюме — действует файл LICENSE; это не юридическая консультация):

  • Разрешенные цели охватывают варианты использования, важные для подавляющего большинства пользователей: внутреннее использование и доступ внутри вашей компании, некоммерческое образование и исследования, а также профессиональные услуги, которые вы предоставляете лицензиату, использующему GhostDesk в соответствии с лицензией. Самостоятельное размещение GhostDesk для запуска собственных агентов — даже коммерческие, приносящие доход рабочие процессы, обеспечивающие работу вашего продукта — является разрешенным внутренним использованием.
  • Конкурирующее использование запрещено. Вы не можете предоставлять GhostDesk другим в коммерческом продукте или услуге, которая заменяет GhostDesk, заменяет любой продукт или услугу, предлагаемые проектом с использованием GhostDesk, или предоставляет те же или существенно схожие функции. Короче говоря: вы не можете взять GhostDesk и переименовать его, разместить его как платную услугу или создать на его основе конкурирующий продукт для автоматизации рабочих столов для агентов.
  • Apache 2.0 через два года. Каждая выпущенная версия GhostDesk становится доступной под лицензией Apache License 2.0 во вторую годовщину ее выпуска, автоматически и безотзывно. Ограничение на конкурирующее использование действует только в течение первых двух лет.

Коммерческое лицензирование. Если ваше предполагаемое использование подпадает под конкурирующее использование — вы хотите перепродавать GhostDesk, предлагать его как управляемую услугу или создавать конкурирующий продукт — свяжитесь с сопровождающими, чтобы обсудить коммерческую лицензию перед развертыванием. Откройте вопрос на GitHub или свяжитесь напрямую; мы будем рады поговорить.

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