====== Установка Claude API в Docker с Nginx Proxy Manager ======
===== Содержание =====
* [[#Создание структуры директорий]]
* [[#Создание необходимых файлов]]
* [[#Настройка аутентификации Claude]]
* [[#Сборка и запуск]]
* [[#Тестирование]]
* [[#Управление контейнером]]
* [[#Troubleshooting]]
* [[#Мониторинг и безопасность]]
* [[#Быстрая справка команд]]
----
===== 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 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)