552 lines
13 KiB
Markdown
552 lines
13 KiB
Markdown
|
|
# 🚀 Skyvern - Installation Complete!
|
|||
|
|
|
|||
|
|
**Дата установки:** 20 февраля 2026
|
|||
|
|
**Статус:** ✅ Backend и Frontend готовы к запуску
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📦 Что установлено
|
|||
|
|
|
|||
|
|
### Backend (Python 3.12)
|
|||
|
|
- ✅ Virtual environment: `/home/vodorod/dorod/skyvern/.venv`
|
|||
|
|
- ✅ Python зависимости: FastAPI, Playwright, SQLAlchemy, OpenAI SDK
|
|||
|
|
- ✅ Playwright браузер: Chromium 145.0.7632.6
|
|||
|
|
- ✅ База данных: PostgreSQL 16 (42 таблицы)
|
|||
|
|
- ✅ Миграции выполнены
|
|||
|
|
|
|||
|
|
### Frontend (React + TypeScript)
|
|||
|
|
- ✅ Node.js v20.19.5
|
|||
|
|
- ✅ npm зависимости установлены (672 пакетов)
|
|||
|
|
- ✅ Vite dev server готов
|
|||
|
|
|
|||
|
|
### Database & Cache
|
|||
|
|
- ✅ PostgreSQL: `localhost:5433` (Docker) | credentials: `skyvern/skyvern`
|
|||
|
|
- ✅ Redis: `localhost:6380` (Docker)
|
|||
|
|
|
|||
|
|
### Configuration
|
|||
|
|
- ✅ `.env` файл создан
|
|||
|
|
- ✅ OpenAI API key настроен
|
|||
|
|
- ✅ LLM: GPT-4 Turbo (основной) + GPT-4o mini (secondary)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 Как запустить
|
|||
|
|
|
|||
|
|
### Вариант 1: Быстрый запуск (скрипты)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
|
|||
|
|
# Terminal 1: Backend
|
|||
|
|
./start-backend.sh
|
|||
|
|
|
|||
|
|
# Terminal 2: Frontend (после запуска backend)
|
|||
|
|
./start-frontend.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Доступ:**
|
|||
|
|
- Backend API: http://localhost:8000
|
|||
|
|
- API Docs: http://localhost:8000/docs
|
|||
|
|
- Frontend: http://localhost:5173
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Вариант 2: Ручной запуск (для отладки)
|
|||
|
|
|
|||
|
|
#### Backend:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
source .venv/bin/activate
|
|||
|
|
|
|||
|
|
# Проверить БД
|
|||
|
|
docker ps | grep skyvern
|
|||
|
|
|
|||
|
|
# Запустить БД если нужно
|
|||
|
|
docker compose -f docker-compose.deps.yml up -d
|
|||
|
|
|
|||
|
|
# Запустить backend
|
|||
|
|
uvicorn skyvern.forge.api_app:app --host 0.0.0.0 --port 8000 --reload
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Frontend:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern/skyvern-frontend
|
|||
|
|
npm run dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🐛 Troubleshooting
|
|||
|
|
|
|||
|
|
### Backend не запускается
|
|||
|
|
|
|||
|
|
**Проблема:** Backend зависает при запуске
|
|||
|
|
|
|||
|
|
**Причина:** `forge_app.api_app_startup_event` выполняет блокирующие операции
|
|||
|
|
|
|||
|
|
**Решение 1 - Проверить логи:**
|
|||
|
|
```bash
|
|||
|
|
tail -f /tmp/skyvern-backend.log
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Решение 2 - Запустить в debug режиме:**
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
source .venv/bin/activate
|
|||
|
|
|
|||
|
|
# Увеличить log level
|
|||
|
|
LOG_LEVEL=DEBUG uvicorn skyvern.forge.api_app:app \
|
|||
|
|
--host 0.0.0.0 \
|
|||
|
|
--port 8000 \
|
|||
|
|
--log-level debug
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Решение 3 - Проверить подключение к БД:**
|
|||
|
|
```bash
|
|||
|
|
# Проверить PostgreSQL
|
|||
|
|
docker exec -it skyvern-postgres psql -U skyvern -d skyvern -c "SELECT 1;"
|
|||
|
|
|
|||
|
|
# Проверить Redis
|
|||
|
|
docker exec -it skyvern-redis redis-cli ping
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Решение 4 - Отключить lifespan events (временно):**
|
|||
|
|
|
|||
|
|
Отредактировать `/home/vodorod/dorod/skyvern/skyvern/forge/api_app.py`:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# Закомментировать проблемный код в lifespan():
|
|||
|
|
# if forge_app.api_app_startup_event:
|
|||
|
|
# LOG.info("Calling api app startup event")
|
|||
|
|
# try:
|
|||
|
|
# await forge_app.api_app_startup_event(fastapi_app)
|
|||
|
|
# except Exception:
|
|||
|
|
# LOG.exception("Failed to execute api app startup event")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### PostgreSQL connection error
|
|||
|
|
|
|||
|
|
**Проблема:** `could not connect to server`
|
|||
|
|
|
|||
|
|
**Решение:**
|
|||
|
|
```bash
|
|||
|
|
# Перезапустить PostgreSQL
|
|||
|
|
docker compose -f docker-compose.deps.yml restart postgres
|
|||
|
|
|
|||
|
|
# Проверить порт
|
|||
|
|
ss -tlnp | grep 5433
|
|||
|
|
|
|||
|
|
# Проверить .env
|
|||
|
|
grep DATABASE_STRING .env
|
|||
|
|
# Должно быть: postgresql+psycopg://skyvern:skyvern@localhost:5433/skyvern
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Frontend CORS errors
|
|||
|
|
|
|||
|
|
**Проблема:** CORS ошибка при запросе к backend
|
|||
|
|
|
|||
|
|
**Решение:**
|
|||
|
|
|
|||
|
|
Отредактировать `/home/vodorod/dorod/skyvern/.env`:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
ALLOWED_ORIGINS=["http://localhost:5173","http://localhost:3000","http://127.0.0.1:5173"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Перезапустить backend.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 API Примеры
|
|||
|
|
|
|||
|
|
### Создать задачу парсинга
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8000/api/v1/tasks \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"url": "https://traktorodetal.ru",
|
|||
|
|
"navigation_goal": "Find all SANY glass products",
|
|||
|
|
"data_extraction_goal": "Extract: name, part number, price, availability",
|
|||
|
|
"webhook_callback_url": "http://localhost:8000/webhook/result"
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Response:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"task_id": "tsk_abc123",
|
|||
|
|
"status": "queued",
|
|||
|
|
"created_at": "2026-02-20T20:00:00Z"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Получить результат
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8000/api/v1/tasks/tsk_abc123
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Список всех задач
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8000/api/v1/tasks?page=1&page_size=10
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 Конфигурация (.env)
|
|||
|
|
|
|||
|
|
### LLM Settings
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Использовать другую модель OpenAI
|
|||
|
|
LLM_KEY=OPENAI_GPT4 # GPT-4 (дороже но точнее)
|
|||
|
|
# LLM_KEY=OPENAI_GPT4_TURBO # GPT-4 Turbo (по умолчанию)
|
|||
|
|
# LLM_KEY=OPENAI_GPT4O # GPT-4o (новая модель)
|
|||
|
|
|
|||
|
|
# Для дешевых задач
|
|||
|
|
SECONDARY_LLM_KEY=OPENAI_GPT4O_MINI
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Browser Settings
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Headless (production)
|
|||
|
|
BROWSER_TYPE=chromium-headless
|
|||
|
|
|
|||
|
|
# Headful (для отладки - видно браузер)
|
|||
|
|
BROWSER_TYPE=chromium-headful
|
|||
|
|
|
|||
|
|
# Retry attempts
|
|||
|
|
MAX_SCRAPING_RETRIES=3
|
|||
|
|
|
|||
|
|
# Timeout
|
|||
|
|
BROWSER_ACTION_TIMEOUT_MS=10000 # 10 секунд
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Agent Settings
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Максимум шагов на одну задачу
|
|||
|
|
MAX_STEPS_PER_RUN=75
|
|||
|
|
|
|||
|
|
# Запись видео (для отладки)
|
|||
|
|
RECORD_VIDEOS=true
|
|||
|
|
|
|||
|
|
# Screenshots
|
|||
|
|
ENABLE_SCREENSHOTS=true
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Proxy (для российских серверов)
|
|||
|
|
|
|||
|
|
Если OpenAI заблокирован:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Раскомментировать в .env:
|
|||
|
|
HTTP_PROXY=socks5://user:pass@proxy:port
|
|||
|
|
HTTPS_PROXY=socks5://user:pass@proxy:port
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎨 Frontend Architecture
|
|||
|
|
|
|||
|
|
Skyvern использует **React** + **TypeScript** + **Vite**.
|
|||
|
|
|
|||
|
|
**Структура:**
|
|||
|
|
```
|
|||
|
|
skyvern-frontend/
|
|||
|
|
├── src/
|
|||
|
|
│ ├── components/ # UI компоненты
|
|||
|
|
│ ├── routes/ # Страницы (React Router)
|
|||
|
|
│ ├── api/ # API клиенты
|
|||
|
|
│ ├── stores/ # State management
|
|||
|
|
│ └── utils/ # Helpers
|
|||
|
|
├── package.json
|
|||
|
|
└── vite.config.ts
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Кастомизация:**
|
|||
|
|
|
|||
|
|
1. Добавить новую страницу:
|
|||
|
|
```tsx
|
|||
|
|
// src/routes/my-page.tsx
|
|||
|
|
export function MyPage() {
|
|||
|
|
return <div>My Custom Page</div>;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. Добавить route:
|
|||
|
|
```tsx
|
|||
|
|
// src/routes/index.tsx
|
|||
|
|
import { MyPage } from "./my-page";
|
|||
|
|
|
|||
|
|
{path: "/my-page", element: <MyPage />}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. Перезапустить frontend:
|
|||
|
|
```bash
|
|||
|
|
# Frontend автоматически обновится (hot reload)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🐍 Backend Architecture
|
|||
|
|
|
|||
|
|
Skyvern использует **FastAPI** + **SQLAlchemy** + **Playwright**.
|
|||
|
|
|
|||
|
|
**Структура:**
|
|||
|
|
```
|
|||
|
|
skyvern/
|
|||
|
|
├── forge/
|
|||
|
|
│ ├── api_app.py # FastAPI app
|
|||
|
|
│ ├── sdk/
|
|||
|
|
│ │ ├── routes/ # API endpoints
|
|||
|
|
│ │ ├── core/ # Business logic
|
|||
|
|
│ │ ├── db/ # Database models
|
|||
|
|
│ │ └── agents/ # AI agents
|
|||
|
|
│ └── forge_app_initializer.py
|
|||
|
|
├── config.py # Configuration
|
|||
|
|
└── exceptions.py # Custom exceptions
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Кастомизация:**
|
|||
|
|
|
|||
|
|
1. Добавить новый endpoint:
|
|||
|
|
```python
|
|||
|
|
# skyvern/forge/sdk/routes/custom.py
|
|||
|
|
from fastapi import APIRouter
|
|||
|
|
|
|||
|
|
router = APIRouter(prefix="/api/v1/custom", tags=["Custom"])
|
|||
|
|
|
|||
|
|
@router.post("/my-endpoint")
|
|||
|
|
async def my_endpoint(data: dict):
|
|||
|
|
return {"status": "success", "data": data}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. Зарегистрировать router:
|
|||
|
|
```python
|
|||
|
|
# skyvern/forge/sdk/routes/routers.py
|
|||
|
|
from skyvern.forge.sdk.routes import custom
|
|||
|
|
|
|||
|
|
base_router.include_router(custom.router)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. Перезапустить backend (auto-reload включен).
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 Database Schema
|
|||
|
|
|
|||
|
|
**42 таблицы:**
|
|||
|
|
|
|||
|
|
Основные:
|
|||
|
|
- `tasks` - задачи парсинга
|
|||
|
|
- `actions` - действия (click, fill, extract)
|
|||
|
|
- `artifacts` - screenshots, videos, recordings
|
|||
|
|
- `workflows` - последовательности задач
|
|||
|
|
- `organizations` - мульти-тенантность
|
|||
|
|
- `credentials` - хранение credentials (AWS, Bitwarden, etc.)
|
|||
|
|
|
|||
|
|
Просмотр схемы:
|
|||
|
|
```bash
|
|||
|
|
docker exec -it skyvern-postgres psql -U skyvern -d skyvern -c "\dt"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Миграции:
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
source .venv/bin/activate
|
|||
|
|
|
|||
|
|
# Создать новую миграцию
|
|||
|
|
alembic revision --autogenerate -m "Add my_table"
|
|||
|
|
|
|||
|
|
# Применить миграции
|
|||
|
|
alembic upgrade head
|
|||
|
|
|
|||
|
|
# Откатить миграцию
|
|||
|
|
alembic downgrade -1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔐 Security
|
|||
|
|
|
|||
|
|
### Production Checklist:
|
|||
|
|
|
|||
|
|
- [ ] Изменить `SECRET_KEY` в `.env`
|
|||
|
|
- [ ] Использовать HTTPS (не HTTP)
|
|||
|
|
- [ ] Настроить `ALLOWED_ORIGINS` (whitelist доменов)
|
|||
|
|
- [ ] Включить rate limiting
|
|||
|
|
- [ ] Настроить аутентификацию (API keys, OAuth)
|
|||
|
|
- [ ] Отключить `RECORD_VIDEOS` (экономия места)
|
|||
|
|
- [ ] Настроить логирование в файлы (не stdout)
|
|||
|
|
- [ ] Использовать production PostgreSQL (не Docker)
|
|||
|
|
- [ ] Бэкапы БД
|
|||
|
|
|
|||
|
|
### Генерировать новый SECRET_KEY:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
python -c "import secrets; print(secrets.token_urlsafe(32))"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Добавить в `.env`:
|
|||
|
|
```bash
|
|||
|
|
SECRET_KEY=ваш-новый-секрет-ключ
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 Следующие шаги
|
|||
|
|
|
|||
|
|
### 1. Тест базового функционала
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Запустить backend и frontend
|
|||
|
|
./start-backend.sh
|
|||
|
|
./start-frontend.sh
|
|||
|
|
|
|||
|
|
# 2. Открыть http://localhost:5173
|
|||
|
|
# 3. Создать тестовую задачу
|
|||
|
|
# 4. Проверить результат
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Кастомизация для ваших задач
|
|||
|
|
|
|||
|
|
**Пример: Парсинг traktorodetal.ru**
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# Создать новый agent preset
|
|||
|
|
# skyvern/forge/sdk/agents/presets/traktorodetal.py
|
|||
|
|
|
|||
|
|
class TraktorodetalAgent:
|
|||
|
|
name = "traktorodetal-parser"
|
|||
|
|
|
|||
|
|
@staticmethod
|
|||
|
|
def get_instructions():
|
|||
|
|
return """
|
|||
|
|
You are parsing traktorodetal.ru for SANY glass products.
|
|||
|
|
|
|||
|
|
Steps:
|
|||
|
|
1. Navigate to main page
|
|||
|
|
2. Find SANY category
|
|||
|
|
3. Extract all products with:
|
|||
|
|
- Name
|
|||
|
|
- Part number
|
|||
|
|
- Price
|
|||
|
|
- Availability
|
|||
|
|
4. Handle pagination
|
|||
|
|
"""
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. Интеграция с n8n
|
|||
|
|
|
|||
|
|
**Webhook в n8n:**
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// n8n HTTP Request Node
|
|||
|
|
POST http://localhost:8000/api/v1/tasks
|
|||
|
|
Body: {
|
|||
|
|
"url": "{{$json.site_url}}",
|
|||
|
|
"navigation_goal": "{{$json.goal}}",
|
|||
|
|
"webhook_callback_url": "https://n8n.cryptomutant.tech/webhook/skyvern-result"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Получить результат:**
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// n8n Webhook Node
|
|||
|
|
Webhook URL: /webhook/skyvern-result
|
|||
|
|
Method: POST
|
|||
|
|
|
|||
|
|
// Сохранить в БД или отправить в Telegram
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📞 Поддержка
|
|||
|
|
|
|||
|
|
**Логи:**
|
|||
|
|
- Backend: `/tmp/skyvern-backend.log`
|
|||
|
|
- Frontend: в терминале где запущен `npm run dev`
|
|||
|
|
- Database: `docker logs skyvern-postgres`
|
|||
|
|
- Redis: `docker logs skyvern-redis`
|
|||
|
|
|
|||
|
|
**Остановить все:**
|
|||
|
|
```bash
|
|||
|
|
# Backend
|
|||
|
|
pkill -f "uvicorn skyvern"
|
|||
|
|
|
|||
|
|
# Frontend
|
|||
|
|
pkill -f "vite"
|
|||
|
|
|
|||
|
|
# Database
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
docker compose -f docker-compose.deps.yml down
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Полная переустановка:**
|
|||
|
|
```bash
|
|||
|
|
cd /home/vodorod/dorod/skyvern
|
|||
|
|
|
|||
|
|
# Остановить все
|
|||
|
|
pkill -f "uvicorn skyvern"
|
|||
|
|
pkill -f "vite"
|
|||
|
|
docker compose -f docker-compose.deps.yml down -v # -v удалит данные БД
|
|||
|
|
|
|||
|
|
# Удалить venv
|
|||
|
|
rm -rf .venv
|
|||
|
|
|
|||
|
|
# Установить заново
|
|||
|
|
python3 -m venv .venv
|
|||
|
|
source .venv/bin/activate
|
|||
|
|
pip install -e ".[dev]"
|
|||
|
|
playwright install chromium
|
|||
|
|
|
|||
|
|
# Запустить БД
|
|||
|
|
docker compose -f docker-compose.deps.yml up -d
|
|||
|
|
|
|||
|
|
# Миграции
|
|||
|
|
alembic upgrade head
|
|||
|
|
|
|||
|
|
# Запуск
|
|||
|
|
./start-backend.sh
|
|||
|
|
./start-frontend.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 Готово к работе!
|
|||
|
|
|
|||
|
|
**Текущий статус:**
|
|||
|
|
- ✅ PostgreSQL запущен на 5433
|
|||
|
|
- ✅ Redis запущен на 6380
|
|||
|
|
- ✅ Python зависимости установлены
|
|||
|
|
- ✅ Frontend зависимости установлены
|
|||
|
|
- ✅ База данных создана (42 таблицы)
|
|||
|
|
- ✅ OpenAI API key настроен
|
|||
|
|
- ⏸️ Backend требует отладки startup events
|
|||
|
|
- ⏸️ Frontend готов к запуску после backend
|
|||
|
|
|
|||
|
|
**Следующий шаг:**
|
|||
|
|
|
|||
|
|
1. Исправить проблему с backend startup (см. Troubleshooting)
|
|||
|
|
2. Запустить backend
|
|||
|
|
3. Запустить frontend
|
|||
|
|
4. Создать первую задачу парсинга!
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Документация:**
|
|||
|
|
- Официальная: https://docs.skyvern.com
|
|||
|
|
- GitHub: https://github.com/Skyvern-AI/skyvern
|
|||
|
|
- API Reference: http://localhost:8000/docs (после запуска backend)
|