Skip to content

Native and Kubernetes Deployment RU

Svwergio_mel edited this page Nov 12, 2026 · 1 revision

Нативный деплой, Docker и Kubernetes

Пошаговое руководство по запуску chat-export-server как фонового сервиса на macOS, Linux, Windows, в Docker / Colima и Kubernetes (deploy/k8s) с сохранением локальной модели безопасности (127.0.0.1:8765).

Автоматизация браузера выполняется расширением Chat Export (WebSocket ceb_ в ваших залогиненных вкладках). Для обычной работы не нужны Chrome DevTools MCP, Playwright и отладчик IDE.


1. Нативный деплой на macOS (launchd)

Установка Node 22+ и сборка

Установите Node.js 22+ через Homebrew и соберите сервер:

brew install node@22
git clone https://github.com/svergio/chat-export-server.git
cd chat-export-server
npm install && npm run build

Конфигурация (~/.chat-export/.env)

Создайте каталог данных и файл .env:

mkdir -p ~/.chat-export
chmod 700 ~/.chat-export
cat > ~/.chat-export/.env <<'EOF'
CHAT_EXPORT_HOME=/Users/YOUR_USER/.chat-export
CHAT_EXPORT_HOST=127.0.0.1
CHAT_EXPORT_PORT=8765
CHAT_EXPORT_DASHBOARD_ENABLED=true
CHAT_EXPORT_ADMIN_USER=admin
CHAT_EXPORT_ADMIN_PASS=change_this_password
CHAT_EXPORT_MCP_TOKEN=cem_YOUR_GENERATED_TOKEN
CHAT_EXPORT_ALLOW_DESTRUCTIVE=false
EOF
chmod 600 ~/.chat-export/.env

Сгенерировать отдельный ключ cem_ (с сохранением только хеша в ~/.chat-export/keys.json) можно командой node dist/cli.js key new.

Фоновый сервис LaunchAgent (~/Library/LaunchAgents/io.github.svergio.chat-export-server.plist)

Создайте plist для автозапуска при входе в систему и автоматического перезапуска при сбоях:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>io.github.svergio.chat-export-server</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/bin/node</string>
    <string>/ABS/PATH/TO/chat-export-server/dist/cli.js</string>
    <string>start</string>
  </array>
  <key>WorkingDirectory</key>
  <string>/ABS/PATH/TO/chat-export-server</string>
  <key>EnvironmentVariables</key>
  <dict>
    <key>CHAT_EXPORT_HOME</key>
    <string>/Users/YOUR_USER/.chat-export</string>
    <key>CHAT_EXPORT_ENV_FILE</key>
    <string>/Users/YOUR_USER/.chat-export/.env</string>
    <key>PATH</key>
    <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
  </dict>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>StandardOutPath</key>
  <string>/Users/YOUR_USER/.chat-export/server.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/YOUR_USER/.chat-export/server.log</string>
</dict>
</plist>

Регистрация и перезапуск сервиса:

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/io.github.svergio.chat-export-server.plist
launchctl kickstart -k gui/$(id -u)/io.github.svergio.chat-export-server
tail -f ~/.chat-export/server.log
curl -sS http://127.0.0.1:8765/health

2. Нативный деплой на Linux (systemd --user)

Сборка сервера

Установите Node.js 22+ и соберите chat-export-server:

git clone https://github.com/svergio/chat-export-server.git ~/chat-export-server
cd ~/chat-export-server
npm install && npm run build
mkdir -p ~/.chat-export ~/.config/systemd/user
cp .env.example ~/.chat-export/.env
chmod 600 ~/.chat-export/.env

User-юнит systemd (~/.config/systemd/user/chat-export-server.service)

[Unit]
Description=Chat Export MCP and Browser Bridge Server
After=network.target

[Service]
Type=simple
WorkingDirectory=%h/chat-export-server
Environment=CHAT_EXPORT_HOME=%h/.chat-export
EnvironmentFile=%h/.chat-export/.env
ExecStart=/usr/bin/env node %h/chat-export-server/dist/cli.js start
Restart=on-failure
RestartSec=3

[Install]
WantedBy=default.target

Включите автозапуск и lingering (чтобы юнит работал без активной GUI-сессии):

systemctl --user daemon-reload
systemctl --user enable --now chat-export-server
loginctl enable-linger "$USER"
journalctl --user -u chat-export-server -f

3. Нативный деплой на Windows

Установка Node 22+ и настройка в PowerShell

Установите Node.js 22+ через winget или nvm-windows:

winget install OpenJS.NodeJS.LTS
git clone https://github.com/svergio/chat-export-server.git "$env:USERPROFILE\chat-export-server"
Set-Location "$env:USERPROFILE\chat-export-server"
npm install
npm run build

New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.chat-export" | Out-Null
Copy-Item .env.example "$env:USERPROFILE\.chat-export\.env"

Задайте в $env:USERPROFILE\.chat-export\.env адрес CHAT_EXPORT_HOST=127.0.0.1, порт CHAT_EXPORT_PORT=8765 и CHAT_EXPORT_ADMIN_PASS.

Вариант A: Планировщик заданий Windows (Register-ScheduledTask / schtasks)

Создание фоновой задачи при входе пользователя на 127.0.0.1:8765:

$NodePath = (Get-Command node).Source
$ServerDir = "$env:USERPROFILE\chat-export-server"
$EnvFile = "$env:USERPROFILE\.chat-export\.env"

$Action = New-ScheduledTaskAction `
  -Execute $NodePath `
  -Argument "`"$ServerDir\dist\cli.js`" start" `
  -WorkingDirectory $ServerDir

$Trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1)

[System.Environment]::SetEnvironmentVariable("CHAT_EXPORT_HOME", "$env:USERPROFILE\.chat-export", "User")
[System.Environment]::SetEnvironmentVariable("CHAT_EXPORT_ENV_FILE", $EnvFile, "User")

Register-ScheduledTask -TaskName "ChatExportServer" -Action $Action -Trigger $Trigger -Settings $Settings -Force
Start-ScheduledTask -TaskName "ChatExportServer"

Альтернатива через schtasks:

schtasks /Create /TN "ChatExportServer" /TR "`"C:\Program Files\nodejs\node.exe`" `"$env:USERPROFILE\chat-export-server\dist\cli.js`" start" /SC ONLOGON /RL LIMITED /F
schtasks /Run /TN "ChatExportServer"

Вариант B: NSSM или PM2

Через NSSM:

nssm install ChatExportServer "C:\Program Files\nodejs\node.exe" "`"$env:USERPROFILE\chat-export-server\dist\cli.js`" start"
nssm set ChatExportServer AppDirectory "$env:USERPROFILE\chat-export-server"
nssm set ChatExportServer AppEnvironmentExtra "CHAT_EXPORT_HOME=$env:USERPROFILE\.chat-export" "CHAT_EXPORT_ENV_FILE=$env:USERPROFILE\.chat-export\.env"
nssm start ChatExportServer

Через PM2:

npm install -g pm2
$env:CHAT_EXPORT_HOME="$env:USERPROFILE\.chat-export"
$env:CHAT_EXPORT_ENV_FILE="$env:USERPROFILE\.chat-export\.env"
pm2 start "$env:USERPROFILE\chat-export-server\dist\cli.js" --name chat-export-server -- start
pm2 save

4. Деплой в Docker и Colima

Одиночный контейнер (chat-export-server/docker-compose.yml)

На macOS вместо Docker Desktop рекомендуется Colima:

colima start
docker context use colima
cd chat-export-server
cp .env.example .env    # укажите CHAT_EXPORT_ADMIN_PASS и токены
docker compose build
docker compose up -d
curl -sS http://127.0.0.1:8765/health

Контейнер публикует 127.0.0.1:8765:8765 и хранит данные в томе chat-export-data (/data).

Двухконтейнерный стек Nginx + Server

Корневой docker-compose.yml запускает связку с chat-export-dashboard:

  • server (chat-export-server:local) работает внутри Docker-сети на порту 8765 с томом chat-export-data:/data.
  • web (chat-export-dashboard:local, nginx) слушает 127.0.0.1:8765:80, отдаёт статику дашборда и проксирует /mcp, /ws, /api, /health на SERVER_UPSTREAM=server:8765.
docker compose build
docker compose up -d
curl -sS http://127.0.0.1:8765/health

5. Деплой в Kubernetes (deploy/k8s)

Каталог deploy/k8s содержит манифесты Kustomize (Deployment/StatefulSet, PVC, Secret и Service) для локальных и self-hosted кластеров (Colima K8s, k3s, kind, MicroK8s).

1. Создание секрета chat-export-secrets

Создайте секрет с паролем админки и токенами (не храните реальные ключи в git):

kubectl create namespace chat-export --dry-run=client -o yaml | kubectl apply -f -

kubectl -n chat-export create secret generic chat-export-secrets \
  --from-literal=CHAT_EXPORT_ADMIN_USER=admin \
  --from-literal=CHAT_EXPORT_ADMIN_PASS='YOUR_STRONG_ADMIN_PASSWORD' \
  --from-literal=CHAT_EXPORT_MCP_TOKEN='cem_YOUR_MCP_TOKEN' \
  --from-literal=CHAT_EXPORT_BROWSER_TOKENS='b-main:ceb_YOUR_BROWSER_TOKEN:Chrome Main' \
  --dry-run=client -o yaml | kubectl apply -f -

2. Применение манифестов и PVC

kubectl apply -k deploy/k8s
kubectl -n chat-export rollout status deploy/chat-export-server
kubectl -n chat-export get pvc,pods,svc

Том PVC монтируется в /data (CHAT_EXPORT_HOME=/data), сохраняя config.json, keys.json, SQLite-кеш, exports/ и audit.log между перезапусками пода.

3. Проброс порта на loopback (kubectl port-forward)

Не публикуйте chat-export-server наружу через открытый Ingress. Пробросьте сервис на 127.0.0.1:8765 на рабочей машине с Chrome:

kubectl -n chat-export port-forward --address 127.0.0.1 svc/chat-export-server 8765:8765

4. Подключение локального расширения Chrome к поду K8s

При активном kubectl port-forward на 127.0.0.1:8765:

  1. В попапе расширения Chrome откройте Дополнительно → укажите хост 127.0.0.1, порт 8765 и вставьте токен ceb_… из chat-export-secrets (либо выпустите его через http://127.0.0.1:8765/dashboard/).
  2. Включите Server bridge — WebSocket ws://127.0.0.1:8765/ws прозрачно туннелируется в под Kubernetes.
  3. Подключите любой MCP-клиент (Cursor, Claude Desktop, локальный LLM-агент и т.д.) к http://127.0.0.1:8765/mcp с заголовком Authorization: Bearer cem_….

См. также

Clone this wiki locally