379 lines
11 KiB
Markdown
379 lines
11 KiB
Markdown
|
|
# ✅ SKYVERN УСТАНОВЛЕН И РАБОТАЕТ!
|
|||
|
|
|
|||
|
|
**Дата установки:** 20 февраля 2026 г.
|
|||
|
|
**Система:** Ubuntu, Python 3.12.3, Node.js v20.19.5
|
|||
|
|
**Режим:** Source (не Docker) для полной кастомизации
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 Что установлено и работает
|
|||
|
|
|
|||
|
|
### Backend (FastAPI + Uvicorn) - ✅ РАБОТАЕТ
|
|||
|
|
- **Адрес:** http://localhost:8000
|
|||
|
|
- **Процесс:** background (PID в `ps aux | grep uvicorn`)
|
|||
|
|
- **Логи:** `backend.log` в корне проекта
|
|||
|
|
- **Swagger API:** http://localhost:8000/docs
|
|||
|
|
- **OpenAPI schema:** http://localhost:8000/openapi.json
|
|||
|
|
|
|||
|
|
### Frontend (React + Vite) - ⏹️ ГОТОВ К ЗАПУСКУ
|
|||
|
|
- **Команда:** `cd skyvern-frontend && npm run dev`
|
|||
|
|
- **Адрес:** http://localhost:5173 (после запуска)
|
|||
|
|
- **Зависимости:** 672 пакета установлено
|
|||
|
|
|
|||
|
|
### Database (PostgreSQL 16) - ✅ РАБОТАЕТ
|
|||
|
|
- **Адрес:** localhost:5433
|
|||
|
|
- **Credentials:** skyvern / skyvern
|
|||
|
|
- **Контейнер:** `skyvern-postgres`
|
|||
|
|
- **Таблиц:** 42 (созданы через Alembic migrations)
|
|||
|
|
|
|||
|
|
### Cache (Redis 7) - ✅ РАБОТАЕТ
|
|||
|
|
- **Адрес:** localhost:6380
|
|||
|
|
- **Контейнер:** `skyvern-redis`
|
|||
|
|
- **Статус:** healthy
|
|||
|
|
|
|||
|
|
### Browser Automation - ✅ ГОТОВ
|
|||
|
|
- **Playwright:** установлен (Chromium 145.0.7632.6)
|
|||
|
|
- **Режим:** headless (настраивается в .env)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔑 API Аутентификация
|
|||
|
|
|
|||
|
|
### JWT Token (валиден до 2027 года)
|
|||
|
|
```bash
|
|||
|
|
x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJvcmdfZGV2ZWxvcG1lbnQiLCJleHAiOjE4MDMxNDc3MDMsImlhdCI6MTc3MTYxMTcwM30.HcAprOMAuMpB-_QSZWiRG642FNezc9fepIQn0OFKH-E
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Organization
|
|||
|
|
- **ID:** `org_development`
|
|||
|
|
- **Name:** Development Organization
|
|||
|
|
|
|||
|
|
### Сохранен в .env
|
|||
|
|
```bash
|
|||
|
|
SKYVERN_API_KEY=eyJhbGc...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📡 API Endpoints (проверены и работают)
|
|||
|
|
|
|||
|
|
### Создание задачи
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8000/v1/run/tasks \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-H "x-api-key: YOUR_JWT_TOKEN" \
|
|||
|
|
-d '{
|
|||
|
|
"prompt": "Extract the main heading text",
|
|||
|
|
"url": "https://example.com",
|
|||
|
|
"max_steps": 3,
|
|||
|
|
"proxy_location": "NONE"
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Ответ:** JSON с `run_id`, `status`, `app_url`
|
|||
|
|
|
|||
|
|
### Проверка статуса
|
|||
|
|
```bash
|
|||
|
|
curl "http://localhost:8000/v1/runs/{run_id}" \
|
|||
|
|
-H "x-api-key: YOUR_JWT_TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Полный список endpoints
|
|||
|
|
- `POST /v1/run/tasks` - создать задачу
|
|||
|
|
- `POST /v1/run/workflows` - запустить workflow
|
|||
|
|
- `GET /v1/runs/{run_id}` - статус выполнения
|
|||
|
|
- `GET /v1/runs/{run_id}/timeline` - timeline задачи
|
|||
|
|
- `POST /v1/runs/{run_id}/cancel` - отменить задачу
|
|||
|
|
- `GET /v1/workflows` - список workflows
|
|||
|
|
- `POST /v1/workflows` - создать workflow (YAML/JSON)
|
|||
|
|
- `GET /v1/browser_sessions` - browser сессии
|
|||
|
|
- `POST /v1/credentials` - сохранить credentials
|
|||
|
|
|
|||
|
|
**Полная документация:** http://localhost:8000/docs
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ Известная проблема: OpenAI API
|
|||
|
|
|
|||
|
|
### Симптом
|
|||
|
|
```
|
|||
|
|
APIError: OpenAIException - Country, region, or territory not supported
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Причина
|
|||
|
|
OpenAI блокирует API запросы из России (даже без прокси).
|
|||
|
|
|
|||
|
|
### Решения
|
|||
|
|
|
|||
|
|
#### 1. **Использовать VPN/прокси для OpenAI API** (рекомендуется)
|
|||
|
|
```bash
|
|||
|
|
# В .env добавить:
|
|||
|
|
HTTP_PROXY=http://your-vpn:port
|
|||
|
|
HTTPS_PROXY=http://your-vpn:port
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. **Переключиться на другую LLM модель**
|
|||
|
|
```bash
|
|||
|
|
# Отключить OpenAI в .env:
|
|||
|
|
ENABLE_OPENAI=false
|
|||
|
|
|
|||
|
|
# Включить альтернативу (например, OpenRouter или локальная модель):
|
|||
|
|
OPENAI_COMPATIBLE_API_KEY=your-key
|
|||
|
|
OPENAI_COMPATIBLE_API_URL=https://openrouter.ai/api/v1
|
|||
|
|
LLM_KEY=OPENAI_COMPATIBLE # вместо OPENAI_GPT4_TURBO
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. **Использовать Anthropic Claude** (если есть ключ)
|
|||
|
|
```bash
|
|||
|
|
ENABLE_ANTHROPIC=true
|
|||
|
|
ANTHROPIC_API_KEY=sk-ant-...
|
|||
|
|
LLM_KEY=ANTHROPIC_CLAUDE_SONNET
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4. **Локальная LLM через Ollama**
|
|||
|
|
```bash
|
|||
|
|
# Установить Ollama
|
|||
|
|
curl -fsSL https://ollama.com/install.sh | sh
|
|||
|
|
|
|||
|
|
# Запустить модель
|
|||
|
|
ollama run llama2
|
|||
|
|
|
|||
|
|
# В .env:
|
|||
|
|
OPENAI_COMPATIBLE_API_URL=http://localhost:11434/v1
|
|||
|
|
LLM_KEY=OPENAI_COMPATIBLE
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 Запуск системы
|
|||
|
|
|
|||
|
|
### Запустить backend (если остановлен)
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
source .venv/bin/activate
|
|||
|
|
|
|||
|
|
# Через nohup (background)
|
|||
|
|
nohup uvicorn skyvern.forge.api_app:app --host 0.0.0.0 --port 8000 > backend.log 2>&1 &
|
|||
|
|
|
|||
|
|
# OR через скрипт:
|
|||
|
|
./start-backend.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Запустить frontend
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern/skyvern-frontend
|
|||
|
|
npm run dev
|
|||
|
|
|
|||
|
|
# Откроется на http://localhost:5173
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Запустить Docker сервисы (если остановлены)
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
docker compose -f docker-compose.deps.yml up -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Проверить статус всех сервисов
|
|||
|
|
```bash
|
|||
|
|
# Backend
|
|||
|
|
curl http://localhost:8000/docs | head -5
|
|||
|
|
|
|||
|
|
# Database
|
|||
|
|
docker exec skyvern-postgres psql -U skyvern -d skyvern -c "SELECT 1;"
|
|||
|
|
|
|||
|
|
# Redis
|
|||
|
|
docker exec skyvern-redis redis-cli ping
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📂 Структура проекта
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
/home/vodorod/dorod/skyvern/
|
|||
|
|
├── .env # Конфигурация (с JWT токеном)
|
|||
|
|
├── .venv/ # Python virtual environment
|
|||
|
|
├── backend.log # Логи backend (тут смотреть ошибки!)
|
|||
|
|
├── start-backend.sh # Скрипт запуска backend
|
|||
|
|
├── start-frontend.sh # Скрипт запуска frontend
|
|||
|
|
├── docker-compose.deps.yml # PostgreSQL + Redis
|
|||
|
|
├── skyvern/ # Исходники backend
|
|||
|
|
│ ├── forge/ # FastAPI application
|
|||
|
|
│ │ ├── api_app.py # MODIFIED: добавлен app instance
|
|||
|
|
│ │ └── sdk/ # SDK и модели
|
|||
|
|
│ ├── config.py # Настройки приложения
|
|||
|
|
│ └── cli/ # CLI команды
|
|||
|
|
├── skyvern-frontend/ # React + Vite frontend
|
|||
|
|
│ ├── src/
|
|||
|
|
│ ├── package.json
|
|||
|
|
│ └── node_modules/ (672 pkgs)
|
|||
|
|
├── alembic/ # Database migrations
|
|||
|
|
└── INSTALLATION-COMPLETE.md # Документация установки
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 Полезные команды
|
|||
|
|
|
|||
|
|
### Проверить логи backend
|
|||
|
|
```bash
|
|||
|
|
tail -f backend.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Остановить backend
|
|||
|
|
```bash
|
|||
|
|
pkill -f "uvicorn skyvern.forge.api_app:app"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Перезапустить PostgreSQL
|
|||
|
|
```bash
|
|||
|
|
docker restart skyvern-postgres
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Выполнить миграции (если добавлены новые)
|
|||
|
|
```bash
|
|||
|
|
source .venv/bin/activate
|
|||
|
|
alembic upgrade head
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Создать новую организацию
|
|||
|
|
```python
|
|||
|
|
# В Python venv:
|
|||
|
|
python3 << EOF
|
|||
|
|
import jwt, time
|
|||
|
|
secret_key = "dev-secret-key-change-in-production" # Из .env
|
|||
|
|
payload = {
|
|||
|
|
'sub': 'org_your_new_org',
|
|||
|
|
'exp': int(time.time()) + (365 * 24 * 3600),
|
|||
|
|
'iat': int(time.time())
|
|||
|
|
}
|
|||
|
|
token = jwt.encode(payload, secret_key, algorithm='HS256')
|
|||
|
|
print(f"New JWT: {token}")
|
|||
|
|
EOF
|
|||
|
|
|
|||
|
|
# Затем в PostgreSQL:
|
|||
|
|
docker exec skyvern-postgres psql -U skyvern -d skyvern -c "
|
|||
|
|
INSERT INTO organizations (organization_id, organization_name, created_at, modified_at)
|
|||
|
|
VALUES ('org_your_new_org', 'Your Organization', NOW(), NOW());
|
|||
|
|
|
|||
|
|
INSERT INTO organization_auth_tokens (id, organization_id, token_type, token, valid, created_at, modified_at)
|
|||
|
|
VALUES ('token_new', 'org_your_new_org', 'api', 'YOUR_JWT_TOKEN', true, NOW(), NOW());
|
|||
|
|
"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎓 Примеры использования
|
|||
|
|
|
|||
|
|
### Простой парсинг (после решения OpenAI проблемы)
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8000/v1/run/tasks \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-H "x-api-key: $SKYVERN_API_KEY" \
|
|||
|
|
-d '{
|
|||
|
|
"prompt": "Go to hackernews.com and extract titles of top 5 posts",
|
|||
|
|
"url": "https://news.ycombinator.com",
|
|||
|
|
"max_steps": 5,
|
|||
|
|
"proxy_location": "NONE"
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Заполнение формы
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8000/v1/run/tasks \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-H "x-api-key: $SKYVERN_API_KEY" \
|
|||
|
|
-d '{
|
|||
|
|
"prompt": "Fill the contact form with name John, email john@example.com",
|
|||
|
|
"url": "https://example.com/contact",
|
|||
|
|
"max_steps": 10
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Извлечение структурированных данных
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8000/v1/run/tasks \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-H "x-api-key: $SKYVERN_API_KEY" \
|
|||
|
|
-d '{
|
|||
|
|
"prompt": "Extract product information",
|
|||
|
|
"url": "https://amazon.com/dp/B08N5WRWNW",
|
|||
|
|
"data_extraction_schema": {
|
|||
|
|
"type": "object",
|
|||
|
|
"properties": {
|
|||
|
|
"title": {"type": "string"},
|
|||
|
|
"price": {"type": "number"},
|
|||
|
|
"rating": {"type": "number"}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔗 Интеграция с n8n
|
|||
|
|
|
|||
|
|
### Webhook trigger в n8n
|
|||
|
|
1. Создать webhook node в n8n
|
|||
|
|
2. Получить URL: `https://your-n8n.com/webhook/skyvern-callback`
|
|||
|
|
3. Добавить в Skyvern задачу:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8000/v1/run/tasks \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-H "x-api-key: $SKYVERN_API_KEY" \
|
|||
|
|
-d '{
|
|||
|
|
"prompt": "Extract data",
|
|||
|
|
"url": "https://target-site.com",
|
|||
|
|
"webhook_url": "https://your-n8n.com/webhook/skyvern-callback"
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. n8n получит JSON с результатами после завершения
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 Дополнительная документация
|
|||
|
|
|
|||
|
|
- **Официальная документация:** https://www.skyvern.com/docs
|
|||
|
|
- **GitHub:** https://github.com/Skyvern-AI/skyvern
|
|||
|
|
- **Discord:** https://discord.gg/skyvern-ai
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ Чеклист готовности
|
|||
|
|
|
|||
|
|
- [x] Backend запущен и отвечает на запросы
|
|||
|
|
- [x] PostgreSQL работает (42 таблицы)
|
|||
|
|
- [x] Redis работает
|
|||
|
|
- [x] Playwright Chromium установлен
|
|||
|
|
- [x] JWT токен сгенерирован и сохранён
|
|||
|
|
- [x] API endpoints работают (создание/статус задач)
|
|||
|
|
- [x] Frontend зависимости установлены
|
|||
|
|
- [ ] OpenAI API настроен (нужен VPN/прокси или другая LLM)
|
|||
|
|
- [ ] Frontend запущен (необязательно, можно работать через API)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚨 Следующие шаги
|
|||
|
|
|
|||
|
|
1. **РЕШИТЬ ПРОБЛЕМУ С OpenAI:**
|
|||
|
|
- Настроить VPN/прокси для OpenAI API
|
|||
|
|
- OR переключиться на Anthropic/Ollama
|
|||
|
|
- OR использовать OpenRouter (https://openrouter.ai)
|
|||
|
|
|
|||
|
|
2. **Запустить frontend:**
|
|||
|
|
```bash
|
|||
|
|
cd skyvern-frontend && npm run dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **Создать первую успешную задачу** (после решения п.1)
|
|||
|
|
|
|||
|
|
4. **Настроить интеграцию с n8n** для автоматизации
|
|||
|
|
|
|||
|
|
5. **Применить для traktorodetal.ru парсинга**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**🎉 СИСТЕМА ГОТОВА К РАБОТЕ после решения OpenAI проблемы!**
|