first commit
This commit is contained in:
@@ -0,0 +1,20 @@
|
|||||||
|
lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"
|
||||||
|
|
||||||
|
sudo parted /dev/sdb --script mklabel gpt mkpart xfspart xfs 0% 100%
|
||||||
|
sudo partprobe /dev/sdb
|
||||||
|
sudo mkfs.xfs /dev/sdb1
|
||||||
|
|
||||||
|
|
||||||
|
sudo mkdir -p /BlockVolume1
|
||||||
|
sudo mount /dev/sdb1 /BlockVolume1
|
||||||
|
|
||||||
|
df -h | grep BlockVolume1
|
||||||
|
lsblk
|
||||||
|
|
||||||
|
sudo cp /etc/fstab /etc/fstab.bak
|
||||||
|
UUID=$(sudo blkid -s UUID -o value /dev/sdb1)
|
||||||
|
echo "UUID=$UUID /BlockVolume1 xfs defaults,nofail 1 2" | sudo tee -a /etc/fstab
|
||||||
|
sudo mount -a
|
||||||
|
|
||||||
|
df -h | grep BlockVolume1
|
||||||
|
lsblk
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
sudo apt update
|
||||||
|
sudo apt install -y ca-certificates curl
|
||||||
|
sudo install -m 0755 -d /etc/apt/keyrings
|
||||||
|
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
||||||
|
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||||||
|
|
||||||
|
echo \
|
||||||
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||||||
|
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
|
||||||
|
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
|
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
|
sudo usermod -aG docker eujin
|
||||||
|
newgrp docker
|
||||||
|
|
||||||
|
sudo mkdir -p /etc/docker
|
||||||
|
|
||||||
|
cat <<'EOF' | sudo tee /etc/docker/daemon.json
|
||||||
|
{
|
||||||
|
"data-root": "/BlockVolume1/docker"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo systemctl enable docker
|
||||||
|
sudo systemctl restart docker
|
||||||
|
|
||||||
|
|
||||||
|
sudo systemctl stop docker
|
||||||
|
sudo rsync -aP /var/lib/docker/ /BlockVolume1/docker/
|
||||||
|
sudo systemctl start docker
|
||||||
|
|
||||||
|
docker info | grep "Docker Root Dir"
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
admin 0.0.0.0:2019
|
||||||
|
}
|
||||||
|
|
||||||
|
:80 {
|
||||||
|
handle {
|
||||||
|
respond "Hello from Caddy!" 200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
lejin2000.ooguy.com {
|
||||||
|
handle {
|
||||||
|
reverse_proxy portainer:9000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lejin82.ooguy.com {
|
||||||
|
reverse_proxy openclaw-openclaw-1:8080
|
||||||
|
}
|
||||||
|
|
||||||
|
ejlai.ooguy.com {
|
||||||
|
reverse_proxy litellm:4000
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
services:
|
||||||
|
caddy:
|
||||||
|
image: caddy:latest
|
||||||
|
container_name: caddy
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
- "443:443"
|
||||||
|
- "2019:2019"
|
||||||
|
volumes:
|
||||||
|
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||||
|
- caddy_data:/data
|
||||||
|
- caddy_config:/config
|
||||||
|
networks:
|
||||||
|
- caddy_net
|
||||||
|
|
||||||
|
portainer:
|
||||||
|
image: portainer/portainer-ce:latest
|
||||||
|
container_name: portainer
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "9000:9000"
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- portainer_data:/data
|
||||||
|
networks:
|
||||||
|
- caddy_net
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
caddy_data:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
o: bind
|
||||||
|
device: ./caddy/data
|
||||||
|
|
||||||
|
caddy_config:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
o: bind
|
||||||
|
device: ./caddy/config
|
||||||
|
|
||||||
|
portainer_data:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
o: bind
|
||||||
|
device: ./portainer
|
||||||
|
|
||||||
|
networks:
|
||||||
|
caddy_net:
|
||||||
|
driver: bridge
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
sudo mkdir -p /BlockVolume1/projects
|
||||||
|
sudo chown -R eujin:eujin /BlockVolume1/dockercompose/code-server/projects
|
||||||
|
sudo find /BlockVolume1/dockercompose/code-server/projects -type d -exec chmod 755 {} \;
|
||||||
|
sudo find /BlockVolume1/dockercompose/code-server/projects -type f -exec chmod 644 {} \;
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
services:
|
||||||
|
code-server:
|
||||||
|
image: lscr.io/linuxserver/code-server:latest
|
||||||
|
container_name: code-server
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8443:8443"
|
||||||
|
environment:
|
||||||
|
- PUID=1000
|
||||||
|
- PGID=1000
|
||||||
|
- PASSWORD=lejin2000
|
||||||
|
- SUDO_PASSWORD=lejin2000
|
||||||
|
- DEFAULT_WORKSPACE=/projects
|
||||||
|
- PROXY_DOMAIN=lejin82.ooguy.com
|
||||||
|
- TZ=Asia/Kuala_Lumpur
|
||||||
|
volumes:
|
||||||
|
- /BlockVolume1/dockercompose/code-server/config:/config
|
||||||
|
- /BlockVolume1/dockercompose/code-server/projects:/projects
|
||||||
|
networks:
|
||||||
|
- caddy_caddy_net
|
||||||
|
|
||||||
|
|
||||||
|
networks:
|
||||||
|
caddy_caddy_net:
|
||||||
|
external: true
|
||||||
|
name: caddy_caddy_net
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
OPENAI_BASE_URL=http://ollama:11434/v1
|
||||||
|
OPENAI_API_KEY=ollama
|
||||||
|
LLM_MODEL=qwen3.5:0.8b
|
||||||
|
TERMINAL_LOCAL_PERSISTENT=true
|
||||||
|
TZ=Asia/Kuala_Lumpur
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
|
VIRTUAL_ENV=/opt/venv \
|
||||||
|
PATH=/opt/venv/bin:/root/.local/bin:$PATH
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
git curl ca-certificates build-essential ffmpeg ripgrep \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
|
||||||
|
&& ln -sf /root/.local/bin/uv /usr/local/bin/uv
|
||||||
|
|
||||||
|
WORKDIR /opt
|
||||||
|
RUN git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git
|
||||||
|
|
||||||
|
WORKDIR /opt/hermes-agent
|
||||||
|
RUN uv venv /opt/venv --python 3.11 \
|
||||||
|
&& uv pip install --python /opt/venv/bin/python -e ".[all]" \
|
||||||
|
&& mkdir -p /root/.hermes/{cron,sessions,logs,memories,skills,pairing,hooks,image_cache,audio_cache,whatsapp/session} \
|
||||||
|
&& cp cli-config.yaml.example /root/.hermes/config.yaml \
|
||||||
|
&& touch /root/.hermes/.env
|
||||||
|
|
||||||
|
WORKDIR /workspace
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
services:
|
||||||
|
hermes:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
container_name: hermes-agent
|
||||||
|
restart: unless-stopped
|
||||||
|
init: true
|
||||||
|
working_dir: /workspace
|
||||||
|
env_file:
|
||||||
|
- ./.env
|
||||||
|
volumes:
|
||||||
|
- hermes_data:/root/.hermes
|
||||||
|
- ./workspace:/workspace
|
||||||
|
networks:
|
||||||
|
- caddy_caddy_net
|
||||||
|
stdin_open: true
|
||||||
|
tty: true
|
||||||
|
command: ["sleep", "infinity"]
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
hermes_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
caddy_caddy_net:
|
||||||
|
external: true
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
mkdir -p ~/hermes-prod/workspace
|
||||||
|
cd ~/hermes-prod
|
||||||
|
|
||||||
|
sudo docker compose -f docker-compose.yml up -d --build
|
||||||
|
|
||||||
|
docker exec -it hermes-agent hermes doctor
|
||||||
|
docker exec -it hermes-agent hermes status
|
||||||
|
docker exec -it hermes-agent hermes chat -q "Hello, confirm you are connected to Ollama"
|
||||||
|
|
||||||
|
docker exec -it hermes-agent bash -lc 'curl -s http://ollama:11434/api/tags'
|
||||||
|
|
||||||
|
## install
|
||||||
|
docker exec -it hermes-agent bash
|
||||||
|
cd /opt/hermes-agent
|
||||||
|
git submodule update --init --recursive
|
||||||
|
uv pip install -e "./tinker-atropos"
|
||||||
|
hermes doctor
|
||||||
|
|
||||||
|
docker exec -it hermes-agent hermes chat \
|
||||||
|
--provider custom \
|
||||||
|
--model qwen3.5:0.8b \
|
||||||
|
-q "Reply with exactly: connected"
|
||||||
|
|
||||||
|
sudo docker exec -it hermes-agent hermes chat --provider auto -m qwen3.5:0.8b -q "Reply with exactly: connected"
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# LiteLLM Stack — .env.example
|
||||||
|
# Copy to .env and fill in values
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# ── Postgres (DB for UI, users, virtual keys, spend) ─────────────────────────
|
||||||
|
POSTGRES_DB=litellm
|
||||||
|
POSTGRES_USER=llmproxy
|
||||||
|
POSTGRES_PASSWORD=lejin2000
|
||||||
|
|
||||||
|
# ── LiteLLM Logging ──────────────────────────────────────────────────────────
|
||||||
|
LITELLM_LOG=INFO
|
||||||
|
|
||||||
|
# ── Admin UI / Security ──────────────────────────────────────────────────────
|
||||||
|
# Master key used by LiteLLM for admin auth (UI + admin APIs).
|
||||||
|
# Must start with "sk-" and match general_settings.master_key.
|
||||||
|
LITELLM_MASTER_KEY=sk-lejin2000
|
||||||
|
|
||||||
|
# Salt key used to encrypt provider API keys & secrets in the DB.
|
||||||
|
# Generate once, keep secret, NEVER change after first run (or you lose decryption).
|
||||||
|
LITELLM_SALT_KEY=sk-lejin2000
|
||||||
|
|
||||||
|
# Admin UI credentials (fallback / simple login) per UI quick start docs.
|
||||||
|
UI_USERNAME=admin
|
||||||
|
UI_PASSWORD=lejin2000
|
||||||
|
|
||||||
|
# Disable admin UI? (set True if you want API-only mode)
|
||||||
|
DISABLE_ADMIN_UI=False
|
||||||
|
|
||||||
|
# ── Provider API keys ────────────────────────────────────────────────────────
|
||||||
|
# OpenAI
|
||||||
|
#OPENAI_API_KEY=sk-...
|
||||||
|
|
||||||
|
# Anthropic
|
||||||
|
# ANTHROPIC_API_KEY=sk-ant-...
|
||||||
|
|
||||||
|
# Azure OpenAI
|
||||||
|
AZURE_API_KEY=1kUm7k9xWjSKv9BkGTODlUKUYelonOKovMORtGHPpntJ8WhkkomGJQQJ99CCACHYHv6XJ3w3AAAAACOGF9jZ
|
||||||
|
AZURE_API_BASE=https://eujin-mmt0hj4x-eastus2.cognitiveservices.azure.com/
|
||||||
|
AZURE_API_VERSION=2024-12-01-preview
|
||||||
|
|
||||||
|
# Groq
|
||||||
|
# GROQ_API_KEY=gsk_...
|
||||||
|
|
||||||
|
# OpenRouter
|
||||||
|
# OPENROUTER_API_KEY=sk-or-...
|
||||||
|
|
||||||
|
# Google Gemini
|
||||||
|
# GEMINI_API_KEY=AIza...
|
||||||
|
|
||||||
|
# HuggingFace
|
||||||
|
# HUGGINGFACE_API_KEY=hf_...
|
||||||
|
|
||||||
|
# ── Optional: allow Caddy to forward headers, etc. (no special vars needed) ─
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# LiteLLM Proxy Config (DB-backed UI, no Redis)
|
||||||
|
# - Single-node deployment (1 CPU / 2 GB RAM)
|
||||||
|
# - Postgres used for:
|
||||||
|
# - Users / login
|
||||||
|
# - Virtual keys & teams
|
||||||
|
# - Spend tracking (optional)
|
||||||
|
# - No Redis caching (cache: false)
|
||||||
|
#
|
||||||
|
# Docs:
|
||||||
|
# https://docs.litellm.ai/docs/proxy/configs
|
||||||
|
# https://docs.litellm.ai/docs/proxy/config_settings
|
||||||
|
# https://docs.litellm.ai/docs/proxy/virtual_keys
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
# Models exposed by the proxy
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
model_list:
|
||||||
|
# --- OpenAI examples -------------------------------------------------------
|
||||||
|
#- model_name: gpt-4o
|
||||||
|
# litellm_params:
|
||||||
|
# model: openai/gpt-4o
|
||||||
|
# api_key: os.environ/OPENAI_API_KEY
|
||||||
|
|
||||||
|
#- model_name: gpt-4o-mini
|
||||||
|
# litellm_params:
|
||||||
|
# model: openai/gpt-4o-mini
|
||||||
|
# api_key: os.environ/OPENAI_API_KEY
|
||||||
|
|
||||||
|
# --- Anthropic example -----------------------------------------------------
|
||||||
|
# - model_name: claude-3-5-sonnet
|
||||||
|
# litellm_params:
|
||||||
|
# model: anthropic/claude-3-5-sonnet-20241022
|
||||||
|
# api_key: os.environ/ANTHROPIC_API_KEY
|
||||||
|
|
||||||
|
# --- Groq example ----------------------------------------------------------
|
||||||
|
# - model_name: groq-llama-3.3-70b
|
||||||
|
# litellm_params:
|
||||||
|
# model: groq/llama-3.3-70b-versatile
|
||||||
|
# api_key: os.environ/GROQ_API_KEY
|
||||||
|
|
||||||
|
# --- Azure OpenAI example --------------------------------------------------
|
||||||
|
# - model_name: azure-gpt-4o
|
||||||
|
# litellm_params:
|
||||||
|
# model: azure/my_azure_deployment
|
||||||
|
# api_base: os.environ/AZURE_API_BASE
|
||||||
|
# api_key: os.environ/AZURE_API_KEY
|
||||||
|
# api_version: "2025-01-01-preview"
|
||||||
|
|
||||||
|
# --- Local Ollama example --------------------------------------------------
|
||||||
|
# - model_name: ollama-llama3
|
||||||
|
# litellm_params:
|
||||||
|
# model: ollama/llama3
|
||||||
|
# api_base: http://host.docker.internal:11434
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
# Core LiteLLM behavior (no Redis cache)
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
litellm_settings:
|
||||||
|
# Retries & timeouts
|
||||||
|
num_retries: 2
|
||||||
|
request_timeout: 60 # seconds
|
||||||
|
|
||||||
|
# Disable caching entirely to avoid Redis
|
||||||
|
cache: false # <- IMPORTANT: no Redis in your stack
|
||||||
|
|
||||||
|
# Drop unsupported provider-specific params instead of erroring
|
||||||
|
drop_params: true
|
||||||
|
|
||||||
|
# If you later enable caching, add cache_params here with Redis config.
|
||||||
|
# cache_params:
|
||||||
|
# type: redis
|
||||||
|
# host: litellm-redis
|
||||||
|
# port: 6379
|
||||||
|
# password: os.environ/REDIS_PASSWORD
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
# Router settings (all in-memory, single-node)
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
router_settings:
|
||||||
|
routing_strategy: "simple-shuffle" # simple-shuffle | least-busy | latency-based-routing
|
||||||
|
num_retries: 1
|
||||||
|
timeout: 30
|
||||||
|
retry_after: 5
|
||||||
|
|
||||||
|
# No Redis routing / transaction buffer on this small single-node setup
|
||||||
|
# redis_host: litellm-redis
|
||||||
|
# redis_port: 6379
|
||||||
|
# redis_password: os.environ/REDIS_PASSWORD
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
# General settings (DB-backed UI, no Redis)
|
||||||
|
# -----------------------------------------------------------------------------#
|
||||||
|
general_settings:
|
||||||
|
# Admin master key (used for UI + admin API).
|
||||||
|
# Must match LITELLM_MASTER_KEY from .env and start with "sk-".
|
||||||
|
master_key: os.environ/LITELLM_MASTER_KEY
|
||||||
|
|
||||||
|
# Postgres connection (from DATABASE_URL env var).
|
||||||
|
# Required for:
|
||||||
|
# - /ui login and user management
|
||||||
|
# - virtual keys
|
||||||
|
# - spend tracking
|
||||||
|
database_url: os.environ/DATABASE_URL
|
||||||
|
|
||||||
|
# Store model definitions in DB (used by the UI)
|
||||||
|
store_model_in_db: true
|
||||||
|
|
||||||
|
# Telemetry & metrics
|
||||||
|
telemetry: false
|
||||||
|
enable_prometheus: true
|
||||||
|
|
||||||
|
# On a small box, you may want to reduce some DB-heavy features.
|
||||||
|
# You can still track spend, but disable some advanced cost mgmt.
|
||||||
|
disable_end_user_cost_tracking: false
|
||||||
|
disable_reset_budget: false
|
||||||
|
|
||||||
|
# No Redis transaction buffer here
|
||||||
|
# use_redis_transaction_buffer: false
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# Prometheus Configuration — scrapes LiteLLM /metrics
|
||||||
|
# =============================================================================
|
||||||
|
global:
|
||||||
|
scrape_interval: 15s # how often to scrape targets
|
||||||
|
evaluation_interval: 15s # how often to evaluate rules
|
||||||
|
scrape_timeout: 10s
|
||||||
|
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: "litellm"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["litellm:4000"] # internal service name + port
|
||||||
|
metrics_path: "/metrics"
|
||||||
|
scrape_interval: 15s
|
||||||
|
|
||||||
|
- job_name: "prometheus"
|
||||||
|
static_configs:
|
||||||
|
- targets: ["localhost:9090"]
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
name: litellm-stack
|
||||||
|
|
||||||
|
services:
|
||||||
|
litellm:
|
||||||
|
image: ghcr.io/berriai/litellm:main-stable
|
||||||
|
container_name: litellm
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Caddy will reverse proxy to this container on caddy_caddy_net.
|
||||||
|
# For local debugging without Caddy, you can uncomment:
|
||||||
|
# ports:
|
||||||
|
# - "4000:4000"
|
||||||
|
|
||||||
|
command: ["--config", "/app/config.yaml", "--port", "4000", "--num_workers", "1"]
|
||||||
|
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
|
||||||
|
environment:
|
||||||
|
# Logging
|
||||||
|
LITELLM_LOG: "${LITELLM_LOG:-INFO}"
|
||||||
|
|
||||||
|
# DB connection string used by LiteLLM for UI, users, virtual keys, spend, etc.
|
||||||
|
# LiteLLM reads this via general_settings.database_url: os.environ/DATABASE_URL
|
||||||
|
DATABASE_URL: "postgresql://${POSTGRES_USER:-llmproxy}:${POSTGRES_PASSWORD:-dbpassword9090}@litellm-db:5432/${POSTGRES_DB:-litellm}"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- ./config/litellm_config.yaml:/app/config.yaml:ro
|
||||||
|
- litellm_logs:/app/logs
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
litellm-db:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- caddy_caddy_net
|
||||||
|
|
||||||
|
healthcheck:
|
||||||
|
# LiteLLM image is minimal (no curl/wget) → use Python
|
||||||
|
test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')\""]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 5
|
||||||
|
start_period: 120s
|
||||||
|
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "20m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
litellm-db:
|
||||||
|
image: postgres:16-alpine
|
||||||
|
container_name: litellm-db
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: "${POSTGRES_DB:-litellm}"
|
||||||
|
POSTGRES_USER: "${POSTGRES_USER:-llmproxy}"
|
||||||
|
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:-dbpassword9090}"
|
||||||
|
PGDATA: /var/lib/postgresql/data/pgdata
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- litellm_postgres_data:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
# No host port mapped → only other containers on the network can reach it.
|
||||||
|
# For debugging from host, you can temporarily uncomment:
|
||||||
|
# ports:
|
||||||
|
# - "127.0.0.1:5432:5432"
|
||||||
|
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -d ${POSTGRES_DB:-litellm} -U ${POSTGRES_USER:-llmproxy}"]
|
||||||
|
interval: 5s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
start_period: 10s
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- caddy_caddy_net
|
||||||
|
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
# External network created/owned by your Caddy stack
|
||||||
|
caddy_caddy_net:
|
||||||
|
external: true
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
litellm_logs:
|
||||||
|
name: litellm_logs
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
litellm_postgres_data:
|
||||||
|
name: litellm_postgres_data
|
||||||
|
driver: local
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
services:
|
||||||
|
ollama:
|
||||||
|
image: ollama/ollama:latest
|
||||||
|
container_name: ollama
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
# Ensures Ollama listens on all network interfaces so Caddy can route to it
|
||||||
|
- OLLAMA_HOST=0.0.0.0
|
||||||
|
# Prevents Ollama from trying to load models into VRAM, forcing CPU mode
|
||||||
|
- OLLAMA_NOHIST=1
|
||||||
|
# Optional: Tune these based on your server's available resources
|
||||||
|
- OLLAMA_NUM_PARALLEL=1 # Process one request at a time to prevent CPU thrashing
|
||||||
|
- OLLAMA_KEEP_ALIVE=5m # Keep the model in memory for 5 mins after a request
|
||||||
|
- OLLAMA_CONTEXT_LENGTH=1024 # Limit the context length to reduce memory usage
|
||||||
|
cpus: 0.50
|
||||||
|
mem_limit: 2500m
|
||||||
|
mem_reservation: 2g
|
||||||
|
volumes:
|
||||||
|
# Persistent storage for downloaded LLM models
|
||||||
|
- ollama_data:/root/.ollama
|
||||||
|
networks:
|
||||||
|
- caddy_caddy_net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
caddy_caddy_net :
|
||||||
|
external: true
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
ollama_data:
|
||||||
|
name: ollama_data
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
docker compose exec ollama bash
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
PORT=8080
|
||||||
|
|
||||||
|
AUTH_USERNAME=admin
|
||||||
|
AUTH_PASSWORD=P@ssw0rd123!@#
|
||||||
|
|
||||||
|
OPENCLAW_GATEWAY_TOKEN=ogt_cc2a54883345b1dfc409f716b08d4104d6dfd94cea47da80ee99c98fda1a1384
|
||||||
|
|
||||||
|
TZ=Asia/Kuala_Lumpur
|
||||||
|
|
||||||
|
|
||||||
|
OPENROUTER_API_KEY= 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
|
||||||
|
OPENCLAW_PRIMARY_MODEL=openrouter/free
|
||||||
|
|
||||||
|
# Optional alternatives
|
||||||
|
# OPENAI_API_KEY=
|
||||||
|
# ANTHROPIC_API_KEY=
|
||||||
|
# OPENCODE_API_KEY=replace-with-your-key
|
||||||
|
# GEMINI_API_KEY=
|
||||||
|
# GROQ_API_KEY=
|
||||||
|
# OLLAMA_BASE_URL=http://host.docker.internal:11434
|
||||||
|
|
||||||
|
TELEGRAM_BOT_TOKEN=8602405814:AAF09-zauk8VnPYpRw9GNIwCCMFJYoMz6vI
|
||||||
|
TELEGRAM_DM_POLICY=pairing
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
|
||||||
|
########################### skills/brevo/SKILL.md
|
||||||
|
|
||||||
|
---
|
||||||
|
name: brevo
|
||||||
|
description: Manage Brevo contacts, lists, transactional emails, and campaigns.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Brevo Email Marketing API
|
||||||
|
|
||||||
|
Use this skill when you need to manage Brevo contacts, lists, transactional emails, and campaigns.
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
Use this shell pattern:
|
||||||
|
`BREVO_KEY=$(cat ~/.config/brevo/api_key)`
|
||||||
|
|
||||||
|
All Brevo API requests require:
|
||||||
|
`api-key: $BREVO_KEY`
|
||||||
|
|
||||||
|
## Base URL
|
||||||
|
`https://api.brevo.com/v3`
|
||||||
|
|
||||||
|
## Common endpoints
|
||||||
|
- Create contact: `POST /contacts`
|
||||||
|
- Get contact: `GET /contacts/{email}`
|
||||||
|
- Update contact: `PUT /contacts/{email}`
|
||||||
|
- List contacts: `GET /contacts?limit=50&offset=0`
|
||||||
|
- Get all lists: `GET /contacts/lists`
|
||||||
|
- Add contacts to list: `POST /contacts/lists/{listId}/contacts/add`
|
||||||
|
- Send transactional email: `POST /smtp/email`
|
||||||
|
- Get templates: `GET /smtp/templates`
|
||||||
|
|
||||||
|
## Best practices
|
||||||
|
- Always check blacklisted or unsubscribed contacts before importing.
|
||||||
|
- Use `updateEnabled: true` when creating contacts.
|
||||||
|
- Prefer templates for transactional emails.
|
||||||
|
- Store list IDs in config, not hardcoded prompts.
|
||||||
|
|
||||||
|
########################### skills/brevo/SKILL.md
|
||||||
|
|
||||||
|
|
||||||
|
##########################/data/state/.config/brevo/api_key
|
||||||
|
{
|
||||||
|
"skills": {
|
||||||
|
"entries": {
|
||||||
|
"brevo": {
|
||||||
|
"enabled": true,
|
||||||
|
"env": {
|
||||||
|
"BREVO_KEY": "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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
##########################/data/state/.config/brevo/api_key
|
||||||
|
|
||||||
|
export BREVO_KEY="$(cat ~/.config/brevo/api_key)"
|
||||||
|
|
||||||
|
curl "https://api.brevo.com/v3/account" \
|
||||||
|
-H "api-key: $BREVO_KEY"
|
||||||
|
|
||||||
|
curl "https://api.brevo.com/v3/contacts/lists?limit=50" \
|
||||||
|
-H "api-key: $BREVO_KEY"
|
||||||
|
|
||||||
|
################################### config
|
||||||
|
📧 Brevo Email Configuration
|
||||||
|
|
||||||
|
SMTP Relay
|
||||||
|
|
||||||
|
• Server: smtp-relay.brevo.com
|
||||||
|
• Port: 587
|
||||||
|
• Login: a5d823001@smtp-brevo.com
|
||||||
|
• Password: xsmtpsib-dc1bd72ebb127d5b026e510adeaa2261b3044585afaef2fe0c12b7868beaf445-eQi9LSnFiKX6WXyg
|
||||||
|
|
||||||
|
API (v3)
|
||||||
|
|
||||||
|
• Base URL: https://api.brevo.com/v3
|
||||||
|
• API Key: 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
|
||||||
|
|
||||||
|
Test Send (Working)
|
||||||
|
|
||||||
|
• Sender: eujin.lai.82@gmail.com
|
||||||
|
• Recipient: lejin2000@hotmail.com
|
||||||
|
• Last Message ID: <202603300718.31101727365@smtp-relay.mailin.fr>
|
||||||
|
• Status: ✅ Verified
|
||||||
|
|
||||||
|
Reusable Scripts
|
||||||
|
|
||||||
|
• send_brevo_api.py: Basic test
|
||||||
|
• send_test_email_custom.py: Custom to/from
|
||||||
|
|
||||||
|
Notes
|
||||||
|
|
||||||
|
• Stored in /data/state/.config/brevo/api_key for secure access
|
||||||
|
• Local backup: /data/workspace/MEMORY.md and /data/workspace/brevo_notes.md
|
||||||
|
|
||||||
|
########################################
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
services:
|
||||||
|
openclaw:
|
||||||
|
image: coollabsio/openclaw:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
PORT: "${PORT:-8080}"
|
||||||
|
AUTH_USERNAME: "${AUTH_USERNAME}"
|
||||||
|
AUTH_PASSWORD: "${AUTH_PASSWORD}"
|
||||||
|
OPENCLAW_GATEWAY_TOKEN: "${OPENCLAW_GATEWAY_TOKEN}"
|
||||||
|
OPENROUTER_API_KEY: "${OPENROUTER_API_KEY}"
|
||||||
|
OPENCLAW_PRIMARY_MODEL: "${OPENCLAW_PRIMARY_MODEL}"
|
||||||
|
BROWSER_CDP_URL: "http://browser:9223"
|
||||||
|
BROWSER_DEFAULT_PROFILE: "openclaw"
|
||||||
|
BROWSER_EVALUATE_ENABLED: "true"
|
||||||
|
OPENCLAW_STATE_DIR: "/data/.openclaw"
|
||||||
|
OPENCLAW_WORKSPACE_DIR: "/data/workspace"
|
||||||
|
OPENCLAW_CONFIG_JSON: '{"gateway":{"mode":"local"}}'
|
||||||
|
volumes:
|
||||||
|
- openclaw-data:/data
|
||||||
|
depends_on:
|
||||||
|
- browser
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
- caddy_caddy_net
|
||||||
|
# Optional: only keep this if you also want direct host access for testing
|
||||||
|
# ports:
|
||||||
|
# - "${PORT:-8080}:${PORT:-8080}"
|
||||||
|
|
||||||
|
browser:
|
||||||
|
image: coollabsio/openclaw-browser:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
PUID: "1000"
|
||||||
|
PGID: "1000"
|
||||||
|
TZ: "${TZ:-Asia/Kuala_Lumpur}"
|
||||||
|
CHROME_CLI: "--remote-debugging-port=9222"
|
||||||
|
volumes:
|
||||||
|
- browser-data:/config
|
||||||
|
shm_size: 2g
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
openclaw-data:
|
||||||
|
browser-data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
internal:
|
||||||
|
driver: bridge
|
||||||
|
caddy_caddy_net:
|
||||||
|
external: true
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
####################### /data/state/openclaw.json
|
||||||
|
|
||||||
|
"messages": {
|
||||||
|
"tts": {
|
||||||
|
"auto": "inbound",
|
||||||
|
"provider": "elevenlabs",
|
||||||
|
"providers": {
|
||||||
|
"elevenlabs": {
|
||||||
|
"apiKey": "cd1d07445c67ac457d87ab44d0a677fe684810f6ea8923944147939d7f5a7427",
|
||||||
|
"voiceId": "tMvyQtpCVQ0DkixuYm6J",
|
||||||
|
"modelId": "eleven_multilingual_v2",
|
||||||
|
"baseUrl": "https://api.elevenlabs.io",
|
||||||
|
"languageCode": "en",
|
||||||
|
"voiceSettings": {
|
||||||
|
"stability": 0.5,
|
||||||
|
"similarityBoost": 0.75,
|
||||||
|
"style": 0.0,
|
||||||
|
"useSpeakerBoost": true,
|
||||||
|
"speed": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
###############################
|
||||||
|
|
||||||
|
export ELEVENLABS_API_KEY=cd1d07445c67ac457d87ab44d0a677fe684810f6ea8923944147939d7f5a7427
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
############ /data/workspace/skills/notion/SKILL.md
|
||||||
|
---
|
||||||
|
name: notion
|
||||||
|
description: Work with Notion pages and databases via the official Notion API.
|
||||||
|
homepage: https://developers.notion.com
|
||||||
|
metadata:
|
||||||
|
clawdbot:
|
||||||
|
emoji: 🧠
|
||||||
|
requires:
|
||||||
|
env:
|
||||||
|
- NOTION_API_KEY
|
||||||
|
install:
|
||||||
|
- id: node
|
||||||
|
kind: note
|
||||||
|
label: "Requires notion-cli (Node.js) or notion-cli-py (Python). See docs below."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Notion
|
||||||
|
|
||||||
|
This skill lets the agent work with **Notion pages and databases** using the official Notion API.
|
||||||
|
|
||||||
|
The skill is declarative: it documents **safe, recommended operations** and assumes a local CLI
|
||||||
|
(`notion-cli`) that actually performs API calls.
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
- Create a Notion Integration at https://www.notion.so/my-integrations
|
||||||
|
- Copy the Internal Integration Token.
|
||||||
|
- Export it as:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export NOTION_API_KEY=secret_xxx
|
||||||
|
```
|
||||||
|
|
||||||
|
Share the integration with the pages or databases you want to access.
|
||||||
|
Unshared content is invisible to the API.
|
||||||
|
|
||||||
|
## Profiles (personal / work)
|
||||||
|
|
||||||
|
You may define multiple profiles (e.g. personal, work) via env or config.
|
||||||
|
|
||||||
|
Default profile: personal
|
||||||
|
|
||||||
|
Override via:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export NOTION_PROFILE=work
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pages
|
||||||
|
|
||||||
|
**Read page:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli page get <page_id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Append blocks:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli block append <page_id> --markdown "..."
|
||||||
|
```
|
||||||
|
|
||||||
|
Prefer appending over rewriting content.
|
||||||
|
|
||||||
|
**Create page:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli page create --parent <page_id> --title "..."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Databases
|
||||||
|
|
||||||
|
**Inspect schema:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli db get <database_id>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Query database:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli db query <database_id> --filter <json> --sort <json>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create row:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli page create --database <database_id> --props <json>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Update row:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli page update <page_id> --props <json>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Schema changes (advanced)
|
||||||
|
|
||||||
|
Always inspect diffs before applying schema changes.
|
||||||
|
|
||||||
|
Never modify database schema without explicit confirmation.
|
||||||
|
|
||||||
|
Recommended flow:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
notion-cli db schema diff <database_id> --desired <json>
|
||||||
|
notion-cli db schema apply <database_id> --desired <json>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Safety notes
|
||||||
|
|
||||||
|
- Notion API is rate-limited; batch carefully.
|
||||||
|
- Prefer append and updates over destructive operations.
|
||||||
|
- IDs are opaque; store them explicitly, do not infer from URLs.
|
||||||
|
|
||||||
|
############ /data/workspace/skills/notion/SKILL.md
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
sudo docker exec -it openclaw-openclaw-1 /bin/bash
|
||||||
|
docker exec -it openclaw /bin/bash
|
||||||
|
|
||||||
|
docker exec openclaw openclaw config set gateway.auth.token "ogt_cc2a54883345b1dfc409f716b08d4104d6dfd94cea47da80ee99c98fda1a1384"
|
||||||
|
|
||||||
|
docker exec openclaw openclaw config set agents.defaults.model.primary "openrouter/free"
|
||||||
|
docker exec openclaw openclaw config get agents.defaults.model.primary
|
||||||
|
|
||||||
|
docker exec openclaw openclaw config set gateway.controlUi.allowInsecureAuth false
|
||||||
|
|
||||||
|
docker compose logs openclaw --tail=25
|
||||||
|
|
||||||
|
docker exec -it openclaw openclaw onboard --auth-choice gemini-api-key
|
||||||
|
|
||||||
|
# Step 1 — List pending pairing requests first
|
||||||
|
docker exec -it openclaw openclaw pairing list telegram
|
||||||
|
|
||||||
|
# Step 2 — Approve with your code
|
||||||
|
docker exec -it openclaw openclaw pairing approve telegram PW864DGY
|
||||||
|
|
||||||
|
docker exec -it --user root openclaw bash -c "apt-get update && apt-get install -y at cron"
|
||||||
|
docker exec -it --user root openclaw bash -c "apt-get update && apt-get install -y sh"
|
||||||
|
|
||||||
|
|
||||||
|
### use nvidia
|
||||||
|
# Set NVIDIA API key
|
||||||
|
docker exec openclaw openclaw config set models.providers.nvidia.baseUrl "https://integrate.api.nvidia.com/v1"
|
||||||
|
docker exec openclaw openclaw config set models.providers.nvidia.apiKey "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"
|
||||||
|
docker exec openclaw openclaw config set models.providers.nvidia.api "openai-completions"
|
||||||
|
|
||||||
|
# Set as primary model
|
||||||
|
docker exec openclaw openclaw config set agents.defaults.model.primary "nvidia/meta/llama-4-scout-17b-16e-instruct"
|
||||||
|
|
||||||
|
|
||||||
|
# If accessing via IP
|
||||||
|
docker exec openclaw openclaw config set gateway.controlUi.allowedOrigins '["*"]'
|
||||||
|
|
||||||
|
# OR specific domain (more secure)
|
||||||
|
docker exec openclaw openclaw config set gateway.controlUi.allowedOrigins '["https://lejin82.ooguy.com/", "http://openclaw:8080"]'
|
||||||
|
|
||||||
|
http://ollama:11434
|
||||||
|
|
||||||
|
openclaw configure
|
||||||
|
openclaw gateway restart
|
||||||
|
openclaw onboard
|
||||||
|
|
||||||
|
openclaw models status
|
||||||
|
|
||||||
|
# remove heartbeat
|
||||||
|
openclaw config set agents.defaults.heartbeat.every "0m"
|
||||||
|
openclaw config set channels.defaults.heartbeat.showOk false
|
||||||
|
openclaw config set channels.defaults.heartbeat.showAlerts false
|
||||||
|
openclaw config set channels.defaults.heartbeat.useIndicator false
|
||||||
|
openclaw gateway restart
|
||||||
|
|
||||||
|
|
||||||
|
openclaw config set gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback true
|
||||||
|
openclaw gateway restart
|
||||||
|
|
||||||
|
openclaw skills list --eligible
|
||||||
|
|
||||||
|
openclaw config set gateway.bind lan
|
||||||
|
openclaw gateway status
|
||||||
|
|
||||||
|
openclaw status
|
||||||
|
|
||||||
|
openclaw config set gateway.trustedProxies '["127.0.0.1","::1"]'
|
||||||
|
openclaw config set channels.telegram.groupAllowFrom '[795409110]'
|
||||||
|
|
||||||
|
openclaw devices list
|
||||||
|
openclaw devices approve 30310d90-e843-48b8-a32c-f44a73c94409
|
||||||
|
|
||||||
|
openclaw config set gateway.mode local
|
||||||
|
openclaw doctor --fix
|
||||||
|
openclaw gateway probe
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
TAVILY_API_KEY=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
|
||||||
|
|
||||||
|
export TAVILY_API_KEY="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"
|
||||||
|
|
||||||
|
"tavily-search": {
|
||||||
|
"enabled": true,
|
||||||
|
"apiKey": "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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
centos-openclaw:
|
||||||
|
image: quay.io/centos/centos:stream9
|
||||||
|
container_name: centos-openclaw
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- caddy_caddy_net
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "18789:18789"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- openclaw_data:/root/openclaw
|
||||||
|
|
||||||
|
command: /bin/bash -c "tail -f /dev/null"
|
||||||
|
volumes:
|
||||||
|
openclaw_data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
caddy_caddy_net:
|
||||||
|
external: true
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
docker compose exec centos-openclaw bash
|
||||||
|
|
||||||
|
docker exec -it centos-openclaw /bin/bash
|
||||||
|
|
||||||
|
openclaw config set gateway.controlUi.allowedOrigins '["https://lejin82.ooguy.com/"]'
|
||||||
|
|
||||||
|
openclaw config set gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback true
|
||||||
|
openclaw gateway restart
|
||||||
|
|
||||||
|
openclaw devices list
|
||||||
|
openclaw devices approve <THE_DEVICE_ID>
|
||||||
|
|
||||||
|
Notion
|
||||||
|
mkdir -p ~/.config/notion
|
||||||
|
echo "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" > ~/.config/notion/api_key
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
|
||||||
|
scp -i /home/eujin/.azuressh/vm-data-lej002_key.pem -r /mnt/d/WindowsPartition/AzureVM/dockercompose/caddy eujin@104.214.184.38:/home/eujin/BlockVolume1/dockercompose/
|
||||||
|
|
||||||
|
scp -i /home/eujin/.azuressh/vm-data-lej002_key.pem -r /mnt/d/WindowsPartition/AzureVM/dockercompose/openclaw eujin@104.214.184.38:/home/eujin/BlockVolume1/dockercompose/
|
||||||
|
|
||||||
|
scp -i /home/eujin/.azuressh/vm-data-lej002_key.pem -r /mnt/d/WindowsPartition/AzureVM/dockercompose/openclawinstall eujin@104.214.184.38:/home/eujin/BlockVolume1/dockercompose/
|
||||||
|
|
||||||
|
scp -i /home/eujin/.azuressh/vm-data-lej002_key.pem -r /mnt/d/WindowsPartition/AzureVM/dockercompose/ollama eujin@104.214.184.38:/home/eujin/BlockVolume1/dockercompose/
|
||||||
|
|
||||||
|
scp -i /home/eujin/.azuressh/vm-data-lej002_key.pem -r /mnt/d/WindowsPartition/AzureVM/dockercompose/hermes eujin@104.214.184.38:/home/eujin/BlockVolume1/dockercompose/
|
||||||
|
|
||||||
|
scp -i /home/eujin/.azuressh/vm-data-lej002_key.pem -r /mnt/d/WindowsPartition/AzureVM/dockercompose/litellm eujin@104.214.184.38:/home/eujin/BlockVolume1/dockercompose/
|
||||||
|
|
||||||
|
#Remote
|
||||||
|
sudo chown -R eujin:eujin /BlockVolume1/dockercompose
|
||||||
|
sudo chown eujin:eujin /BlockVolume1/dockercompose
|
||||||
|
sudo chmod 700 /BlockVolume1/dockercompose
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ssh -i /home/eujin/.azuressh/vm-data-lej002_key.pem eujin@104.214.184.38
|
||||||
|
|
||||||
|
chmod 400 /home/eujin/.azuressh/vm-data-lej002_key.pem
|
||||||
|
|
||||||
|
portainer
|
||||||
|
docker exec -it caddy caddy hash-password --plaintext "lejin2000"
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
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
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
Reference in New Issue
Block a user