生產階段平行運作容器系統
Table of contents
背景
生產階段的策略考量
- 服務對象的區隔
- 使用者群組可以使用相同的API資源、相同的RAG背景資料庫、卻仍然保持使用者自己的對話記錄隱私。
- 部門業務的區隔。群組至少需要到部門層級、或其以下。
- 服務人數、資料量的考量
- 有的分組人數雖多,但非屬設計人員,
- 有的資料量很大,但多半是圖檔、簡報檔,不是資訊量足夠的文本。
node生產方案
作業程序
- 下載原始碼:
git clone https://github.com/Mintplex-Labs/anything-llm.git
- 修改server/.env
.env檔案設定
SERVER_PORT='https://eng06.sinotech-eng.com:3014'
LLM_PROVIDER='openai'
OPEN_AI_KEY=sk-***
OPEN_MODEL_PREF='gpt-3.5-turbo'
LLM_PROVIDER='anthropic'
ANTHROPIC_API_KEY=sk-***
ANTHROPIC_MODEL_PREF='claude-3-haiku-20240307'
LLM_PROVIDER='localai'
LOCAL_AI_BASE_PATH='http://eng06.sinotech-eng.com:55083/v1'
LOCAL_AI_MODEL_PREF='vicuna-7b-v1.5-16k'
LOCAL_AI_MODEL_TOKEN_LIMIT=4096
STORAGE_DIR=.../server/storage
ENABLE_HTTPS='true'
HTTPS_CERT_PATH='/etc/apache2/openssl_pem/eng06.cert.pem'
HTTPS_KEY_PATH='/etc/apache2/openssl_pem/eng06.key.pem'
- 注意
SERVER_PORT
內容會被伺服器修改掉,每次要重新給定,否則抓不到host.domain_name:port
,也抓不到前綴https
執行批次腳本
- 安裝、編譯(只需執行一次)、執行服務
nvm use v18.20.2
export NODE_ENV=
cd anything-llm
pnpm install
{ cd frontend && pnpm install && pnpm build && cp -r dist ../server/public } &
export NODE_ENV=production
{ cd server && pnpm install &&
npx prisma generate --schema=./prisma/schema.prisma &&
npx prisma migrate deploy --schema=./prisma/schema.prisma &&
node ./index.js } &
{ cd collector && pnpm install && node index.js } &
注意事項
- chat embed:
- docker作用OK,但node方案無法作用,原因未明。
- 有關生產階段的作法,官網並不推薦node方案,且desktop方案也不提供embeded chat
伺服器導引到https目錄
- 伺服器都是在http上執行,embedded chat無法鑲嵌到https靜態網頁
迴圈設計
docker-compose
妥善設計生成端口的方式,以便生成 3001 到 3006 的端口。以下是更新後的示例 YAML 文件:
version: "3.9"
name: anythingllm
networks:
anything-llm:
driver: bridge
services:
anything-llm:
container_name: anything-llm
image: anything-llm:latest
build:
context: ../.
dockerfile: ./docker/Dockerfile
args:
ARG_UID: ${UID:-1000}
ARG_GID: ${GID:-1000}
cap_add:
- SYS_ADMIN
volumes:
- "./.env:/app/server/.env"
- "../server/storage:/app/server/storage"
- "../collector/hotdir/:/app/collector/hotdir"
- "../collector/outputs/:/app/collector/outputs"
user: "${UID:-1000}:${GID:-1000}"
ports:
- ":3001"
env_file:
- .env
networks:
- anything-llm
extra_hosts:
- "host.docker.internal:host-gateway"
- 在這個更新的示例中,我們使用了 `` 來生成不同的主機端口,其中
.
是當前迭代的值,我們將其加上 3000 得到不同的主機端口。 - yaml與go lang似乎有不相容之處,這個作法會發生語言的錯誤期待。
模板及替換策略
- 這個方案以docker-compose.yml_template方式,將其中的$PORT抽換,這樣就可以啟動不同的docker,使用不同的端口,
目錄區隔方案
- 將各個影像分別在不同目錄下平行運作,如此彼此的設定與紀錄將不會互相干擾,可以有最穩定的執行效果。
for
指令必須行在環境中啟動bash
,才會辨識{01..14}
的意義,因此在腳本前必須有前綴#!/bin/bash
,否則crontab無法執行批次檔。
#jiachi@eng06 ~
#$ cat up_anything
#!/usr/bin/bash
for i in {01..14};do
export STORAGE_LOCATION=$HOME/anythingllm$i && mkdir -p $STORAGE_LOCATION && touch "$STORAGE_LOCATION/.env" && docker run -d -p 30$i:3001 --cap-add SYS_ADMIN -v ${STORAGE_LOCATION}:/app/server/storage -v ${STORAGE_LOCATION}/.env:/app/server/.env -e STORAGE_DIR="/app/server/storage" --ip eng06.sinotech-eng.com mintplexlabs/anythingllm
done
批次停止所有的影像
#jiachi@eng06 ~
#$ cat docker_stop
#!/bin/bash
for n in $(docker ps|grep anything|awk '{print $1}');do
docker stop $n
done