在以下几项准备工作完成后,开始
开始部署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
⚠️
需要注意:
-
目前 seatable 集群中对于 dtable-db 服务应当只启动一个,因此虽然 api-gateway.conf 的 [dtable-db] 小节提供了 cluster_mode 选项,但应当保持关闭(默认为关闭)
-
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 节点)
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 检查服务是否正常运行.