523 lines
13 KiB
Markdown
523 lines
13 KiB
Markdown
|
|
# AI Agent System - Configuration Guide
|
|||
|
|
|
|||
|
|
Детальная инструкция по настройке системы AI агентов для Forgejo.
|
|||
|
|
|
|||
|
|
## Содержание
|
|||
|
|
|
|||
|
|
- [Требования](#требования)
|
|||
|
|
- [Настройка Forgejo](#настройка-forgejo)
|
|||
|
|
- [Настройка Secrets](#настройка-secrets)
|
|||
|
|
- [Настройка Runners](#настройка-runners)
|
|||
|
|
- [Cursor CLI](#cursor-cli)
|
|||
|
|
- [Тестирование](#тестирование)
|
|||
|
|
- [Troubleshooting](#troubleshooting)
|
|||
|
|
|
|||
|
|
## Требования
|
|||
|
|
|
|||
|
|
### Минимальные требования
|
|||
|
|
|
|||
|
|
- **Forgejo**: версия 1.20+ (с поддержкой Actions)
|
|||
|
|
- **Forgejo Runner**: настроенный и запущенный runner
|
|||
|
|
- **Cursor**: активная подписка с API доступом
|
|||
|
|
- **Python**: 3.8+
|
|||
|
|
- **Flutter**: 3.24.0+ (для web_v2)
|
|||
|
|
- **Dart**: 3.0+ (для backend/common)
|
|||
|
|
|
|||
|
|
### Рекомендуемые ресурсы для runner
|
|||
|
|
|
|||
|
|
- **CPU**: 4+ cores
|
|||
|
|
- **RAM**: 8+ GB
|
|||
|
|
- **Disk**: 50+ GB свободного места
|
|||
|
|
- **Network**: стабильное интернет соединение
|
|||
|
|
|
|||
|
|
## Настройка Forgejo
|
|||
|
|
|
|||
|
|
### 1. Включение Forgejo Actions
|
|||
|
|
|
|||
|
|
Отредактируйте `app.ini` вашего Forgejo сервера:
|
|||
|
|
|
|||
|
|
```ini
|
|||
|
|
[actions]
|
|||
|
|
ENABLED = true
|
|||
|
|
DEFAULT_ACTIONS_URL = https://code.forgejo.org
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Перезапустите Forgejo:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
sudo systemctl restart forgejo
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Установка Forgejo Runner
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Скачайте Forgejo Runner
|
|||
|
|
wget https://code.forgejo.org/forgejo/runner/releases/download/v3.3.0/forgejo-runner-3.3.0-linux-amd64
|
|||
|
|
|
|||
|
|
# Переместите в /usr/local/bin
|
|||
|
|
sudo mv forgejo-runner-3.3.0-linux-amd64 /usr/local/bin/forgejo-runner
|
|||
|
|
sudo chmod +x /usr/local/bin/forgejo-runner
|
|||
|
|
|
|||
|
|
# Создайте директорию для runner
|
|||
|
|
sudo mkdir -p /etc/forgejo-runner
|
|||
|
|
cd /etc/forgejo-runner
|
|||
|
|
|
|||
|
|
# Создайте конфигурацию
|
|||
|
|
sudo forgejo-runner create-runner-file
|
|||
|
|
|
|||
|
|
# Зарегистрируйте runner
|
|||
|
|
# Получите registration token из Forgejo: Settings -> Actions -> Runners
|
|||
|
|
sudo forgejo-runner register --no-interactive \
|
|||
|
|
--instance https://your-forgejo-instance.com \
|
|||
|
|
--token YOUR_REGISTRATION_TOKEN \
|
|||
|
|
--name ai-agent-runner \
|
|||
|
|
--labels ubuntu-latest:docker://node:16-bullseye
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. Настройка systemd service для runner
|
|||
|
|
|
|||
|
|
Создайте `/etc/systemd/system/forgejo-runner.service`:
|
|||
|
|
|
|||
|
|
```ini
|
|||
|
|
[Unit]
|
|||
|
|
Description=Forgejo Runner
|
|||
|
|
After=network.target
|
|||
|
|
|
|||
|
|
[Service]
|
|||
|
|
Type=simple
|
|||
|
|
User=forgejo-runner
|
|||
|
|
WorkingDirectory=/etc/forgejo-runner
|
|||
|
|
ExecStart=/usr/local/bin/forgejo-runner daemon
|
|||
|
|
Restart=always
|
|||
|
|
RestartSec=10
|
|||
|
|
|
|||
|
|
[Install]
|
|||
|
|
WantedBy=multi-user.target
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Запустите runner:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
sudo systemctl daemon-reload
|
|||
|
|
sudo systemctl enable forgejo-runner
|
|||
|
|
sudo systemctl start forgejo-runner
|
|||
|
|
sudo systemctl status forgejo-runner
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Настройка Secrets
|
|||
|
|
|
|||
|
|
### В Forgejo Repository
|
|||
|
|
|
|||
|
|
1. Перейдите в ваш репозиторий
|
|||
|
|
2. Settings -> Secrets and Variables -> Actions
|
|||
|
|
3. Добавьте следующие secrets:
|
|||
|
|
|
|||
|
|
#### Обязательные Secrets
|
|||
|
|
|
|||
|
|
**CURSOR_API_KEY**
|
|||
|
|
- Описание: API ключ от Cursor
|
|||
|
|
- Как получить:
|
|||
|
|
1. Откройте Cursor
|
|||
|
|
2. Settings (⚙️) -> Account -> API Keys
|
|||
|
|
3. Create new API key
|
|||
|
|
4. Скопируйте ключ (отобразится только один раз!)
|
|||
|
|
- Пример: `sk-cursor-xxx...`
|
|||
|
|
|
|||
|
|
**FORGEJO_TOKEN**
|
|||
|
|
- Описание: Personal Access Token для Forgejo API
|
|||
|
|
- Как получить:
|
|||
|
|
1. Forgejo -> Settings -> Applications
|
|||
|
|
2. Generate New Token
|
|||
|
|
3. Выберите scopes: `repo`, `write:issue`, `write:workflow`
|
|||
|
|
4. Скопируйте token
|
|||
|
|
- Пример: `ghp_xxxxx...`
|
|||
|
|
|
|||
|
|
#### Опциональные Secrets
|
|||
|
|
|
|||
|
|
**CURSOR_MODEL**
|
|||
|
|
- Описание: Модель AI для использования
|
|||
|
|
- По умолчанию: `claude-3-5-sonnet-20241022`
|
|||
|
|
- Альтернативы:
|
|||
|
|
- `gpt-4-turbo-preview`
|
|||
|
|
- `claude-3-opus-20240229`
|
|||
|
|
|
|||
|
|
**MAX_ITERATIONS**
|
|||
|
|
- Описание: Максимум итераций за один запуск
|
|||
|
|
- По умолчанию: `10`
|
|||
|
|
- Рекомендуется: `10-20`
|
|||
|
|
|
|||
|
|
**MAX_RETRIES**
|
|||
|
|
- Описание: Максимум попыток для задачи
|
|||
|
|
- По умолчанию: `3`
|
|||
|
|
- Рекомендуется: `2-5`
|
|||
|
|
|
|||
|
|
### Проверка Secrets
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Используйте Forgejo CLI (если установлен)
|
|||
|
|
forgejo-cli secrets list --repo your-org/your-repo
|
|||
|
|
|
|||
|
|
# Или через curl
|
|||
|
|
curl -X GET \
|
|||
|
|
"https://your-forgejo.com/api/v1/repos/your-org/your-repo/actions/secrets" \
|
|||
|
|
-H "Authorization: token YOUR_FORGEJO_TOKEN"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Настройка Runners
|
|||
|
|
|
|||
|
|
### Runner Labels
|
|||
|
|
|
|||
|
|
Убедитесь что runner имеет правильные labels для workflows:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# В .forgejo/workflows/agent-development.yml
|
|||
|
|
runs-on: ubuntu-latest
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Проверьте labels вашего runner:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
forgejo-runner list
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Если нужно, добавьте labels при регистрации:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
sudo forgejo-runner register \
|
|||
|
|
--labels ubuntu-latest:docker://node:16-bullseye,ubuntu-22.04:docker://ubuntu:22.04
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Docker vs Host режим
|
|||
|
|
|
|||
|
|
**Docker режим (рекомендуется)**
|
|||
|
|
- Изолированное окружение
|
|||
|
|
- Легкая очистка
|
|||
|
|
- Требует Docker
|
|||
|
|
|
|||
|
|
**Host режим**
|
|||
|
|
- Выполнение на хосте
|
|||
|
|
- Быстрее
|
|||
|
|
- Нужна ручная очистка
|
|||
|
|
|
|||
|
|
Выбор в конфигурации runner:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# .runner файл
|
|||
|
|
labels:
|
|||
|
|
- "ubuntu-latest:docker://node:16-bullseye" # Docker mode
|
|||
|
|
- "ubuntu-latest:host" # Host mode
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Cursor CLI
|
|||
|
|
|
|||
|
|
### Установка на Runner
|
|||
|
|
|
|||
|
|
Cursor CLI устанавливается автоматически в workflows, но можно предустановить:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# На машине runner
|
|||
|
|
curl https://cursor.com/install -fsS | bash
|
|||
|
|
|
|||
|
|
# Добавьте в PATH
|
|||
|
|
echo 'export PATH="$HOME/.cursor/bin:$PATH"' >> ~/.bashrc
|
|||
|
|
source ~/.bashrc
|
|||
|
|
|
|||
|
|
# Проверьте
|
|||
|
|
cursor-agent --version
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Аутентификация Cursor CLI
|
|||
|
|
|
|||
|
|
Cursor CLI использует переменную окружения `CURSOR_API_KEY`:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
export CURSOR_API_KEY="sk-cursor-xxx..."
|
|||
|
|
cursor-agent -p "Test query"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
В workflows это настроено автоматически через secrets.
|
|||
|
|
|
|||
|
|
### Лимиты и квоты
|
|||
|
|
|
|||
|
|
Cursor API имеет лимиты:
|
|||
|
|
|
|||
|
|
- **Free tier**: 500 requests/день
|
|||
|
|
- **Pro tier**: 5000 requests/день
|
|||
|
|
- **Team tier**: 20000 requests/день
|
|||
|
|
|
|||
|
|
Для 24/7 агентов рекомендуется **Pro или Team**.
|
|||
|
|
|
|||
|
|
## Тестирование
|
|||
|
|
|
|||
|
|
### 1. Тест Forgejo Runner
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Проверьте статус runner
|
|||
|
|
sudo systemctl status forgejo-runner
|
|||
|
|
|
|||
|
|
# Проверьте логи
|
|||
|
|
sudo journalctl -u forgejo-runner -f
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Тест Secrets
|
|||
|
|
|
|||
|
|
Создайте тестовый workflow `.forgejo/workflows/test-secrets.yml`:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
name: Test Secrets
|
|||
|
|
|
|||
|
|
on:
|
|||
|
|
workflow_dispatch:
|
|||
|
|
|
|||
|
|
jobs:
|
|||
|
|
test:
|
|||
|
|
runs-on: ubuntu-latest
|
|||
|
|
steps:
|
|||
|
|
- name: Test CURSOR_API_KEY
|
|||
|
|
run: |
|
|||
|
|
if [ -z "${{ secrets.CURSOR_API_KEY }}" ]; then
|
|||
|
|
echo "❌ CURSOR_API_KEY not set"
|
|||
|
|
exit 1
|
|||
|
|
else
|
|||
|
|
echo "✅ CURSOR_API_KEY is set"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
- name: Test FORGEJO_TOKEN
|
|||
|
|
run: |
|
|||
|
|
if [ -z "${{ secrets.FORGEJO_TOKEN }}" ]; then
|
|||
|
|
echo "❌ FORGEJO_TOKEN not set"
|
|||
|
|
exit 1
|
|||
|
|
else
|
|||
|
|
echo "✅ FORGEJO_TOKEN is set"
|
|||
|
|
fi
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Запустите через Actions -> Test Secrets -> Run workflow
|
|||
|
|
|
|||
|
|
### 3. Тест Cursor CLI
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
name: Test Cursor CLI
|
|||
|
|
|
|||
|
|
on:
|
|||
|
|
workflow_dispatch:
|
|||
|
|
|
|||
|
|
jobs:
|
|||
|
|
test:
|
|||
|
|
runs-on: ubuntu-latest
|
|||
|
|
steps:
|
|||
|
|
- uses: actions/checkout@v3
|
|||
|
|
|
|||
|
|
- name: Install Cursor CLI
|
|||
|
|
run: |
|
|||
|
|
curl https://cursor.com/install -fsS | bash
|
|||
|
|
export PATH="$HOME/.cursor/bin:$PATH"
|
|||
|
|
cursor-agent --version
|
|||
|
|
|
|||
|
|
- name: Test Cursor Agent
|
|||
|
|
env:
|
|||
|
|
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
|
|||
|
|
run: |
|
|||
|
|
export PATH="$HOME/.cursor/bin:$PATH"
|
|||
|
|
cursor-agent -p "What is 2+2?"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. Тест Planning Agent
|
|||
|
|
|
|||
|
|
Запустите Planning Agent через UI:
|
|||
|
|
|
|||
|
|
1. Actions -> AI Agent - Planning
|
|||
|
|
2. Run workflow
|
|||
|
|
3. Выберите component: `web_v2`
|
|||
|
|
4. Run workflow
|
|||
|
|
|
|||
|
|
Проверьте:
|
|||
|
|
- ✅ Workflow запустился
|
|||
|
|
- ✅ Cursor CLI установлен
|
|||
|
|
- ✅ Planning agent выполнился
|
|||
|
|
- ✅ task_list.json создан
|
|||
|
|
- ✅ Issue создан
|
|||
|
|
- ✅ Development workflow триггернут
|
|||
|
|
|
|||
|
|
## Troubleshooting
|
|||
|
|
|
|||
|
|
### Runner не запускается
|
|||
|
|
|
|||
|
|
**Проблема**: `forgejo-runner daemon` fails
|
|||
|
|
|
|||
|
|
**Решение**:
|
|||
|
|
```bash
|
|||
|
|
# Проверьте логи
|
|||
|
|
sudo journalctl -u forgejo-runner -n 50
|
|||
|
|
|
|||
|
|
# Проверьте конфигурацию
|
|||
|
|
cat /etc/forgejo-runner/.runner
|
|||
|
|
|
|||
|
|
# Переререгистрируйте
|
|||
|
|
sudo forgejo-runner register --no-interactive \
|
|||
|
|
--instance https://your-forgejo.com \
|
|||
|
|
--token NEW_TOKEN
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Workflow не запускается
|
|||
|
|
|
|||
|
|
**Проблема**: Workflow pending forever
|
|||
|
|
|
|||
|
|
**Решение**:
|
|||
|
|
1. Проверьте что runner запущен и online (Settings -> Actions -> Runners)
|
|||
|
|
2. Проверьте labels: `runs-on` должен совпадать с runner labels
|
|||
|
|
3. Проверьте логи runner: `sudo journalctl -u forgejo-runner -f`
|
|||
|
|
|
|||
|
|
### Cursor CLI authentication failed
|
|||
|
|
|
|||
|
|
**Проблема**: `Error: Invalid API key`
|
|||
|
|
|
|||
|
|
**Решение**:
|
|||
|
|
1. Проверьте что `CURSOR_API_KEY` secret настроен
|
|||
|
|
2. Проверьте ключ в Cursor: Settings -> Account -> API Keys
|
|||
|
|
3. Создайте новый ключ если старый истек
|
|||
|
|
4. Обновите secret в Forgejo
|
|||
|
|
|
|||
|
|
### Python script import errors
|
|||
|
|
|
|||
|
|
**Проблема**: `ModuleNotFoundError: No module named 'config'`
|
|||
|
|
|
|||
|
|
**Решение**:
|
|||
|
|
```yaml
|
|||
|
|
# В workflow добавьте:
|
|||
|
|
- name: Set PYTHONPATH
|
|||
|
|
run: |
|
|||
|
|
export PYTHONPATH="${{ github.workspace }}/tools/agent:$PYTHONPATH"
|
|||
|
|
echo "PYTHONPATH=$PYTHONPATH" >> $GITHUB_ENV
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Git push failed
|
|||
|
|
|
|||
|
|
**Проблема**: `remote: Permission denied`
|
|||
|
|
|
|||
|
|
**Решение**:
|
|||
|
|
1. Проверьте что `FORGEJO_TOKEN` имеет `repo` scope
|
|||
|
|
2. Настройте git credentials в workflow:
|
|||
|
|
```yaml
|
|||
|
|
- name: Configure Git
|
|||
|
|
run: |
|
|||
|
|
git config --global user.name "AI Agent"
|
|||
|
|
git config --global user.email "ai-agent@mnemo-cards.com"
|
|||
|
|
git config --global credential.helper store
|
|||
|
|
echo "https://ai-agent:${{ secrets.FORGEJO_TOKEN }}@your-forgejo.com" > ~/.git-credentials
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Task list JSON invalid
|
|||
|
|
|
|||
|
|
**Проблема**: Planning agent generates invalid JSON
|
|||
|
|
|
|||
|
|
**Решение**:
|
|||
|
|
1. Проверьте логи planning agent
|
|||
|
|
2. Валидируйте JSON вручную: `cat task_list.json | jq .`
|
|||
|
|
3. Если Cursor генерирует невалидный JSON, улучшите prompt
|
|||
|
|
|
|||
|
|
### Disk space full on runner
|
|||
|
|
|
|||
|
|
**Проблема**: Runner runs out of disk space
|
|||
|
|
|
|||
|
|
**Решение**:
|
|||
|
|
```bash
|
|||
|
|
# Очистите Docker images
|
|||
|
|
docker system prune -af
|
|||
|
|
|
|||
|
|
# Очистите старые builds
|
|||
|
|
cd /etc/forgejo-runner/_work
|
|||
|
|
find . -type d -mtime +7 -exec rm -rf {} +
|
|||
|
|
|
|||
|
|
# Настройте auto-cleanup в workflow
|
|||
|
|
- name: Cleanup
|
|||
|
|
if: always()
|
|||
|
|
run: |
|
|||
|
|
docker system prune -f
|
|||
|
|
rm -rf ${{ github.workspace }}/*
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Мониторинг
|
|||
|
|
|
|||
|
|
### Forgejo Actions UI
|
|||
|
|
|
|||
|
|
- **Workflows**: Actions tab -> All workflows
|
|||
|
|
- **Runs**: Каждый workflow run с логами
|
|||
|
|
- **Runners**: Settings -> Actions -> Runners
|
|||
|
|
|
|||
|
|
### Логи Runner
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Real-time logs
|
|||
|
|
sudo journalctl -u forgejo-runner -f
|
|||
|
|
|
|||
|
|
# Last 100 lines
|
|||
|
|
sudo journalctl -u forgejo-runner -n 100
|
|||
|
|
|
|||
|
|
# Logs with errors
|
|||
|
|
sudo journalctl -u forgejo-runner | grep -i error
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Agent State
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Web v2
|
|||
|
|
cat ai_docs/agent/web_v2/agent_state.json | jq
|
|||
|
|
|
|||
|
|
# Backend
|
|||
|
|
cat ai_docs/agent/backend/agent_state.json | jq
|
|||
|
|
|
|||
|
|
# Check current task
|
|||
|
|
cat ai_docs/agent/web_v2/agent_state.json | jq -r '.current_task_id'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Metrics
|
|||
|
|
|
|||
|
|
Добавьте мониторинг в workflow:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
- name: Report Metrics
|
|||
|
|
if: always()
|
|||
|
|
run: |
|
|||
|
|
echo "Workflow: ${{ github.workflow }}"
|
|||
|
|
echo "Duration: ${{ steps.agent.duration }}s"
|
|||
|
|
echo "Status: ${{ job.status }}"
|
|||
|
|
# Send to monitoring system (Prometheus, Grafana, etc.)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Best Practices
|
|||
|
|
|
|||
|
|
### Security
|
|||
|
|
|
|||
|
|
1. ✅ Используйте отдельный Forgejo token для агентов (не ваш личный)
|
|||
|
|
2. ✅ Ограничьте scopes token до минимума (`repo`, `write:issue`)
|
|||
|
|
3. ✅ Ротируйте API ключи регулярно (раз в 3 месяца)
|
|||
|
|
4. ✅ Не логируйте secrets в workflow outputs
|
|||
|
|
5. ✅ Используйте runner в изолированной среде (Docker)
|
|||
|
|
|
|||
|
|
### Performance
|
|||
|
|
|
|||
|
|
1. ✅ Кешируйте dependencies (Flutter, Dart)
|
|||
|
|
2. ✅ Используйте concurrent jobs где возможно
|
|||
|
|
3. ✅ Ограничьте `MAX_ITERATIONS` разумным значением (10-15)
|
|||
|
|
4. ✅ Настройте timeouts для jobs (6 часов max)
|
|||
|
|
|
|||
|
|
### Reliability
|
|||
|
|
|
|||
|
|
1. ✅ Мониторьте runner uptime
|
|||
|
|
2. ✅ Настройте alerts для failed workflows
|
|||
|
|
3. ✅ Регулярно проверяйте agent_state.json
|
|||
|
|
4. ✅ Имейте fallback план (ручная разработка)
|
|||
|
|
|
|||
|
|
## Дополнительные ресурсы
|
|||
|
|
|
|||
|
|
- [Forgejo Actions Documentation](https://forgejo.org/docs/latest/user/actions/)
|
|||
|
|
- [Cursor CLI Documentation](https://cursor.com/docs/cli/headless)
|
|||
|
|
- [Project README](./README.md)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Последнее обновление**: 2025-11-20
|
|||
|
|
**Версия**: 1.0
|
|||
|
|
|