Tiledesk Ubuntu 22.04 源码安装指南
在 Ubuntu 22.04 上通过 npm + systemd 源码部署 Tiledesk 全套微服务(server、chatbot、chat21 系列、backend-llm Python 后端)的完整步骤。
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 -f | RabbitMQ MQTT 插件未启用 |
| AI Bot 无响应 | journalctl -u tiledesk-llm-train -f | GPTKEY 无效 / 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 + restart | docker compose pull && docker compose up -d |
| 资源占用 | 略低(无容器层开销) | 略高 |
| 进程隔离 | systemd + 用户级隔离 | 容器命名空间 |
| 日志收集 | journald + 文件 | docker compose logs |
| 定制灵活度 | ⭐⭐⭐⭐⭐ 可改任意服务源码 | ⭐⭐ 只能改 compose env |
| 运维复杂度 | 11 个独立 systemd 单元 | 1 个 compose 项目 |
| 适用场景 | 二次开发 / 深度定制 | 生产部署 / 快速 PoC |
💡 结论:生产环境优先 Docker Compose(见 《Tiledesk Docker Compose 部署指南》),源码安装适合需要改源码或不想跑容器的场景。