vm:claudeapi:01-install_docker

Установка Claude API в Docker с Nginx Proxy Manager

# Создать основную директорию
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

cd /opt/claudeapi
git clone https://github.com/vlad29042/claude-api-minimal.git app/

Если git не установлен: sudo apt install git

Шаг 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

Шаг 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)

Шаг 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

КРИТИЧЕСКИ ВАЖНО: Замените ВСТАВЬТЕ_ВАШ_СГЕНЕРИРОВАННЫЙ_КЛЮЧ_СЮДА на реальный сгенерированный ключ!

Создайте единый скрипт управления:

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

У вас есть три варианта аутентификации:

  1. Зарегистрируйтесь на https://console.anthropic.com/
  2. Создайте новый API ключ
  3. Откройте файл .env:
nano /opt/claudeapi/.env
  1. Раскомментируйте и добавьте ваш ключ:
ANTHROPIC_API_KEY=sk-ant-ваш-ключ-здесь
  1. Сохраните файл (Ctrl+O, Enter, Ctrl+X)

Шаг 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

После запуска контейнера:

docker exec -it claudeapi bash
claude

Внутри Claude CLI выполните /login и следуйте инструкциям.


cd /opt/claudeapi
docker compose config

Эта команда проверит правильность вашего docker-compose.yml

docker compose build

Примечание: Первая сборка может занять 5-10 минут

docker compose up -d

Флаг -d запускает контейнер в фоновом режиме (detached).

docker compose ps

Ожидаемый вывод:

    Name              Command          State    Ports
--------------------------------------------------------
claudeapi   python3 minimal_se...   Up      8001/tcp
docker compose logs -f

Для выхода из просмотра логов нажмите Ctrl+C


Локальный (внутри Docker):

docker exec claudeapi curl http://localhost:8001/health

Через Nginx Proxy Manager:

curl https://claudeapi.digitizepro.tech/health
API_KEY=$(grep CLAUDE_API_KEY /opt/claudeapi/.env | cut -d'=' -f2)
echo "Ваш API ключ: $API_KEY"
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
}
# Используйте 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
  }"

Установите 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 .

Запустите интерактивное меню управления:

/opt/claudeapi/scripts/manage.sh
# или если создали алиас:
claude-manage

Меню предоставляет следующие опции:

  • 1 - Запустить контейнер
  • 2 - Остановить контейнер
  • 3 - Перезапустить контейнер
  • 4 - Просмотр логов
  • 5 - Статус контейнера
  • 6 - Пересборка контейнера
  • 7 - Проверка здоровья (Health Check)
  • 8 - Мониторинг ресурсов
  • 0 - Выход

Если предпочитаете использовать команды напрямую:

# Перейти в директорию проекта
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
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
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
  • ✅ Используйте сложный API ключ (32+ символов)
  • ✅ Ограничьте доступ по IP в NPM (если возможно)
  • ✅ Регулярно обновляйте Docker образ
  • ✅ Создавайте backup конфигурации
  • ✅ Мониторьте логи на подозрительную активность
  • ✅ Используйте HTTPS (через NPM)
  • ✅ Ограничьте права доступа к файлам

# Запуск меню управления
/opt/claudeapi/scripts/manage.sh
 
# Или через алиас
claude-manage
# Перейти в директорию
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
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   # Проверка статуса

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'])
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());
    }
}
#!/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

  1. Интегрируйте API в свои приложения
  2. Настройте регулярный backup
  3. Мониторьте использование ресурсов
  4. Экспериментируйте с промптами

Автор: Подготовлено для Nick
Дата: Ноябрь 2024
Версия: 1.0 (Docker + NPM + webproxy)

  • vm/claudeapi/01-install_docker.txt
  • Последнее изменение: 2025/11/25 16:27
  • admin