Files
ljwx-docs/DEPLOYMENT.md
brunoandClaude Sonnet 4.5 ec96907fb6 feat: 初始化 LJWX Docs 文档站点
## 功能特性
- ✨ VitePress 1.0 框架,支持中英文双语
- 🌐 远程访问支持(0.0.0.0:5555)
- 🎨 专业级代码块样式(圆角阴影、悬浮效果、智能复制)
- 📊 Mermaid 流程图优化(主题色节点、平滑连线)
- 📋 表格美化(渐变表头、行悬浮高亮)
- 🔍 本地搜索功能(Cmd+K 快捷键)
- 🌓 深色模式完美适配
- 💬 Giscus 评论系统集成
- 📱 响应式设计(移动端优化)

## 技术栈
- VitePress 1.0.1
- Vue 3.4.19
- TypeScript
- Express (生产服务器)

## 文档包含
- 知识资产化系统架构设计
- 自动化发布使用指南
- Dify 知识库同步指南
- 快速参考手册

## 部署支持
- Node.js 服务器
- Docker 容器化
- Nginx 静态托管
- Kubernetes 集群部署

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
2026-01-23 16:06:02 +08:00

10 KiB
Raw Permalink Blame History

部署指南

本文档介绍如何在不同环境中部署 LJWX Docs 文档网站。

📋 前置要求

  • Node.js 18+
  • npm 或 yarn
  • Git

🚀 快速部署

1. 构建项目

# 克隆仓库(如果还没有)
git clone https://github.com/ljwx/ljwx-docs.git
cd ljwx-docs

# 安装依赖
npm install

# 构建生产版本
npm run docs:build

构建完成后,静态文件将生成在 dist/ 目录。

2. 本地测试

# 方式 1: 使用 VitePress 内置预览
npm run docs:preview

# 方式 2: 使用 Node.js 服务器
npm run docs:serve

🐳 Docker 部署

创建 Dockerfile

在项目根目录创建 Dockerfile:

# 构建阶段
FROM node:18-alpine AS builder

WORKDIR /app

# 复制依赖文件
COPY package*.json ./
RUN npm ci

# 复制源代码
COPY . .

# 构建文档
RUN npm run docs:build

# 生产阶段
FROM node:18-alpine

WORKDIR /app

# 从构建阶段复制文件
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/server.js ./
COPY --from=builder /app/package*.json ./

# 只安装生产依赖
RUN npm ci --only=production

# 暴露端口
EXPOSE 3000

# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000
ENV HOST=0.0.0.0

# 启动服务
CMD ["node", "server.js"]

构建和运行

# 构建镜像
docker build -t ljwx-docs:latest .

# 运行容器
docker run -d \
  --name ljwx-docs \
  -p 3000:3000 \
  --restart unless-stopped \
  ljwx-docs:latest

# 查看日志
docker logs -f ljwx-docs

# 停止容器
docker stop ljwx-docs

# 删除容器
docker rm ljwx-docs

Docker Compose

创建 docker-compose.yml:

version: '3.8'

services:
  ljwx-docs:
    build: .
    container_name: ljwx-docs
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - PORT=3000
      - HOST=0.0.0.0
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

运行:

# 启动
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止
docker-compose down

🌐 Nginx 部署

方式 1: 静态文件托管

适合纯静态部署,性能最佳。

server {
    listen 80;
    server_name docs.ljwx.local;

    root /var/www/ljwx-docs/dist;
    index index.html;

    # 日志
    access_log /var/log/nginx/ljwx-docs-access.log;
    error_log /var/log/nginx/ljwx-docs-error.log;

    # SPA 路由支持
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # HTML 文件不缓存
    location ~* \.html$ {
        expires -1;
        add_header Cache-Control "no-cache, no-store, must-revalidate";
    }

    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml+rss
        application/rss+xml
        font/truetype
        font/opentype
        application/vnd.ms-fontobject
        image/svg+xml;

    # 安全头
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
}

部署步骤:

# 1. 构建项目
npm run docs:build

# 2. 复制到服务器
scp -r dist/* user@server:/var/www/ljwx-docs/dist/

# 3. 配置 Nginx
sudo cp nginx.conf /etc/nginx/sites-available/ljwx-docs
sudo ln -s /etc/nginx/sites-available/ljwx-docs /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

方式 2: 反向代理 Node.js

使用 Node.js 服务器 + Nginx 反向代理。

upstream ljwx_docs {
    server localhost:3000;
}

server {
    listen 80;
    server_name docs.ljwx.local;

    # 日志
    access_log /var/log/nginx/ljwx-docs-access.log;
    error_log /var/log/nginx/ljwx-docs-error.log;

    # 反向代理
    location / {
        proxy_pass http://ljwx_docs;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
    }

    # Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;
}

☸️ Kubernetes 部署

Deployment 配置

创建 k8s/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ljwx-docs
  namespace: ljwx
  labels:
    app: ljwx-docs
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: ljwx-docs
  template:
    metadata:
      labels:
        app: ljwx-docs
    spec:
      containers:
      - name: ljwx-docs
        image: ljwx-docs:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 3000
          name: http
          protocol: TCP
        env:
        - name: NODE_ENV
          value: "production"
        - name: PORT
          value: "3000"
        - name: HOST
          value: "0.0.0.0"
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"
          requests:
            memory: "128Mi"
            cpu: "250m"
        livenessProbe:
          httpGet:
            path: /
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /
            port: 3000
          initialDelaySeconds: 10
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 3

Service 配置

创建 k8s/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: ljwx-docs
  namespace: ljwx
  labels:
    app: ljwx-docs
spec:
  type: ClusterIP
  selector:
    app: ljwx-docs
  ports:
  - port: 80
    targetPort: 3000
    protocol: TCP
    name: http
  sessionAffinity: ClientIP

Ingress 配置

创建 k8s/ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ljwx-docs
  namespace: ljwx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
spec:
  ingressClassName: nginx
  rules:
  - host: docs.ljwx.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ljwx-docs
            port:
              number: 80

部署

# 创建命名空间
kubectl create namespace ljwx

# 应用配置
kubectl apply -f k8s/

# 查看状态
kubectl get pods -n ljwx -l app=ljwx-docs
kubectl get svc -n ljwx ljwx-docs
kubectl get ingress -n ljwx ljwx-docs

# 查看日志
kubectl logs -n ljwx -l app=ljwx-docs -f

# 扩容
kubectl scale deployment ljwx-docs -n ljwx --replicas=3

# 更新镜像
kubectl set image deployment/ljwx-docs ljwx-docs=ljwx-docs:v2 -n ljwx

# 回滚
kubectl rollout undo deployment/ljwx-docs -n ljwx

🔒 HTTPS 配置

Let's Encrypt (Certbot)

# 安装 Certbot
sudo apt-get install certbot python3-certbot-nginx

# 获取证书
sudo certbot --nginx -d docs.ljwx.local

# 自动续期
sudo certbot renew --dry-run

手动证书

server {
    listen 443 ssl http2;
    server_name docs.ljwx.local;

    ssl_certificate /etc/nginx/ssl/docs.ljwx.local.crt;
    ssl_certificate_key /etc/nginx/ssl/docs.ljwx.local.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 其他配置...
}

server {
    listen 80;
    server_name docs.ljwx.local;
    return 301 https://$server_name$request_uri;
}

🔧 环境变量

可用的环境变量:

变量 说明 默认值
NODE_ENV 运行环境 production
PORT 服务端口 3000
HOST 监听地址 0.0.0.0

📊 监控和日志

PM2 部署(推荐)

# 安装 PM2
npm install -g pm2

# 启动应用
pm2 start server.js --name ljwx-docs

# 查看状态
pm2 status

# 查看日志
pm2 logs ljwx-docs

# 重启
pm2 restart ljwx-docs

# 开机自启
pm2 startup
pm2 save

Systemd 服务

创建 /etc/systemd/system/ljwx-docs.service:

[Unit]
Description=LJWX Docs Service
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/ljwx-docs
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=ljwx-docs
Environment=NODE_ENV=production
Environment=PORT=3000

[Install]
WantedBy=multi-user.target

管理服务:

# 启动服务
sudo systemctl start ljwx-docs

# 开机自启
sudo systemctl enable ljwx-docs

# 查看状态
sudo systemctl status ljwx-docs

# 重启
sudo systemctl restart ljwx-docs

# 查看日志
sudo journalctl -u ljwx-docs -f

🚨 故障排查

构建失败

# 清理缓存
rm -rf node_modules dist .vitepress/cache
npm install
npm run docs:build

服务启动失败

# 检查端口占用
lsof -i :3000

# 检查 dist 目录
ls -la dist/

# 查看详细日志
NODE_ENV=production node server.js

Nginx 502 错误

# 检查 Node.js 服务是否运行
curl http://localhost:3000

# 检查 Nginx 配置
sudo nginx -t

# 查看 Nginx 错误日志
sudo tail -f /var/log/nginx/error.log

📞 获取帮助

如遇到部署问题:

  • 查看项目 Issues
  • 联系技术支持:brunogao