Установка Claude API в Docker с Nginx Proxy Manager
Содержание
1. Создание структуры директорий
# Создать основную директорию sudo mkdir -p /opt/claudeapi # Создать поддиректории sudo mkdir -p /opt/claudeapi/{app,logs,data,credentials,scripts} # Установить права доступа sudo chown -R $USER:$USER /opt/claudeapi chmod -R 755 /opt/claudeapi
Итоговая структура директорий:
/opt/claudeapi/ ├── app/ # Исходный код приложения ├── logs/ # Логи контейнера ├── data/ # Данные приложения ├── credentials/ # Credentials для Claude CLI ├── scripts/ # Вспомогательные скрипты ├── .env # Переменные окружения ├── Dockerfile # Образ Docker └── docker-compose.yml # Конфигурация compose
2. Создание необходимых файлов
2.1 Клонирование репозитория
cd /opt/claudeapi git clone https://github.com/vlad29042/claude-api-minimal.git app/
Если git не установлен: sudo apt install git
2.2 Создание Dockerfile
Шаг 1: Откройте редактор nano
nano /opt/claudeapi/Dockerfile
Шаг 2: Скопируйте содержимое
Для вставки в nano используйте Ctrl+Shift+V или правую кнопку мыши
FROM python:3.11-slim
# Установка системных зависимостей
RUN apt-get update && apt-get install -y \
curl \
git \
nodejs \
npm \
&& rm -rf /var/lib/apt/lists/*
# Установка Claude CLI
RUN npm install -g @anthropic-ai/claude-code
# Создание рабочей директории
WORKDIR /app
# Копирование requirements
COPY app/requirements.txt .
# Установка Python зависимостей
RUN pip install --no-cache-dir -r requirements.txt
# Копирование приложения
COPY app/ .
# Создание директории для credentials
RUN mkdir -p /root/.claude
# Открытие порта
EXPOSE 8001
# Healthcheck
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8001/health || exit 1
# Запуск приложения
CMD ["python3", "minimal_server.py"]
Шаг 3: Сохраните файл
- Нажмите
Ctrl+O(WriteOut) - Нажмите
Enterдля подтверждения - Нажмите
Ctrl+Xдля выхода из nano
2.3 Создание docker-compose.yml
Шаг 1: Откройте редактор
nano /opt/claudeapi/docker-compose.yml
Шаг 2: Вставьте содержимое
ВАЖНО: Имя контейнера claudeapi, используется сеть webproxy
version: '3.8' services: claude-api: build: . container_name: claudeapi restart: unless-stopped # Порт НЕ пробрасывается наружу - доступ только через NPM expose: - "8001" environment: - PORT=8001 - HOST=0.0.0.0 - CLAUDE_TIMEOUT_SECONDS=300 - CLAUDE_MAX_TURNS=50 env_file: - .env volumes: - ./logs:/app/logs - ./data:/app/data - ./credentials:/root/.claude:rw networks: - webproxy logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: webproxy: external: true
Шаг 3: Сохраните файл (Ctrl+O, Enter, Ctrl+X)
2.4 Создание .env файла
Шаг 1: Сгенерируйте безопасный API ключ
# Вариант 1: через openssl openssl rand -hex 32 # Вариант 2: через Python python3 -c "import secrets; print(secrets.token_urlsafe(32))"
Скопируйте полученный ключ.
Шаг 2: Создайте файл .env
nano /opt/claudeapi/.env
Шаг 3: Вставьте конфигурацию
# API ключ для HTTP запросов (используйте сгенерированный ключ!) CLAUDE_API_KEY=ВСТАВЬТЕ_ВАШ_СГЕНЕРИРОВАННЫЙ_КЛЮЧ_СЮДА # Anthropic API Key (если используете API вместо локальной подписки) # ANTHROPIC_API_KEY=sk-ant-your-anthropic-api-key-here # Настройки сервера PORT=8001 HOST=0.0.0.0 # Настройки Claude CLAUDE_TIMEOUT_SECONDS=300 CLAUDE_MAX_TURNS=50 # Режим работы ENVIRONMENT=production # Логирование LOG_LEVEL=INFO
Шаг 4: Сохраните файл (Ctrl+O, Enter, Ctrl+X)
Шаг 5: Установите правильные права доступа
chmod 600 /opt/claudeapi/.env
КРИТИЧЕСКИ ВАЖНО: Замените ВСТАВЬТЕ_ВАШ_СГЕНЕРИРОВАННЫЙ_КЛЮЧ_СЮДА на реальный сгенерированный ключ!
2.5 Создание скрипта управления с меню
Создайте единый скрипт управления:
nano /opt/claudeapi/scripts/manage.sh
Вставьте содержимое:
#!/bin/bash # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Директория проекта PROJECT_DIR="/opt/claudeapi" # Функция отображения меню show_menu() { clear echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} Claude API - Управление контейнером${NC}" echo -e "${BLUE}========================================${NC}" echo "" echo -e "${GREEN}1.${NC} Запустить контейнер" echo -e "${GREEN}2.${NC} Остановить контейнер" echo -e "${GREEN}3.${NC} Перезапустить контейнер" echo -e "${GREEN}4.${NC} Просмотр логов" echo -e "${GREEN}5.${NC} Статус контейнера" echo -e "${GREEN}6.${NC} Пересборка контейнера" echo -e "${GREEN}7.${NC} Проверка здоровья (Health Check)" echo -e "${GREEN}8.${NC} Мониторинг ресурсов" echo -e "${RED}0.${NC} Выход" echo "" echo -e "${BLUE}========================================${NC}" } # Функция запуска контейнера start_container() { echo -e "${YELLOW}Запуск контейнера...${NC}" cd "$PROJECT_DIR" docker compose up -d if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Контейнер успешно запущен${NC}" else echo -e "${RED}✗ Ошибка запуска контейнера${NC}" fi read -p "Нажмите Enter для продолжения..." } # Функция остановки контейнера stop_container() { echo -e "${YELLOW}Остановка контейнера...${NC}" cd "$PROJECT_DIR" docker compose down if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Контейнер успешно остановлен${NC}" else echo -e "${RED}✗ Ошибка остановки контейнера${NC}" fi read -p "Нажмите Enter для продолжения..." } # Функция перезапуска контейнера restart_container() { echo -e "${YELLOW}Перезапуск контейнера...${NC}" cd "$PROJECT_DIR" docker compose restart if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Контейнер успешно перезапущен${NC}" else echo -e "${RED}✗ Ошибка перезапуска контейнера${NC}" fi read -p "Нажмите Enter для продолжения..." } # Функция просмотра логов view_logs() { echo -e "${YELLOW}Просмотр логов (Ctrl+C для выхода)...${NC}" sleep 2 cd "$PROJECT_DIR" docker compose logs -f --tail=100 } # Функция проверки статуса check_status() { echo -e "${YELLOW}Статус контейнера:${NC}" cd "$PROJECT_DIR" docker compose ps echo "" read -p "Нажмите Enter для продолжения..." } # Функция пересборки контейнера rebuild_container() { echo -e "${RED}Пересборка контейнера (это займёт несколько минут)...${NC}" read -p "Вы уверены? (y/N): " confirm if [[ $confirm == [yY] ]]; then cd "$PROJECT_DIR" echo -e "${YELLOW}Остановка контейнера...${NC}" docker compose down echo -e "${YELLOW}Пересборка образа...${NC}" docker compose build --no-cache echo -e "${YELLOW}Запуск контейнера...${NC}" docker compose up -d if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Контейнер успешно пересобран и запущен${NC}" else echo -e "${RED}✗ Ошибка пересборки контейнера${NC}" fi else echo -e "${YELLOW}Пересборка отменена${NC}" fi read -p "Нажмите Enter для продолжения..." } # Функция проверки здоровья health_check() { echo -e "${YELLOW}Проверка здоровья API...${NC}" echo "" # Проверка через docker echo -e "${BLUE}1. Проверка через Docker:${NC}" docker exec claudeapi curl -s http://localhost:8001/health | jq . 2>/dev/null || \ docker exec claudeapi curl -s http://localhost:8001/health echo "" # Проверка через внешний URL echo -e "${BLUE}2. Проверка через внешний URL:${NC}" curl -s https://claudeapi.digitizepro.tech/health | jq . 2>/dev/null || \ curl -s https://claudeapi.digitizepro.tech/health echo "" read -p "Нажмите Enter для продолжения..." } # Функция мониторинга ресурсов monitor_resources() { echo -e "${YELLOW}Мониторинг ресурсов (Ctrl+C для выхода)...${NC}" echo "" sleep 2 docker stats claudeapi } # Основной цикл while true; do show_menu read -p "Выберите действие: " choice case $choice in 1) start_container ;; 2) stop_container ;; 3) restart_container ;; 4) view_logs ;; 5) check_status ;; 6) rebuild_container ;; 7) health_check ;; 8) monitor_resources ;; 0) echo -e "${GREEN}Выход...${NC}" exit 0 ;; *) echo -e "${RED}Неверный выбор. Попробуйте снова.${NC}" sleep 2 ;; esac done
Сохраните файл (Ctrl+O, Enter, Ctrl+X)
Сделайте скрипт исполняемым:
chmod +x /opt/claudeapi/scripts/manage.sh
Запуск скрипта управления:
/opt/claudeapi/scripts/manage.sh
Или создайте алиас для удобства:
echo "alias claude-manage='/opt/claudeapi/scripts/manage.sh'" >> ~/.bashrc source ~/.bashrc # Теперь можно запускать просто: claude-manage
3. Настройка аутентификации Claude
У вас есть три варианта аутентификации:
Вариант A: Anthropic API Key (рекомендуется)
- Зарегистрируйтесь на https://console.anthropic.com/
- Создайте новый API ключ
- Откройте файл .env:
nano /opt/claudeapi/.env
- Раскомментируйте и добавьте ваш ключ:
ANTHROPIC_API_KEY=sk-ant-ваш-ключ-здесь
- Сохраните файл (
Ctrl+O,Enter,Ctrl+X)
Вариант B: Локальная подписка (бесплатно)
Шаг 1: Установите Claude CLI на хосте
npm install -g @anthropic-ai/claude-code
Шаг 2: Авторизуйтесь
claude
В интерактивном режиме выполните:
/login
Следуйте инструкциям в браузере для входа.
Шаг 3: Скопируйте credentials
# Проверьте наличие файла ls -la ~/.claude/.credentials.json # Скопируйте его в директорию контейнера cp ~/.claude/.credentials.json /opt/claudeapi/credentials/ # Установите правильные права chmod 600 /opt/claudeapi/credentials/.credentials.json
Вариант C: Аутентификация внутри контейнера
После запуска контейнера:
docker exec -it claudeapi bash claude
Внутри Claude CLI выполните /login и следуйте инструкциям.
4. Сборка и запуск
4.1 Проверка конфигурации
cd /opt/claudeapi docker compose config
Эта команда проверит правильность вашего docker-compose.yml
4.2 Сборка образа
docker compose build
Примечание: Первая сборка может занять 5-10 минут
4.3 Запуск контейнера
docker compose up -d
Флаг -d запускает контейнер в фоновом режиме (detached).
4.4 Проверка статуса
docker compose ps
Ожидаемый вывод:
Name Command State Ports -------------------------------------------------------- claudeapi python3 minimal_se... Up 8001/tcp
4.5 Просмотр логов
docker compose logs -f
Для выхода из просмотра логов нажмите Ctrl+C
5. Тестирование
5.1 Health Check
Локальный (внутри Docker):
docker exec claudeapi curl http://localhost:8001/health
Через Nginx Proxy Manager:
curl https://claudeapi.digitizepro.tech/health
5.2 Получение API ключа
API_KEY=$(grep CLAUDE_API_KEY /opt/claudeapi/.env | cut -d'=' -f2) echo "Ваш API ключ: $API_KEY"
5.3 Тестовый запрос
curl -X POST https://claudeapi.digitizepro.tech/api/v1/chat \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "Привет! Напиши простой Hello World на Java", "user_id": 1 }'
Ожидаемый ответ:
{
"content": "public class HelloWorld {\n public static void main(String[] args) {\n System.out.println(\"Hello, World!\");\n }\n}",
"session_id": "abc-123-xyz",
"cost": 0.001,
"duration_ms": 1500
}
5.4 Тест продолжения сессии
# Используйте session_id из предыдущего ответа SESSION_ID="abc-123-xyz" curl -X POST https://claudeapi.digitizepro.tech/api/v1/chat \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d "{ \"prompt\": \"Добавь комментарии к этому коду\", \"session_id\": \"$SESSION_ID\", \"user_id\": 1 }"
5.5 Красивый вывод с jq
Установите jq для форматированного JSON:
sudo apt install jq
Используйте с curl:
curl -X POST https://claudeapi.digitizepro.tech/api/v1/chat \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt": "Тест", "user_id": 1}' | jq .
5. Управление контейнером
6.1 Использование скрипта управления
Запустите интерактивное меню управления:
/opt/claudeapi/scripts/manage.sh # или если создали алиас: claude-manage
Меню предоставляет следующие опции:
- 1 - Запустить контейнер
- 2 - Остановить контейнер
- 3 - Перезапустить контейнер
- 4 - Просмотр логов
- 5 - Статус контейнера
- 6 - Пересборка контейнера
- 7 - Проверка здоровья (Health Check)
- 8 - Мониторинг ресурсов
- 0 - Выход
6.2 Команды Docker Compose (ручное управление)
Если предпочитаете использовать команды напрямую:
# Перейти в директорию проекта cd /opt/claudeapi # Запустить контейнер docker compose up -d # Остановить контейнер docker compose down # Перезапустить контейнер docker compose restart # Просмотр логов в реальном времени docker compose logs -f # Просмотр последних 50 строк логов docker compose logs --tail=50 # Просмотр статуса docker compose ps # Войти в контейнер docker exec -it claudeapi bash # Удалить контейнер с volumes docker compose down -v
7. Мониторинг и безопасность
7.1 Скрипт мониторинга
nano /opt/claudeapi/scripts/monitor.sh
#!/bin/bash echo "=== Claude API Monitoring ===" echo "" echo "Container Status:" docker ps --filter name=claudeapi --format "table {{.Names}}\t{{.Status}}\t{{.Size}}" echo "" echo "Health Check:" curl -s https://claudeapi.digitizepro.tech/health | jq . echo "" echo "Resource Usage:" docker stats claudeapi --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}" echo "" echo "Recent Logs (last 20 lines):" docker logs claudeapi --tail 20
chmod +x /opt/claudeapi/scripts/monitor.sh
Запуск:
/opt/claudeapi/scripts/monitor.sh
7.2 Создание backup
nano /opt/claudeapi/scripts/backup.sh
#!/bin/bash BACKUP_DIR="/opt/backups/claude-api" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR" tar -czf "$BACKUP_DIR/claude-api-$DATE.tar.gz" \ -C /opt/claudeapi \ .env \ docker-compose.yml \ Dockerfile \ credentials/ \ data/ echo "Backup created: $BACKUP_DIR/claude-api-$DATE.tar.gz" # Удалить старые backup (старше 30 дней) find "$BACKUP_DIR" -name "claude-api-*.tar.gz" -mtime +30 -delete
chmod +x /opt/claudeapi/scripts/backup.sh
Автоматический backup (cron):
crontab -e # Добавьте строку: 0 3 * * * /opt/claudeapi/scripts/backup.sh
7.3 Рекомендации по безопасности
- ✅ Используйте сложный API ключ (32+ символов)
- ✅ Ограничьте доступ по IP в NPM (если возможно)
- ✅ Регулярно обновляйте Docker образ
- ✅ Создавайте backup конфигурации
- ✅ Мониторьте логи на подозрительную активность
- ✅ Используйте HTTPS (через NPM)
- ✅ Ограничьте права доступа к файлам
7. Быстрая справка команд
Интерактивное меню
# Запуск меню управления /opt/claudeapi/scripts/manage.sh # Или через алиас claude-manage
Основные команды Docker Compose
# Перейти в директорию cd /opt/claudeapi # Запуск docker compose up -d # Остановка docker compose down # Перезапуск docker compose restart # Логи docker compose logs -f # Статус docker compose ps # Вход в контейнер docker exec -it claudeapi bash # Health check curl https://claudeapi.digitizepro.tech/health # Пересборка docker compose build --no-cache && docker compose up -d
Полезные алиасы для ~/.bashrc
nano ~/.bashrc
Добавьте в конец файла:
# Claude API shortcuts alias claude-manage='/opt/claudeapi/scripts/manage.sh' alias claude-start='cd /opt/claudeapi && docker compose up -d' alias claude-stop='cd /opt/claudeapi && docker compose down' alias claude-restart='cd /opt/claudeapi && docker compose restart' alias claude-logs='cd /opt/claudeapi && docker compose logs -f' alias claude-status='cd /opt/claudeapi && docker compose ps'
Применить изменения:
source ~/.bashrc
Теперь можно использовать:
claude-manage # Интерактивное меню claude-start # Быстрый запуск claude-logs # Просмотр логов claude-status # Проверка статуса
8. Примеры интеграции
Python
import requests API_URL = "https://claudeapi.digitizepro.tech/api/v1/chat" API_KEY = "your-api-key-here" def ask_claude(prompt, session_id=None): headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } data = {"prompt": prompt, "user_id": 1} if session_id: data["session_id"] = session_id response = requests.post(API_URL, headers=headers, json=data) return response.json() # Использование result = ask_claude("Напиши Hello World на Java") print(result['content'])
Java
import java.net.http.*; import java.net.URI; public class ClaudeClient { private static final String API_URL = "https://claudeapi.digitizepro.tech/api/v1/chat"; private static final String API_KEY = "your-api-key-here"; public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); String json = "{\"prompt\":\"Hello\",\"user_id\":1}"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(API_URL)) .header("Authorization", "Bearer " + API_KEY) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(json)) .build(); HttpResponse<String> response = client.send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println(response.body()); } }
Bash
#!/bin/bash API_URL="https://claudeapi.digitizepro.tech/api/v1/chat" API_KEY="your-api-key-here" curl -X POST "$API_URL" \ -H "Authorization: Bearer $API_KEY" \ -H "Content-Type: application/json" \ -d '{"prompt": "Привет!", "user_id": 1}' | jq .
Заключение
Теперь у вас есть полностью работающий Claude API:
✅ Доступен по адресу: https://claudeapi.digitizepro.tech
✅ Защищён SSL сертификатом
✅ Интегрирован с Nginx Proxy Manager
✅ Работает в Docker контейнере
✅ Имеет автозапуск при загрузке системы
✅ Настроен мониторинг и backup
Что дальше?
- Интегрируйте API в свои приложения
- Настройте регулярный backup
- Мониторьте использование ресурсов
- Экспериментируйте с промптами
Полезные ссылки
- GitHub проекта: https://github.com/vlad29042/claude-api-minimal
- Документация Claude: https://docs.anthropic.com/
- Nginx Proxy Manager: https://nginxproxymanager.com/
Автор: Подготовлено для Nick
Дата: Ноябрь 2024
Версия: 1.0 (Docker + NPM + webproxy)