跳到主要内容

DatomsDBS 部署指南

版本: 1.0
日期: 2024年12月28日


目录

  1. 概述
  2. 快速部署
  3. 本地开发部署
  4. Docker 容器化部署
  5. AWS 云部署
  6. 生产环境部署
  7. 监控和维护
  8. 故障排除

概述

DatomsDBS 支持多种部署方式,从本地开发环境到大规模生产环境。本指南将详细介绍每种部署方式的步骤、配置和最佳实践。

部署方式对比

部署方式适用场景复杂度可扩展性维护成本
本地开发开发测试
Docker Compose小型生产
AWS EC2云端部署
Kubernetes大型生产

快速部署

一键部署脚本

最快的部署方式是使用提供的自动化脚本:

# 克隆项目
git clone <repository-url>
cd datomsDBS

# 运行一键部署
./scripts/setup_datomsdbs.sh

脚本功能

  1. 环境检查: 验证系统要求和依赖
  2. 依赖安装: 自动安装 Node.js 依赖
  3. 配置生成: 创建默认配置文件
  4. 服务启动: 启动应用程序
  5. 健康检查: 验证部署是否成功

预期结果

==========================================
DatomsDBS 一键设置完成!
==========================================

✅ 服务已启动: http://localhost:9000
✅ 管理界面: http://localhost:9000/admin
✅ 默认登录: admin / admin123

⚠️ 重要提醒:
- 生产环境请修改默认密码
- 配置文件位于: .env
- 数据目录位于: ./data

本地开发部署

系统要求

  • Node.js: >= 14.0.0
  • npm: >= 6.0.0
  • 内存: >= 2GB
  • 磁盘: >= 5GB 可用空间

步骤 1: 环境准备

# 检查 Node.js 版本
node --version
npm --version

# 如需升级 Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

步骤 2: 项目设置

# 克隆项目
git clone <repository-url>
cd datomsDBS

# 安装依赖
npm install

# 创建环境配置
cp .env.example .env

步骤 3: 配置文件

编辑 .env 文件:

# 基础配置
NODE_ENV=development
PORT=9000
LOG_LEVEL=debug

# 安全配置
JWT_SECRET=dev-secret-key
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123

# 数据配置
DATA_DIR=./data
AUTO_SAVE_INTERVAL=60000

步骤 4: 启动服务

# 开发模式启动
npm run dev

# 或标准启动
npm start

步骤 5: 验证部署

# 健康检查
curl http://localhost:9000/api/health

# 访问管理界面
open http://localhost:9000/admin

Docker 容器化部署

优势

  • 一致性: 环境一致性保证
  • 隔离性: 服务间隔离
  • 可移植性: 跨平台部署
  • 扩展性: 容易水平扩展

前置要求

# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker --version
docker-compose --version

基础部署

docker-compose.yml

version: '3.8'

services:
datomsdbs:
build:
context: .
dockerfile: Dockerfile
ports:
- "9000:9000"
environment:
- NODE_ENV=production
- JWT_SECRET=${JWT_SECRET}
- API_TOKEN=${API_TOKEN}
volumes:
- ./data:/app/data
- ./logs:/app/logs
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s

volumes:
data:
logs:

启动命令

# 构建并启动服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f datomsdbs

# 停止服务
docker-compose down

完整部署(含 AI 服务)

docker-compose.full.yml

version: '3.8'

services:
datomsdbs:
build: .
ports:
- "9000:9000"
environment:
- NODE_ENV=production
- LLM_SERVICE_URL=http://ollama:11434
- REDIS_URL=redis://redis:6379
volumes:
- ./data:/app/data
- ./logs:/app/logs
depends_on:
- redis
- ollama
restart: unless-stopped

redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
restart: unless-stopped

ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
environment:
- OLLAMA_KEEP_ALIVE=24h
restart: unless-stopped

nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./deployment/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- datomsdbs
restart: unless-stopped

volumes:
redis_data:
ollama_data:

启动完整环境

# 使用完整配置启动
docker-compose -f docker-compose.full.yml up -d

# 初始化 Ollama 模型
docker-compose exec ollama ollama pull qwen2:1.5b

数据持久化

volumes:
# 应用数据
- ./data:/app/data
# 日志文件
- ./logs:/app/logs
# 上传文件
- ./uploads:/app/uploads
# 备份文件
- ./backups:/app/backups

AWS 云部署

自动化部署

使用提供的 AWS 自动化脚本进行一键部署:

./scripts/aws_ec2_test_deployment.sh

脚本特性

  • 自动化基础设施: VPC、安全组、密钥对
  • 实例配置: Ubuntu 22.04 LTS + Docker
  • 应用部署: 完整的应用栈部署
  • 健康检查: 自动验证部署状态
  • 成本控制: 自动清理资源选项

手动 AWS 部署

步骤 1: 创建 EC2 实例

# 创建安全组
aws ec2 create-security-group \
--group-name datomsdbs-sg \
--description "DatomsDBS Security Group"

# 配置安全组规则
aws ec2 authorize-security-group-ingress \
--group-name datomsdbs-sg \
--protocol tcp \
--port 22 \
--cidr 0.0.0.0/0

aws ec2 authorize-security-group-ingress \
--group-name datomsdbs-sg \
--protocol tcp \
--port 9000 \
--cidr 0.0.0.0/0

# 启动 EC2 实例
aws ec2 run-instances \
--image-id ami-047126e50991d067b \
--count 1 \
--instance-type t3.xlarge \
--key-name your-key-pair \
--security-groups datomsdbs-sg \
--block-device-mappings '[{"DeviceName":"/dev/sda1","Ebs":{"VolumeSize":200,"VolumeType":"gp3"}}]'

步骤 2: 连接和配置实例

# SSH 连接到实例
ssh -i your-key.pem ubuntu@YOUR_INSTANCE_IP

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker ubuntu

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

步骤 3: 部署应用

# 克隆项目
git clone <repository-url>
cd datomsDBS

# 配置环境变量
cp .env.example .env
# 编辑配置文件

# 启动服务
docker-compose up -d

AWS 优化配置

实例类型选择

实例类型vCPU内存适用场景预估费用/小时
t3.medium24GB开发测试$0.04
t3.large28GB小型生产$0.08
t3.xlarge416GB中型生产$0.17
c5.2xlarge816GB高性能$0.34

EBS 存储优化

# GP3 存储配置(推荐)
--block-device-mappings '[
{
"DeviceName":"/dev/sda1",
"Ebs":{
"VolumeSize":200,
"VolumeType":"gp3",
"Iops":3000,
"Throughput":125,
"DeleteOnTermination":true
}
}
]'

生产环境部署

生产环境要求

硬件要求

  • CPU: 4+ 核心
  • 内存: 8GB+
  • 存储: 100GB+ SSD
  • 网络: 1Gbps+

软件要求

  • 操作系统: Ubuntu 20.04+ / CentOS 8+
  • Docker: 20.0+
  • Docker Compose: 1.29+
  • SSL 证书: 用于 HTTPS

安全配置

SSL/TLS 配置

# nginx.conf
server {
listen 443 ssl http2;
server_name yourdomain.com;

ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;

location / {
proxy_pass http://datomsdbs:9000;
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;
}
}

server {
listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri;
}

防火墙配置

# UFW 防火墙配置
sudo ufw enable
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw deny 9000/tcp # 阻止直接访问应用端口

环境变量安全

# 生产环境 .env
NODE_ENV=production
PORT=9000
LOG_LEVEL=warn

# 强密码配置
JWT_SECRET=$(openssl rand -base64 64)
API_TOKEN=$(openssl rand -base64 32)
ADMIN_PASSWORD=$(openssl rand -base64 16)

# 数据库安全
DB_PASSWORD=$(openssl rand -base64 32)
REDIS_PASSWORD=$(openssl rand -base64 32)

高可用部署

负载均衡配置

# docker-compose.ha.yml
version: '3.8'

services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- datomsdbs-1
- datomsdbs-2
- datomsdbs-3

datomsdbs-1:
build: .
environment:
- NODE_ENV=production
- INSTANCE_ID=1
volumes:
- shared_data:/app/data

datomsdbs-2:
build: .
environment:
- NODE_ENV=production
- INSTANCE_ID=2
volumes:
- shared_data:/app/data

datomsdbs-3:
build: .
environment:
- NODE_ENV=production
- INSTANCE_ID=3
volumes:
- shared_data:/app/data

redis:
image: redis:7-alpine
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data

volumes:
shared_data:
redis_data:

数据备份策略

自动备份脚本

#!/bin/bash
# production-backup.sh

BACKUP_DIR="/data/backups"
S3_BUCKET="your-backup-bucket"
RETENTION_DAYS=30

# 创建备份
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="datomsdbs_prod_${DATE}.tar.gz"

# 停止写入操作(可选)
docker-compose exec datomsdbs curl -X POST http://localhost:9000/api/admin/maintenance/read-only

# 创建数据备份
tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" \
--exclude='./logs/*' \
./data

# 上传到 S3
aws s3 cp "${BACKUP_DIR}/${BACKUP_FILE}" "s3://${S3_BUCKET}/backups/"

# 恢复写入操作
docker-compose exec datomsdbs curl -X POST http://localhost:9000/api/admin/maintenance/read-write

# 清理本地旧备份
find "${BACKUP_DIR}" -name "datomsdbs_prod_*.tar.gz" -mtime +${RETENTION_DAYS} -delete

# 清理 S3 旧备份
aws s3 ls "s3://${S3_BUCKET}/backups/" | grep "datomsdbs_prod_" | head -n -${RETENTION_DAYS} | awk '{print $4}' | xargs -I {} aws s3 rm "s3://${S3_BUCKET}/backups/{}"

echo "Backup completed: ${BACKUP_FILE}"

定时备份配置

# 添加到 crontab
crontab -e

# 每天凌晨 2 点备份
0 2 * * * /path/to/production-backup.sh >> /var/log/datomsdbs-backup.log 2>&1

# 每周日凌晨 1 点进行完整系统备份
0 1 * * 0 /path/to/full-system-backup.sh >> /var/log/datomsdbs-full-backup.log 2>&1

监控和维护

系统监控

Prometheus + Grafana

# monitoring/docker-compose.monitoring.yml
version: '3.8'

services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'

grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/dashboards:/etc/grafana/provisioning/dashboards
- ./grafana/datasources:/etc/grafana/provisioning/datasources

node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'

volumes:
prometheus_data:
grafana_data:

健康检查脚本

#!/bin/bash
# health-check.sh

API_URL="http://localhost:9000/api/health"
SLACK_WEBHOOK="YOUR_SLACK_WEBHOOK_URL"

# 执行健康检查
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" $API_URL)

if [ "$RESPONSE" != "200" ]; then
MESSAGE="🚨 DatomsDBS Health Check Failed - Status: $RESPONSE"

# 发送告警到 Slack
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"$MESSAGE\"}" \
$SLACK_WEBHOOK

# 记录日志
echo "$(date): Health check failed - Status: $RESPONSE" >> /var/log/datomsdbs-health.log

# 尝试重启服务(可选)
# docker-compose restart datomsdbs
else
echo "$(date): Health check passed" >> /var/log/datomsdbs-health.log
fi

日志管理

日志轮转配置

# /etc/logrotate.d/datomsdbs
/var/log/datomsdbs/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 datomsdbs datomsdbs
postrotate
docker-compose exec datomsdbs kill -USR1 1
endscript
}

集中化日志收集

# ELK Stack for log aggregation
version: '3.8'

services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
ports:
- "9200:9200"

logstash:
image: docker.elastic.co/logstash/logstash:7.15.0
volumes:
- ./logstash/config:/usr/share/logstash/pipeline
depends_on:
- elasticsearch

kibana:
image: docker.elastic.co/kibana/kibana:7.15.0
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch

volumes:
elasticsearch_data:

故障排除

常见部署问题

端口占用

# 检查端口占用
netstat -tulpn | grep :9000
lsof -i :9000

# 解决方案
kill -9 <PID>
# 或修改配置使用其他端口

权限问题

# Docker 权限问题
sudo usermod -aG docker $USER
newgrp docker

# 文件权限问题
sudo chown -R $USER:$USER ./data
sudo chmod -R 755 ./data

内存不足

# 检查内存使用
free -h
docker stats

# 解决方案
# 1. 增加 swap
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 2. 优化 Node.js 内存
export NODE_OPTIONS="--max-old-space-size=2048"

网络连接问题

# 检查网络连接
curl -I http://localhost:9000/api/health
telnet localhost 9000

# 检查防火墙
sudo ufw status
sudo iptables -L

# Docker 网络问题
docker network ls
docker network inspect bridge

性能优化

数据库优化

# 检查数据库性能
curl http://localhost:9000/api/admin/stats

# 优化索引
curl -X POST http://localhost:9000/api/datoms/databases/your_db/optimize

# 清理过期数据
curl -X POST http://localhost:9000/api/admin/cleanup

缓存优化

# Redis 缓存状态
docker-compose exec redis redis-cli info memory

# 清理缓存
docker-compose exec redis redis-cli flushall

恢复操作

从备份恢复

# 停止服务
docker-compose down

# 恢复数据
tar -xzf backup_file.tar.gz -C ./

# 重新启动服务
docker-compose up -d

# 验证恢复
curl http://localhost:9000/api/health

灾难恢复

# 完整系统恢复流程
# 1. 重新部署基础设施
# 2. 恢复应用代码
# 3. 恢复配置文件
# 4. 恢复数据备份
# 5. 验证系统功能
# 6. 更新 DNS 记录(如需要)

总结

本部署指南涵盖了 DatomsDBS 的各种部署场景,从简单的本地开发到复杂的生产环境。选择合适的部署方式取决于您的具体需求、技术栈和资源约束。

推荐部署路径

  1. 开发测试: 本地开发部署
  2. 概念验证: Docker Compose 部署
  3. 小规模生产: AWS EC2 自动化部署
  4. 企业级生产: 高可用 + 监控 + 备份方案

如需更多帮助,请参考主技术文档或联系支持团队。