集群各节点部署

在以下几项准备工作完成后,开始 开始部署seatable相关服务。
  • 基础服务,如 nginx, mariadb, redis
  • etcd部署配置
  • 创建/opt/seatable-server目录,并在所有seatable服务器节点上共享该目录。
节点 frontend-1
初始化数据库及配置文件
在部署第一个 SeaTable 服务时首先应当对集群进行初始化
            
                
                
mkdir -p /opt/seatable/
cd /opt/seatable/
/opt/seatable/ 目录下需要以下几个文件
  • seatable-license.txt
  • docker-compose.yml
  • .env
            
                
                
#docker-compose.yml
services:
  seatable-server:
    image: ${SEATABLE_IMAGE:-seatable/seatable-enterprise:latest}
    restart: unless-stopped
    container_name: seatable-server
    ports:
      - 80:80
      - 5000:5000
      - 7777:7777
      - 7780:7780
    volumes:
      - "/opt/seatable-server:/shared"
      - "./seatable-pids:/shared/seatable/pids"
      - type: bind
        source: "./seatable-license.txt"
        target: "/shared/seatable/seatable-license.txt"
        read_only: ${SEATABLE_LICENSE_FORCE_READ_ONLY:-false}
    environment:
      - SEATABLE_MYSQL_DB_HOST=${MARIADB_HOST:-mariadb}
      - SEATABLE_MYSQL_DB_PORT=${MARIADB_PORT:-3306}
      - SEATABLE_MYSQL_DB_USER=${MARIADB_USER:-seatable}
      - SEATABLE_MYSQL_DB_PASSWORD=${MARIADB_PASSWORD:?Variable is not set or empty}
      - INIT_SEATABLE_MYSQL_ROOT_PASSWORD=$MARIADB_ROOT_PASSWORD
      - SEATABLE_MYSQL_DB_DTABLE_DB_NAME=dtable_db
      - SEATABLE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
      - SEATABLE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
      - REDIS_HOST=${REDIS_HOST:-redis}
      - REDIS_PORT=${REDIS_PORT:-6379}
      - REDIS_PASSWORD=${REDIS_PASSWORD:-}
      - JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY:?Variable is not set or empty}
      - ENABLE_SEADOC=${ENABLE_SEADOC:-false}
      - SEADOC_SERVER_URL=${SEATABLE_SERVER_PROTOCOL:-}://${SEATABLE_SERVER_HOSTNAME:-}:${SEADOC_PORT:-}
      - SEATABLE_SERVER_HOSTNAME=${SEATABLE_SERVER_HOSTNAME:?Variable is not set or empty}
      - SEATABLE_SERVER_PROTOCOL=${SEATABLE_SERVER_PROTOCOL:-https}
      - SEATABLE_ADMIN_EMAIL=${SEATABLE_ADMIN_EMAIL:?Variable is not set or empty}
      - SEATABLE_ADMIN_PASSWORD=${SEATABLE_ADMIN_PASSWORD:?Variable is not set or empty}
      - TIME_ZONE=${TIME_ZONE}
      - PYTHON_SCHEDULER_URL=${PYTHON_SCHEDULER_URL:-http://python-scheduler}
      - PYTHON_SCHEDULER_AUTH_TOKEN=${PYTHON_SCHEDULER_AUTH_TOKEN:-}
      - REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
      - SEATABLE_EMAIL_USE_TLS=${SEATABLE_EMAIL_USE_TLS:-}
      - SEATABLE_EMAIL_HOST=${SEATABLE_EMAIL_HOST:-}
      - SEATABLE_EMAIL_HOST_USER=${SEATABLE_EMAIL_HOST_USER:-}
      - SEATABLE_EMAIL_HOST_PASSWORD=${SEATABLE_EMAIL_HOST_PASSWORD:-}
      - SEATABLE_EMAIL_PORT=${SEATABLE_EMAIL_PORT:-}
      - SEATABLE_DEFAULT_FROM_EMAIL=${SEATABLE_DEFAULT_FROM_EMAIL:-}
      - SEATABLE_SERVER_EMAIL=${SEATABLE_SERVER_EMAIL:-}
      - SEATABLE_SHOW_TEMPLATES_LINK=${SEATABLE_SHOW_TEMPLATES_LINK:-}
      - SEATABLE_TEMPLATE_BASE_API_TOKEN=${SEATABLE_TEMPLATE_BASE_API_TOKEN:-}
      - SEATABLE_TEMPLATE_TABLE_NAME=${SEATABLE_TEMPLATE_TABLE_NAME:-}
      - SEATABLE_ENABLE_CREATE_BASE_FROM_TEMPLATE=${SEATABLE_ENABLE_CREATE_BASE_FROM_TEMPLATE:-}
      - SEATABLE_HELP_LINK=${SEATABLE_HELP_LINK:-https://docs.seatable.io}
      - SEATABLE_LOG_LEVEL=${SEATABLE_LOG_LEVEL:-INFO}
      - DTABLE_SERVER_CLUSTER_NODE_ID=${DTABLE_SERVER_CLUSTER_NODE_ID:-}
      - DTABLE_SERVER_CLUSTER_NODE_URL=${DTABLE_SERVER_CLUSTER_NODE_URL:-}
      - DTABLE_SERVER_CLUSTER_LOCAL_NODE_URL=${DTABLE_SERVER_CLUSTER_LOCAL_NODE_URL:-}
      - ENABLE_SEAFILE_SERVER=${ENABLE_SEAFILE_SERVER:-true}
      - ENABLE_DTABLE_WEB=${ENABLE_DTABLE_WEB:-true}
      - ENABLE_DTABLE_SERVER=${ENABLE_DTABLE_SERVER:-true}
      - ENABLE_DTABLE_DB=${ENABLE_DTABLE_DB:-true}
      - ENABLE_DTABLE_STORAGE_SERVER=${ENABLE_DTABLE_STORAGE_SERVER:-true}
      - ENABLE_DTABLE_EVENTS=${ENABLE_DTABLE_EVENTS:-true}
      - ENABLE_API_GATEWAY=${ENABLE_API_GATEWAY:-true}
      - DTABLE_EVENTS_TASK_MODE=${DTABLE_EVENTS_TASK_MODE:-all}
            
                
                
#.env
COMPOSE_FILE='docker-compose.yml' # 如果有其它组件还需要加上
COMPOSE_PATH_SEPARATOR=','

SEATABLE_IMAGE=seatable/seatable-enterprise:latest
TIME_ZONE='Europe/Berlin'
JWT_PRIVATE_KEY=xlJXHJ6n7y93D2CfuaZiW7RVq1lvvwjU5YzBTQmU # pwgen -s 40 1

MARIADB_HOST=10.0.0.138 # mariadb 地址
MARIADB_PORT=3306
MARIADB_ROOT_PASSWORD=db_dev # root 密码
MARIADB_USER=seatable
MARIADB_PASSWORD=seatable_password # seatable 密码

REDIS_HOST=10.0.0.138 # redis 地址
REDIS_PORT=6379
REDIS_PASSWORD=

SEATABLE_SERVER_HOSTNAME=seatable-cluster.seafile.com # 负载均衡节点域名
SEATABLE_SERVER_PROTOCOL=https # 由负载均衡器负载 tls 部分

SEATABLE_ADMIN_EMAIL=admin@seatable.com # 初始管理员账号密码
SEATABLE_ADMIN_PASSWORD=admin_password

ENABLE_SEAFILE_SERVER=false
ENABLE_DTABLE_WEB=false
ENABLE_DTABLE_SERVER=false
ENABLE_DTABLE_DB=false
ENABLE_DTABLE_STORAGE_SERVER=true # 对于除 api-gateway 的每个 seatable 集群中的组件,dtable_storage_server 服务应该保持开启
ENABLE_DTABLE_EVENTS=false
ENABLE_API_GATEWAY=false
DTABLE_EVENTS_TASK_MODE=all
如果没有 license 文件,SeaTable 将无法启动(表现为 seaf-server 启动失败)
启动服务, 生成配置文件,初始化数据库
            
                
                
docker compose up
稍等片刻,当您在输出日志中看到 ' This is a idle script (infinite loop) to keep container running' 时, 配置文件创建 成功。 然后关闭服务(此时服务不能正常使用)
            
                
                
docker compose down
目前大部分公共变量(Redis, Mariadb, JWT key) 可通过环境变量配置且已在上述的 .env 中配置了,因此不用关心配置文件中关于这部分变量的操作。但依然需要对一些配置文件进行改动,主要是添加一些集群相关的配置,位于 /opt/seatable-server/seatable/conf 目录下:
dtable_server_config.json
            
                
                
{
    "enable_cluster": true,
    "dtable_web_service_url": "https://seatable-cluster.seafile.com/",
    "dtable_db_service_url": "http://10.0.0.109:7778/dtable-db/",
    "cluster_config":{
        "etcd_host_list": [
            "10.0.0.60:2379",
            "10.0.0.9:2379"
        ]
    }
}
dtable_web_settings.py
            
                
                
INNER_DTABLE_DB_URL = 'http://10.0.0.109:7778/dtable-db/'
INNER_DTABLE_SERVER_URL = 'http://10.0.0.109:7778/dtable-server/'
ENABLE_DTABLE_SERVER_CLUSTER = True
ETCD_SERVER_HOST_LIST = [
                        '10.0.0.60',
                        '10.0.0.9'
                        ]
dtable-db.conf
            
                
                
[general]
host = 0.0.0.0 # 改成 0.0.0.0 否则 dtable-inner-proxy 和 api-gateway 将无法连接
port = 7777
log_dir = /opt/seatable/logs

[dtable cache]
dtable_server_url = "http://10.0.0.109:7778/dtable-server/" # dtable-inner-proxy 地址
dtable-api-gateway.conf
            
                
                
[general]
host = 0.0.0.0
port = 7780
log_dir = log
log_level = info
max_base_cache_size = 1024

[cluster]
etcd_endpoints = 10.0.0.60:2379,10.0.0.9:2379 # etcd 地址逗号分隔

[dtable-db]
inner_dtable_db_url = http://10.0.0.109:7777/ # dtable-db 地址

[dtable-server]
cluster_mode = true
⚠️ 需要注意:
  1. 目前 seatable 集群中对于 dtable-db 服务应当只启动一个,因此虽然 api-gateway.conf 的 [dtable-db] 小节提供了 cluster_mode 选项,但应当保持关闭(默认为关闭)
  2. api-gateway 不经过 dtable-inner-proxy, inner_dtable_db_url 直接写 dtable-db 地址
修改配置文件并启动节点 frontend-1
主要是修改 .env, 启动 seaf-server, dtable-web, dtable-events (前端)及 dtable-storage-server 四个服务
            
                
                
ENABLE_SEAFILE_SERVER=true # 改成 true
ENABLE_DTABLE_WEB=true # 改成 true
ENABLE_DTABLE_SERVER=false
ENABLE_DTABLE_DB=false
ENABLE_DTABLE_STORAGE_SERVER=true
ENABLE_DTABLE_EVENTS=true # 改成 true
ENABLE_API_GATEWAY=false
DTABLE_EVENTS_TASK_MODE=foreground # 改成 foreground
启动节点 frontend-1
            
                
                
docker compose up -d
如果发现账号密码错误或不存在应该是没有创建管理员账户,可以通过 docker exec -it seatable-server /templates/seatable.sh superuser   创建
节点 frontend-2 (或其它 frontend 节点)
参考 frontend-1 修改 .env ,然后启动节点 frontend-2
            
                
                
docker compose up -d
节点 dtable-server-1
修改 .env, 仅启动 dtable-server 和 dtable-storage-server 服务, 并 添加 node 信息
            
                
                
ENABLE_SEAFILE_SERVER=false
ENABLE_DTABLE_WEB=false
ENABLE_DTABLE_SERVER=true # 改成 true
ENABLE_DTABLE_DB=false
ENABLE_DTABLE_STORAGE_SERVER=true
ENABLE_DTABLE_EVENTS=false
ENABLE_API_GATEWAY=false
DTABLE_EVENTS_TASK_MODE=all

DTABLE_SERVER_CLUSTER_NODE_ID=dtable-server-1
DTABLE_SERVER_CLUSTER_LOCAL_NODE_URL=http://10.0.0.60:5000/
启动节点 dtable-server-1
            
                
                
docker compose up -d
节点 dtable-server-2 (或其它 dtable-server 节点)
与节点 dtable-server-1 配置方式相同,但需要注意,要将 DTABLE_SERVER_CLUSTER_LOCAL_NODE_URL 改成 http://10.0.0.9:5000/ (即 dtable-server-2 的服务地址)
节点 api-gateway
修改 .env ,只启动 api-gateway 服务,其它均关闭
            
                
                
ENABLE_SEAFILE_SERVER=false
ENABLE_DTABLE_WEB=false
ENABLE_DTABLE_SERVER=false
ENABLE_DTABLE_DB=false
ENABLE_DTABLE_STORAGE_SERVER=false # 改成 false
ENABLE_DTABLE_EVENTS=false
ENABLE_API_GATEWAY=true # 改成 true
DTABLE_EVENTS_TASK_MODE=all
然后启动 api-gateway 节点
            
                
                
docker compose up -d
节点 dtable-db
修改 .env,只启动 dtable-db 和 dtable-storage-server 服务,其它均关闭
            
                
                
ENABLE_SEAFILE_SERVER=false
ENABLE_DTABLE_WEB=false
ENABLE_DTABLE_SERVER=false
ENABLE_DTABLE_DB=true # 改成 true
ENABLE_DTABLE_STORAGE_SERVER=true
ENABLE_DTABLE_EVENTS=false
ENABLE_API_GATEWAY=false
DTABLE_EVENTS_TASK_MODE=all
然后启动 dtable-db 节点
            
                
                
docker compose up -d
节点 dtable-events (后端部分)
修改 .env,启动 seaf-server, dtable-events (设置为后端部分) 和 dtable-storage-server 服务,其它均关闭
            
                
                
ENABLE_SEAFILE_SERVER=true # 修改成 true
ENABLE_DTABLE_WEB=false
ENABLE_DTABLE_SERVER=false
ENABLE_DTABLE_DB=false
ENABLE_DTABLE_STORAGE_SERVER=true
ENABLE_DTABLE_EVENTS=true # 修改成 true
ENABLE_API_GATEWAY=false
DTABLE_EVENTS_TASK_MODE=background # 修改成 background
然后启动 dtable-events 节点
            
                
                
docker compose up -d
节点 dtable-inner-proxy
修改.env
            
                
                
COMPOSE_FILE='dtable-inner-proxy.yml'
COMPOSE_PATH_SEPARATOR=','

DTABLE_INNER_PROXY_IMAGE=docker.seafile.top/seafileltd/dtable-inner-proxy:6.0.0
DTABLE_INNER_PROXY_VOLUME=/opt/seatable-server
dtable-inner-proxy.yml
            
                
                
services:
  dtable-inner-proxy:
    image: ${DTABLE_INNER_PROXY_IMAGE:-seatable/dtable-inner-proxy:5.2-latest}
    container_name: dtable-inner-proxy
    restart: always
    volumes:
      - ${DTABLE_INNER_PROXY_VOLUME:-/opt/seatable-server}:/shared
    ports:
      - "7778:7778"
    environment:
      - LOG_DIR=${LOG_DIR:-/shared/seatable/logs/}
      - SEATABLE_LOG_TO_STDOUT=${SEATABLE_LOG_TO_STDOUT:-false}
      - SEATABLE_MYSQL_DB_HOST=${MARIADB_HOST:-mariadb}
      - SEATABLE_MYSQL_DB_PORT=${MARIADB_PORT:-3306}
      - SEATABLE_MYSQL_DB_USER=${MARIADB_USER:-seatable}
      - SEATABLE_MYSQL_DB_PASSWORD=${MARIADB_PASSWORD:?Variable is not set or empty}
      - SEATABLE_MYSQL_DB_DTABLE_DB_NAME=dtable_db
      - REDIS_HOST=${REDIS_HOST:-redis}
      - REDIS_PORT=${REDIS_PORT:-6379}
      - REDIS_PASSWORD=${REDIS_PASSWORD:-}
      - JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY:?Variable is not set or empty}
dtable-inner-proxy.conf,放到/opt/seatable-server/seatable/conf/目录下, 现在 cloud 不需要配置 cluster,直接请求 dtable-db。
            
                
                
[cluster]
etcd_endpoints = 10.0.0.60:2379,10.0.0.9:2379,10.0.0.109:2379

[dtable-db]
cluster_mode = false
inner_dtable_db_url = http://10.0.0.109:7777

[dtable-server]
cluster_mode = true
节点 cluster-manager
修改.env
            
                
                
COMPOSE_FILE='dtable-cluster-manager.yml'
COMPOSE_PATH_SEPARATOR=','


DTABLE_CLUSTER_MANAGER_IMAGE=seatable/dtable-cluster-manager:1.0.0
DTABLE_CLUSTER_MANAGER_VOLUME=/opt/seatable-server
ETCD_HOST_LIST=10.0.0.60:2379,10.0.0.9:2379,10.0.0.109:2379
dtable-cluster-manager.yml
            
                
                
services:

  dtable-cluster-manager:
    image: ${DTABLE_CLUSTER_MANAGER_IMAGE:-seatable/dtable-cluster-manager:1.0-latest}
    container_name: dtable-cluster-manager
    ports:
      - "5555:5555"
    volumes:
      - ${DTABLE_CLUSTER_MANAGER_VOLUME:-/opt/seatable-server}:/shared
    environment:
      - ETCD_HOST_LIST=${ETCD_HOST_LIST:?Variable is not set or empty}

配置完成后,可以手动 进行一次负载均衡分配
            
                
                
curl -X POST http://10.0.0.109:5555/rebalance/
负载均衡配置
主要是为 frontend 节点创建负载均衡,以及为 api-gateway 添加反向代理
            
                
                
upstream seatable_cluster { # 添加前端dtable-web节点地址
    server 10.0.0.40:80;
    server 10.0.0.28:80;
}

server {
    server_name seatable-cluster.seafile.com
    listen 80;

    # 添加 前端节点的负载均衡配置
    location / {
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
            add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
            return 204;
        }
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";

        proxy_pass http://seatable_cluster;

        proxy_set_header Host $http_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-Host $server_name;
        proxy_set_header X-Forwarded-Proto $scheme; #必须添加不然会出现 csrf 问题
        proxy_read_timeout 1200s;

        # used for view/edit office file via Office Online Server
        client_max_body_size 0;
    }

    # 添加 api-gateway 的配置
    location /api-gateway/ {
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
            add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";
            return 204;
        }
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
        add_header Access-Control-Allow-Headers "deviceType,token, authorization, content-type";

        proxy_pass http://172.16.4.1:7780/;
        proxy_redirect off;
        proxy_set_header Host $http_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-Host $server_name;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_hide_header Access-Control-Allow-Origin;
        proxy_hide_header Access-Control-Allow-Methods;
        proxy_hide_header Access-Control-Allow-Headers;

    }

    # 添加 socket.io 的配置
    location /api-gateway/socket.io/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;

        proxy_pass http://172.16.4.1:7780/socket.io/;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
负载均衡配置完成后就可以为 nginx 配置 https,然后即可访问 seatable-cluster.seafile.com 检查服务是否正常运行.