Tiledesk Ubuntu 22.04 源码安装指南

在 Ubuntu 22.04 上通过 npm + systemd 源码部署 Tiledesk 全套微服务(server、chatbot、chat21 系列、backend-llm Python 后端)的完整步骤。

TiledeskTiledesk聊天机器人在线客服2026/10/27

Ubuntu 22.04 源码安装 Tiledesk 指南

一、方案说明

⚠️ 官方推荐度说明:Tiledesk 官方将 Docker Compose 作为首选自托管路径(见 《Tiledesk Docker Compose 部署指南》),源码安装路径主要面向二次开发者和深度定制场景。各服务的 npm 包独立发布、官方未提供一键源码安装脚本,需要逐个编排。

源码安装与 Docker Compose 的核心差异:

  • 所有基础依赖(MongoDB、RabbitMQ、Redis) 用 apt 系统包安装
  • 各微服务 用 npm install 部署到 Node.js 运行时
  • 进程守护 用 systemd(而非容器 restart)
  • 前端 UI 用 Angular CLI 编译后放到 Nginx 静态目录
  • 反代统一入口 仍用 Nginx(与 Compose 的 nginx-proxy 等价)

二、服务器准备

2.1 系统更新

sudo apt update && sudo apt upgrade -y

2.2 创建 tiledesk 用户

sudo useradd -r -m -s /bin/bash tiledesk
sudo passwd tiledesk

后续所有服务以 tiledesk 用户身份运行,避免 root 权限风险。

2.3 创建统一目录结构

sudo mkdir -p /opt/tiledesk/{backend,frontend,config,logs,data}
sudo chown -R tiledesk:tiledesk /opt/tiledesk
sudo mkdir -p /etc/tiledesk

三、基础依赖安装

3.1 Node.js 20 LTS

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs build-essential

# 验证
node --version    # v20.x.x
npm --version     # 10.x.x

3.2 MongoDB 7.0 社区版

curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
   sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg

echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] http://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
   sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

sudo apt update
sudo apt install -y mongodb-org
sudo systemctl enable mongod
sudo systemctl start mongod

# 验证
mongosh --eval "db.runCommand({ping: 1})"
# 预期 { ok: 1 }

3.3 RabbitMQ 3.12

curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | \
   sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq.gpg

# 安装 Erlang 依赖
sudo apt install -y erlang-base erlang-asn1 erlang-crypto erlang-eldap erlang-ftp \
  erlang-inets erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
  erlang-runtime-tools erlang-snmp erlang-ssl erlang-syntax-tools erlang-tftp \
  erlang-tools erlang-xmerl

# 添加 RabbitMQ 仓库
echo "deb [ signed-by=/usr/share/keyrings/rabbitmq.gpg ] https://dl.bintray.com/rabbitmq/debian jammy main" | \
   sudo tee /etc/apt/sources.list.d/rabbitmq.list
sudo apt update
sudo apt install -y rabbitmq-server

# 设置凭据(与 compose 保持一致,自行替换)
sudo rabbitmqctl add_user rabbitmq 'rabbitmq_pass_change_me_001' || true
sudo rabbitmqctl set_user_tags rabbitmq administrator
sudo rabbitmqctl set_permissions -p / rabbitmq ".*" ".*" ".*"

# 启用 MQTT 插件(Tiledesk 实时消息依赖)
sudo rabbitmq-plugins enable rabbitmq_mqtt

sudo systemctl enable rabbitmq-server
sudo systemctl start rabbitmq-server

# 验证
rabbitmqctl status | head -20

3.4 Redis 7

sudo apt install -y redis-server
sudo sed -i 's/^bind .*/bind 127.0.0.1/' /etc/redis/redis.conf
sudo systemctl enable redis-server
sudo systemctl restart redis-server

# 验证
redis-cli ping
# 预期 PONG

3.5 Python 3 + pip(AI LLM 后端)

sudo apt install -y python3 python3-pip python3-venv

# 验证
python3 --version  # 3.10+
pip3 --version

3.6 Nginx(统一反代)

sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx

3.7 Java + Qdrant(RAG 向量库)

# Qdrant 官方提供独立二进制,无需 Java
sudo curl -fsSL https://github.com/qdrant/qdrant/releases/download/v1.9.1/qdrant -o /usr/local/bin/qdrant
sudo chmod +x /usr/local/bin/qdrant

# 数据目录
sudo mkdir -p /var/lib/qdrant/storage
sudo chown -R tiledesk:tiledesk /var/lib/qdrant

# 创建 systemd 服务
sudo tee /etc/systemd/system/qdrant.service > /dev/null << 'EOF'
[Unit]
Description=Qdrant Vector Database
After=network.target

[Service]
Type=simple
User=tiledesk
ExecStart=/usr/local/bin/qdrant --storage-path /var/lib/qdrant/storage --host 127.0.0.1 --port 6333
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable qdrant
sudo systemctl start qdrant

# 验证
curl http://localhost:6333/healthz
# 预期 ok

四、Node.js 后端服务

💡 环境变量速查:以下各服务的完整环境变量清单见 《Tiledesk 配置参数详解》。compose 文件中的环境变量(MONGODB_URI、JWT_SECRET_KEY、GPTKEY 等)是源码安装的权威参考,每个服务都需要一一配置。

所有后端服务统一运行在 /opt/tiledesk/backend/ 目录下,以 tiledesk 用户执行。

4.1 tiledesk-server(主 API)

sudo -u tiledesk bash
cd /opt/tiledesk/backend
git clone --depth 1 -b v2.13.23-op1 https://github.com/Tiledesk/tiledesk-server.git server
cd server
npm ci --production

# 创建 .env 文件(环境变量模板,参考 compose server 段)
cat > .env << 'ENVEOF'
LOG_LEVEL=info
CHAT21_ENABLED=true
CHAT21_ENGINE=mqtt
CHAT21_URL=http://127.0.0.1:8004
CHAT21_JWT_SECRET=tokenKey
CHAT21_APPID=tilechat
RESTHOOK_ENABLED=true
ALLOW_REOPEN_CHAT=true
CHAT21_ADMIN_TOKEN=<从 compose 复制 JWT>
AMQP_MANAGER_URL=amqp://rabbitmq:rabbitmq_pass_change_me_001@127.0.0.1:5672
MONGODB_URI=mongodb://127.0.0.1:27017/tiledesk
CACHE_ENABLED=true
CACHE_ENGINE=redis
CACHE_REDIS_HOST=127.0.0.1
CACHE_REDIS_PORT=6379
APPS_ACCESS_TOKEN_SECRET=nodeauthsecret_change_me
BOOT_LOADING=true
GPTKEY=CHANGEIT
AI_MODELS=gpt-5:4;gpt-4o:4;gpt-4o-mini:0.3
OPENAI_ENDPOINT=https://api.openai.com/v1
VECTOR_STORE_NAME=qdrant
VECTOR_STORE_HOST=127.0.0.1
VECTOR_STORE_PORT=6333
JWT_SECRET_KEY=tokenKey_change_me
COMMUNITY_VERSION=true
TILEBOT_ENDPOINT=http://127.0.0.1:3002
PORT=3000
ENVEOF

exit  # 回到 root

创建 systemd 服务:

sudo tee /etc/systemd/system/tiledesk-server.service > /dev/null << 'EOF'
[Unit]
Description=Tiledesk Main API Server
After=network.target mongod.service rabbitmq-server.service redis-server.service qdrant.service
Requires=mongod rabbitmq-server redis-server qdrant

[Service]
Type=simple
User=tiledesk
WorkingDirectory=/opt/tiledesk/backend/server
EnvironmentFile=/opt/tiledesk/backend/server/.env
ExecStart=/usr/bin/node /opt/tiledesk/backend/server/bin/www
Restart=on-failure
StandardOutput=append:/opt/tiledesk/logs/server.log
StandardError=append:/opt/tiledesk/logs/server.err.log

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable tiledesk-server
sudo systemctl start tiledesk-server

# 验证
curl http://127.0.0.1:3000/
# 预期返回 JSON 或 HTTP 200
sudo systemctl status tiledesk-server

4.2 chat21-server(MQTT Broker)

sudo -u tiledesk bash
cd /opt/tiledesk/backend
git clone --depth 1 https://github.com/Tiledesk/chat21-server.git chat21server
cd chat21server
npm ci --production

cat > .env << 'ENVEOF'
LOG_LEVEL=info
MONGODB_URI=mongodb://127.0.0.1:27017/chat21
APP_ID=tilechat
RABBITMQ_URI=amqp://rabbitmq:rabbitmq_pass_change_me_001@127.0.0.1:5672
MQTT_PORT=3003
MQTT_HOST=127.0.0.1
ENVEOF

exit
sudo tee /etc/systemd/system/chat21-server.service > /dev/null << 'EOF'
[Unit]
Description=Chat21 MQTT Server
After=network.target mongod.service rabbitmq-server.service
Requires=mongod rabbitmq-server

[Service]
Type=simple
User=tiledesk
WorkingDirectory=/opt/tiledesk/backend/chat21server
EnvironmentFile=/opt/tiledesk/backend/chat21server/.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
StandardOutput=append:/opt/tiledesk/logs/chat21server.log

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable chat21-server
sudo systemctl start chat21-server

4.3 chat21-http-server(Chat HTTP API)

sudo -u tiledesk bash
cd /opt/tiledesk/backend
git clone --depth 1 https://github.com/Tiledesk/chat21-http-server.git chat21httpserver
cd chat21httpserver
npm ci --production

cat > .env << 'ENVEOF'
LOG_LEVEL=info
MONGODB_URI=mongodb://127.0.0.1:27017/chat21
JWT_KEY=tokenKey_change_me
RABBITMQ_URI=amqp://rabbitmq:rabbitmq_pass_change_me_001@127.0.0.1:5672
PUSH_ENABLED=true
CHAT21HTTP_CACHE_ENABLED=false
CONTACTS_LOOKUP_ENDPOINT=http://127.0.0.1:3000/users_util
PORT=8004
ENVEOF

exit
sudo tee /etc/systemd/system/chat21-http.service > /dev/null << 'EOF'
[Unit]
Description=Chat21 HTTP API Server
After=network.target mongod.service rabbitmq-server.service tiledesk-server.service
Requires=mongod rabbitmq-server tiledesk-server

[Service]
Type=simple
User=tiledesk
WorkingDirectory=/opt/tiledesk/backend/chat21httpserver
EnvironmentFile=/opt/tiledesk/backend/chat21httpserver/.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
StandardOutput=append:/opt/tiledesk/logs/chat21http.log

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable chat21-http
sudo systemctl start chat21-http

# 验证
curl http://127.0.0.1:8004/api/health

4.4 tiledesk-chatbot(AI Bot 引擎)

sudo -u tiledesk bash
cd /opt/tiledesk/backend
git clone --depth 1 https://github.com/Tiledesk/tiledesk-chatbot.git chatbot
cd chatbot
npm ci --production

cat > .env << 'ENVEOF'
API_ENDPOINT=http://127.0.0.1:3000
TILEBOT_ENDPOINT=http://127.0.0.1:3002
API_URL=http://127.0.0.1:8081/api
MONGODB_URI=mongodb://127.0.0.1:27017/tiledesk
CACHE_ENABLED=true
CACHE_REDIS_HOST=127.0.0.1
CACHE_REDIS_PORT=6379
AMQP_MANAGER_URL=amqp://rabbitmq:rabbitmq_pass_change_me_001@127.0.0.1:5672
GPTKEY=CHANGEIT
AI_ENDPOINT=http://127.0.0.1:3007/api
KB_ENDPOINT_TRAIN=http://127.0.0.1:3007/api
KB_ENDPOINT_QA=http://127.0.0.1:3008/api
TILEBOT_LOG=info
FLOW_LOGS_ENABLED=true
PORT=3002
ENVEOF

exit
sudo tee /etc/systemd/system/tiledesk-chatbot.service > /dev/null << 'EOF'
[Unit]
Description=Tiledesk AI Chatbot Engine
After=network.target tiledesk-server.service rabbitmq-server.service redis-server.service
Requires=tiledesk-server rabbitmq-server redis-server

[Service]
Type=simple
User=tiledesk
WorkingDirectory=/opt/tiledesk/backend/chatbot
EnvironmentFile=/opt/tiledesk/backend/chatbot/.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
StandardOutput=append:/opt/tiledesk/logs/chatbot.log

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable tiledesk-chatbot
sudo systemctl start tiledesk-chatbot

4.5 backend-llm-train / backend-llm-qa(RAG Python 后端)

这两个服务共享同一个 Docker image(tiledesk-backend-llm:0.5.3-rc1),通过 TILELLM_ROLE 环境变量区分 train 和 qa。

sudo -u tiledesk bash
cd /opt/tiledesk/backend
git clone --depth 1 https://github.com/Tiledesk/tiledesk-backend-llm.git backend-llm
cd backend-llm

# 创建两个 venv(train 和 qa 共用代码但独立运行)
python3 -m venv .venv-train
python3 -m venv .venv-qa

source .venv-train/bin/activate
pip install --upgrade pip
pip install -r requirements.txt  # 官方 requirements.txt
deactivate

source .venv-qa/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
deactivate

# train 实例配置
cat > .env.train << 'ENVEOF'
TIMEOUT=240
REDIS_URL=redis://127.0.0.1:6379
TILELLM_ROLE=train
WORKERS=3
MONGODB_URL=mongodb://127.0.0.1:27017/tiledesk
AMQP_MANAGER_URL=amqp://rabbitmq:rabbitmq_pass_change_me_001@127.0.0.1:5672
JOB_TOPIC_EXCHANGE_TRAIN=tiledesk-trainer
GPTKEY=CHANGEIT
TRAIN_PREFETCH=4
JWT_SECRET_KEY=tokenKey_change_me
TRAINER_LOG=info
HOST=127.0.0.1
PORT=3007
ENVEOF

# qa 实例配置
cp .env.train .env.qa
sed -i 's/TILELLM_ROLE=train/TILELLM_ROLE=qa/' .env.qa
sed -i 's/PORT=3007/PORT=3008/' .env.qa

exit
# Train systemd
sudo tee /etc/systemd/system/tiledesk-llm-train.service > /dev/null << 'EOF'
[Unit]
Description=Tiledesk RAG Training Backend
After=network.target rabbitmq-server.service redis-server.service
Requires=rabbitmq-server redis-server

[Service]
Type=simple
User=tiledesk
WorkingDirectory=/opt/tiledesk/backend/backend-llm
EnvironmentFile=/opt/tiledesk/backend/backend-llm/.env.train
ExecStart=/opt/tiledesk/backend/backend-llm/.venv-train/bin/python -m uvicorn main:app --host 127.0.0.1 --port 3007
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# QA systemd
sudo tee /etc/systemd/system/tiledesk-llm-qa.service > /dev/null << 'EOF'
[Unit]
Description=Tiledesk RAG QA Backend
After=network.target rabbitmq-server.service redis-server.service
Requires=rabbitmq-server redis-server

[Service]
Type=simple
User=tiledesk
WorkingDirectory=/opt/tiledesk/backend/backend-llm
EnvironmentFile=/opt/tiledesk/backend/backend-llm/.env.qa
ExecStart=/opt/tiledesk/backend/backend-llm/.venv-qa/bin/python -m uvicorn main:app --host 127.0.0.1 --port 3008
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable tiledesk-llm-train tiledesk-llm-qa
sudo systemctl start tiledesk-llm-train tiledesk-llm-qa

# 验证
curl http://127.0.0.1:3007/docs  # Train Swagger UI
curl http://127.0.0.1:3008/docs  # QA Swagger UI

五、前端 UI 编译

四个前端组件(dashboard、cds、webwidget、ionic)都是 Angular 应用,编译后输出静态文件。

5.1 安装 Angular CLI

sudo npm install -g @angular/cli@latest

5.2 dashboard(管理后台)

sudo -u tiledesk bash
cd /opt/tiledesk/frontend
git clone --depth 1 https://github.com/Tiledesk/tiledesk-dashboard.git dashboard
cd dashboard

# 环境配置
cat > src/environments/environment.prod.ts << 'ENVEOF'
export const environment = {
  production: true,
  serverUrl: 'http://127.0.0.1/api',
  chatUrl: 'http://127.0.0.1/chat',
  wsUrl: 'ws://127.0.0.1/ws',
};
ENVEOF

npm ci
ng build --configuration=production
# 输出: dist/
exit

sudo rm -rf /var/www/tiledesk/dashboard
sudo mkdir -p /var/www/tiledesk/dashboard
sudo cp -r /opt/tiledesk/frontend/dashboard/dist/* /var/www/tiledesk/dashboard/
sudo chown -R www-data:www-data /var/www/tiledesk

5.3 cds(Bot Flow 设计器)

sudo -u tiledesk bash
cd /opt/tiledesk/frontend
git clone --depth 1 https://github.com/Tiledesk/design-studio.git cds
cd cds
npm ci
ng build --configuration=production
exit

sudo mkdir -p /var/www/tiledesk/cds
sudo cp -r /opt/tiledesk/frontend/cds/dist/* /var/www/tiledesk/cds/
sudo chown -R www-data:www-data /var/www/tiledesk

5.4 chat21-web-widget(嵌入浮窗)

sudo -u tiledesk bash
cd /opt/tiledesk/frontend
git clone --depth 1 https://github.com/Tiledesk/chat21-web-widget.git webwidget
cd webwidget
npm ci
ng build --configuration=production
exit

sudo mkdir -p /var/www/tiledesk/widget
sudo cp -r /opt/tiledesk/frontend/webwidget/dist/* /var/www/tiledesk/widget/

5.5 chat21-ionic(完整聊天界面)

sudo -u tiledesk bash
cd /opt/tiledesk/frontend
git clone --depth 1 https://github.com/Tiledesk/chat21-ionic.git ionic
cd ionic
npm ci
npx ionic build --prod
exit

sudo mkdir -p /var/www/tiledesk/chat
sudo cp -r /opt/tiledesk/frontend/ionic/www/* /var/www/tiledesk/chat/

六、Nginx 统一反代

sudo tee /etc/nginx/sites-available/tiledesk > /dev/null << 'EOF'
server {
    listen 80;
    server_name _;

    # ===== 前端静态文件 =====
    location /dashboard/ {
        alias /var/www/tiledesk/dashboard/;
        try_files $uri $uri/ /dashboard/index.html;
    }

    location /cds/ {
        alias /var/www/tiledesk/cds/;
        try_files $uri $uri/ /cds/index.html;
    }

    location /widget/ {
        alias /var/www/tiledesk/widget/;
        try_files $uri $uri/ /widget/index.html;
    }

    location /chat/ {
        alias /var/www/tiledesk/chat/;
        try_files $uri $uri/ /chat/index.html;
    }

    # ===== tiledesk-server REST API =====
    location /api/ {
        proxy_pass http://127.0.0.1:3000/api/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # ===== WebSocket (MQTT over WS) =====
    location /mqws/ {
        proxy_pass http://127.0.0.1:15675/ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400;
    }

    # ===== WebSocket (Dashboard) =====
    location /ws/ {
        proxy_pass http://127.0.0.1:15675/ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

    # ===== Chat21 HTTP API =====
    location /chatapi/ {
        proxy_pass http://127.0.0.1:8004/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

sudo ln -sf /etc/nginx/sites-available/tiledesk /etc/nginx/sites-enabled/tiledesk
sudo rm -f /etc/nginx/sites-enabled/default

# 测试并重载
sudo nginx -t
sudo systemctl reload nginx

七、启动与验证

7.1 按正确顺序启动全部服务

# 1. 基础依赖(已 enable,开机自启)
sudo systemctl start mongod
sudo systemctl start rabbitmq-server
sudo systemctl start redis-server
sudo systemctl start qdrant

# 2. 后端 API 层
sudo systemctl start tiledesk-server
sudo systemctl start chat21-server
sudo systemctl start chat21-http
sudo systemctl start tiledesk-chatbot

# 3. AI LLM 后端(可选,GPTKEY 为 CHANGEIT 时 Bot 无 AI 能力但服务本身正常运行)
sudo systemctl start tiledesk-llm-train
sudo systemctl start tiledesk-llm-qa

# 4. 统一反代
sudo systemctl start nginx

7.2 健康检查清单

# 基础依赖
mongosh --eval "db.runCommand({ping: 1})"
rabbitmqctl status | grep -c "node"
redis-cli ping
curl -s http://127.0.0.1:6333/healthz

# 后端服务
curl -s http://127.0.0.1:3000/ | head -c 100
curl -s http://127.0.0.1:8004/api/health | head -c 100
curl -s http://127.0.0.1:3002/ | head -c 100
curl -s http://127.0.0.1:3007/docs -o /dev/null -w "%{http_code}\n"
curl -s http://127.0.0.1:3008/docs -o /dev/null -w "%{http_code}\n"

# Nginx 统一入口
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/api/
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/dashboard/
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/widget/
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/chat/

7.3 全部服务状态

sudo systemctl --no-pager --full status \
  mongod rabbitmq-server redis-server qdrant \
  tiledesk-server chat21-server chat21-http tiledesk-chatbot \
  tiledesk-llm-train tiledesk-llm-qa nginx

预期 11 个服务全部 active (running)。

7.4 浏览器验证

打开 http://<服务器IP>/dashboard/,用默认管理员登录:

字段值
邮箱admin@tiledesk.com
密码superadmin

登录成功后立即在 Profile 页面修改密码。

八、进程管理与排障

8.1 查看实时日志

# 主后端
journalctl -u tiledesk-server -f --since "5 min ago"

# AI Bot
journalctl -u tiledesk-chatbot -f

# 全部 tiledesk 服务日志
ls -la /opt/tiledesk/logs/
tail -f /opt/tiledesk/logs/server.log

8.2 服务重启

# 单个服务
sudo systemctl restart tiledesk-server

# 全部 tiledesk 服务(有依赖顺序,用脚本)
sudo tee /usr/local/bin/restart-tiledesk > /dev/null << 'EOF'
#!/bin/bash
services=(
  tiledesk-llm-train tiledesk-llm-qa
  tiledesk-chatbot chat21-http chat21-server
  tiledesk-server
)
for svc in "${services[@]}"; do
  echo "Restarting $svc..."
  sudo systemctl restart "$svc"
  sleep 2
done
sudo systemctl reload nginx
echo "Done."
EOF
sudo chmod +x /usr/local/bin/restart-tiledesk

# 一键重启
restart-tiledesk

8.3 常见排障

现象检查命令常见原因
Dashboard 白屏curl http://127.0.0.1:3000/server 未就绪 / JWT_KEY 不一致
Widget 无法发送消息journalctl -u chat21-server -fRabbitMQ MQTT 插件未启用
AI Bot 无响应journalctl -u tiledesk-llm-train -fGPTKEY 无效 / Qdrant 未启动
MongoDB 连接失败mongosh --eval "db.tiledesk.stats()"mongod 未启动 / 地址错
RabbitMQ 认证失败rabbitmqctl list_users.env 中凭据未改对

九、开机自启验证

重启服务器后检查全部服务状态:

sudo reboot
# 等服务器起来...
for svc in mongod rabbitmq-server redis-server qdrant \
  tiledesk-server chat21-server chat21-http tiledesk-chatbot \
  tiledesk-llm-train tiledesk-llm-qa nginx; do
  echo -n "$svc: "; systemctl is-active "$svc"
done

预期全部 active。

十、与 Docker Compose 方案对比

维度源码安装(本指南)Docker Compose
部署时间2-4 小时(含编译)5-10 分钟
升级成本每个服务独立 pull + build + restartdocker compose pull && docker compose up -d
资源占用略低(无容器层开销)略高
进程隔离systemd + 用户级隔离容器命名空间
日志收集journald + 文件docker compose logs
定制灵活度⭐⭐⭐⭐⭐ 可改任意服务源码⭐⭐ 只能改 compose env
运维复杂度11 个独立 systemd 单元1 个 compose 项目
适用场景二次开发 / 深度定制生产部署 / 快速 PoC

💡 结论:生产环境优先 Docker Compose(见 《Tiledesk Docker Compose 部署指南》),源码安装适合需要改源码或不想跑容器的场景。