部署 Python 运行器

本文档适用于新版 Python 运行器,适用于 SeaTable 服务器 4.2 及以上版本
有两种方式部署 SeaTable Python 运行器
  1. 和 SeaTable 部署在同一台主机上
  2. 单独部署在一台主机上
架构
SeaTable 的 Python 脚本运行包含多个部分,SeaTable, Python scheduler, Python starter 和 Python runner,它们的功能与关系如下
  • SeaTable: 新建/保存/修改脚本,发起运行请求等
  • Python scheduler: 调度器,主要负责调度 SeaTable 运行脚本请求、保存/统计脚本运行结果等。相当于一个 master 节点
  • Python starter: 真正运行脚本,相当于一个 worker 节点。Python starter 在收到一个脚本运行请求后,会下载脚本内容并启动一个 Docker 容器来运行这个脚本。脚本运行结束后,容器自动销毁,以此保证安全性。
  • Python runner: 运行脚本的 Docker 容器( 此容器为动态构建 )。
结构图如下
新版 Python 运行器,三个组件均用 docker 方式启动,部署起来更加方便。
和SeaTable部署在同一台主机上
下载 python-pipeline.yml 文件
假设您已经在 /opt/seatable 中安装新版 SeaTable ( 开发者版   企业版
根据您需要的版本,下载   python-pipeline.yml 
为了方便记录与查看日志,可以新建目录存放 SEATABLE_SCHEDULER 与 SEATABLE_STARTER 的日志,之后会一并挂载到 python-pipeline.yml 的两个容器中
            
                
                
mkdir -p /opt/seatable/python-pipeline/logs/scheduler-logs
mkdir -p /opt/seatable/python-pipeline/logs/starter-logs
将示例文件下载到 /opt/seatable ,然后根据您的环境修改 SeaTable 的.env 文件,需要添加以下内容:
            
                
                
COMPOSE_FILE='docker-compose.yml,python-pipeline.yml'


ENABLE_PYTHON_SCRIPT=true
PYTHON_SCHEDULER_AUTH_TOKEN=<token>

PYTHON_SCHEDULER_URL=http://python-scheduler
PYTHON_STARTER_USE_ALTERNATIVE_FILE_SERVER_ROOT=True
PYTHON_STARTER_ALTERNATIVE_FILE_SERVER_ROOT=http://seatable

SEATABLE_MYSQL_DB_SCHEDULER_NAME=scheduler
PYTHON_SCHEDULER_LOGS_DIR=/opt/seatable/python-pipeline/logs/scheduler-logs
PYTHON_STARTER_LOGS_DIR=/opt/seatable/python-pipeline/logs/starter-logs

SEATABLE_SCHEDULER_IMAGE=docker.seafile.top/seafileltd/seatable-python-scheduler:latest
SEATABLE_STARTER_IMAGE=docker.seafile.top/seafileltd/seatable-python-starter:latest
SEATABLE_RUNNER_IMAGE=docker.seafile.top/seafileltd/seatable-python-runner:latest
注意:
  • COMPOSE_FILE 需要添加 python-pipeline.yml
  • PYTHON_SCHEDULER_AUTH_TOKEN 为随机字符串(token 可用命令生成 uuidgen)
  • ENABLE_PYTHON_SCRIPT 为是否启用 Python 运行器
  • PYTHON_SCHEDULER_URL 默认为 http://python-scheduler,其中 python-scheduler 是 docker 环境下 SeaTable 访问 Python scheduler 网络名称,不需要修改这个值。
  • Python 运行器共用 SeaTable MySSQL 数据库,并自动读取已有的配置项(SEATABLE_MYSQL_DB_HOST, SEATABLE_MYSQL_ROOT_PASSWORD)
  • 时区也会读取 SeaTable 已有的配置项(TIME_ZONE)
  • 如果不设置 PYTHON_SCHEDULER_LOGS_DIR 或 PYTHON_STARTER_LOGS_DIR 将会默认使用 SeaTable 的日志目录
修改 seatable 配置文件 conf/dtable_web_settings.py
            
                
                
SEATABLE_FAAS_URL = 'http://python-scheduler'
SEATABLE_FAAS_AUTH_TOKEN = '***' # 与 .env 文件 PYTHON_SCHEDULER_AUTH_TOKEN 的配置相同
为 MySQL 用户进行 Scheduler 数据库授权
            
                
                
docker exec -it seatable-mysql bash # 进入 MySQL容器

mysql -uroot -p[你的 root 用户密码)# 进入 MySQL 环境
create database scheduler;
GRANT ALL PRIVILEGES ON `scheduler`.* to 'seatable'@'%';
FLUSH PRIVILEGES;
重新启动 SeaTable 服务器
            
                
                
docker compose down
docker compose up -d
接下来,您可以通过网站使用 SeaTable Python 运行器。
单独部署在一台主机上
下载 python-pipeline.yml 和 .env 文件
我们建议您在 /opt/seatable-python-pipeline 中安装 SeaTable Python 运行器,先创建目录与日志目录。
            
                
                
mkdir /opt/seatable-python-pipeline
mkdir -p /opt/seatable-python-pipeline/logs/scheduler-logs
mkdir -p /opt/seatable-python-pipeline/logs/starter-logs
如果您需要连接其他 MySQL 数据库而不是使用默认的 Python pipeline MySql,需要修改 docker-compose.yml,用 # 符号去掉 db 整个章节
            
                
                
# db:
# image: mariadb:10.11
# restart: unless-stopped
# container_name: python-pipeline-mysql
# volumes:
# ...
# environment:
# ...
# networks:
# ...
根据您需要的版本,下载  python-pipeline.yml 和 .env  (文件名前包含 ‘.’)
将示例文件下载到 /opt/seatable-python-pipeline ,然后根据您的环境修改.env 文件,需要修改以下字段:
  • MySQL 服务器地址(SEATABLE_MYSQL_DB_HOST)
  • MySQL 服务器监听端口(SEATABLE_MYSQL_DB_PORT)
  • MySQL 用户名(SEATABLE_MYSQL_DB_USER)
  • MySQL 用户密码(SEATABLE_MYSQL_DB_PASSWORD)
  • MySQL 所使用的数据库( SEATABLE_MYSQL_DB_SCHEDULER_NAME)
  • SeaTable 服务所使用传输协议(SEATABLE_SERVER_PROTOCOL),http 或者 https
  • SeaTable 主机名(SEATABLE_SERVER_HOSTNAME)
  • token 随机字符串 (token 可用命令生成 uuidgen)(PYTHON_SCHEDULER_AUTH_TOKEN)
  • 时区(TIME_ZONE 可选)
  • 如果不设置 PYTHON_SCHEDULER_LOGS_DIR 或 PYTHON_STARTER_LOGS_DIR 将会默认使用服务运行目录下的 seatable-python-pipeline-logs 目录
修改运行 SeaTable 的目录下的 .env 文件
请将以下内容添加到 运行 SeaTable 的目录下的 .env 文件中
            
                
                
ENABLE_PYTHON_SCRIPT=true
PYTHON_SCHEDULER_URL=http://scheduler-demo.seatable.com
PYTHON_SCHEDULER_AUTH_TOKEN=*** # 与部署 python-pipeline 的 .env 文件中的值相同
修改 seatable 配置文件 conf/dtable_web_settings.py
            
                
                
SEATABLE_FAAS_URL = 'http://scheduler-demo.seatable.com'
SEATABLE_FAAS_AUTH_TOKEN = '***' # 与 .env 文件 PYTHON_SCHEDULER_AUTH_TOKEN 的配置相同
然后重新启动 SeaTable 服务器
            
                
                
docker compose down && docker compose up -d
为 MySQL 用户进行 scheduler 数据库鉴权
            
                
                
mysql -uroot -p[你的 root 用户密码)# 进入 MySQL 环境
create database scheduler; # scheduler 应改成与 SEATABLE_MYSQL_DB_SCHEDULER_NAME 一致的变量名
GRANT ALL PRIVILEGES ON `scheduler`.* to 'seatable'@'%'; # seatable 应改成对应的 MySQL 用户
FLUSH PRIVILEGES;
启动 SeaTable Python 运行器
最后在前往运行 Python 运行器的目录下启动相关服务
            
                
                
docker compose up -d
接下来,您可以通过网站使用 SeaTable Python 运行器。
高级设置
您可以根据需要,在.env 文件中添加或修改高级配置,例如
            
                
                
PYTHON_SCHEDULER_SCRIPT_WORKERS=5
PYTHON_PROCESS_TIMEOUT=900

PYTHON_STARTER_THREAD_COUNT=10
PYTHON_STARTER_USE_ALTERNATIVE_FILE_SERVER_ROOT=
PYTHON_STARTER_ALTERNATIVE_FILE_SERVER_ROOT=

PYTHON_RUNNER_OUTPUT_LIMIT=1000000
PYTHON_RUNNER_CONTAINER_MEMORY=2g
PYTHON_RUNNER_CONTAINER_CPUS=
PYTHON_RUNNER_OTHER_OPTIONS=
设置脚本超时时间
对脚本运行限制时间,默认为 15 分钟
            
                
                
PYTHON_PROCESS_TIMEOUT=900
设置内网访问脚本文件
由于用户网络环境各不相同,如果 Python 运行器只可访问内网不可访问外网的情况下,则不可以下载脚本并运行。为了解决这个问题,新增加两个配置,可以使得 Python 运行器从内网访问下载脚本
在配置文件中添加如下配置并保存
            
                
                
PYTHON_STARTER_ALTERNATIVE_FILE_SERVER_ROOT='http://xxx.xxx.xxx.xxx:xxx/'
# 内网 FILE_SERVER_ROOT 地址
PYTHON_STARTER_USE_ALTERNATIVE_FILE_SERVER_ROOT=True
增加Docker占用资源限制
在配置文件中,添加或修改如下内容
            
                
                
PYTHON_RUNNER_CONTAINER_MEMORY='2g'
# 最大2GB的内存
有些系统,例如 Ubuntu 或基于 Debian 的系统,不支持限制容器内存,在运行脚本时会看到类似如下警告
            
                
                
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
这种情况下,可以将 PYTHON_RUNNER_CONTAINER_MEMORY 设置为 0
            
                
                
PYTHON_RUNNER_CONTAINER_MEMORY=0
或者修改宿主机的配置以便支持上面的选项:
            
                
                
sudo vim /etc/default/grub
添加或修改以下内容
            
                
                
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
保存并退出文件,更新 GRUB
            
                
                
sudo update-grub
重启宿主机,配置生效
相关文档
其他docker设置
实验性功能,请谨慎修改
由于需求各不相同,在 OTHER_OPTIONS 中可以设置所有 docker 官方文档中的支持命令,但选项必须以 “--< 选项名称>=< 值 >” 的形式设置,例如,若需要将目录挂载到容器内
            
                
                
PYTHON_RUNNER_OTHER_OPTIONS='["--volume=/home/seatable:/data",]'
# 宿主机 /home/seatable 挂载到容器内 /data
注意:方括号 [] 两侧需要添加单引号 '
关于Https
因 Python 运行器仅在内网环境运行,不再支持使用 SSL 证书
日志与常见问题排查
日志位置
python-scheduler
位于宿主机上的.env 文件中的 PYTHON_SCHEDULER_LOGS_DIR 目录下,如果该目录未设置,则在宿主机的 /tmp 目录
python-starter
位于宿主机上的.env 文件中 PYTHON_STARTER_LOGS_DIR 对应的目录下,如果未设置则在宿主机的 /tmp 目录
常见问题与排查
一般按照相关容器是否启动、配置是否正确、网络是否相通、程序是否出错的顺序进行问题排查
容器是否启动
在服务器中使用 docker ps 命令查看相关容器,python-scheduler、python-starter 是否已启动。
配置是否正确、网络是否相通
seatable 与 python-scheduler
查看 seatable 的配置,conf/dtable_web_settings.py,有一项
            
                
                
SEATABLE_FAAS_URL = 'http://python-scheduler'
# 部署同一机器上一般是上面默认的值,如果 python-scheduler 容器与 seatable 容器处于同一个网络中一般不会有问题
当部署不在同一机器上时,需要查看下 seatable 机器是否可访问 SEATABLE_FAAS_URL 中的地址
seatable 还有一项配置
            
                
                
SEATABLE_FAAS_AUTH_TOKEN = 'xxx'
# 用于 python-scheduler 的鉴权,需要 seatable 与 python-scheduler 的值相同
seatable 与 python-starter
如果运行脚本时报错获取脚本失败,一般情况为 python-starter 容器中不可访问 seatable,如果部署在同一台机器上且按照文档部署,应该不会出现这种错误
当分开部署时,可以对 python-starter 重新设置获取脚本地址,在上文部署文档中查找“ 设置内网访问脚本” 
应用程序报错
脚本运行超时
默认配置下,脚本运行超时时间为十五分钟,可以根据上文中的 “设置脚本超时时间”  更改时长
但如果您确认脚本很快就会输出,需要查看输出是否会很大,精简输出后尝试再次运行
脚本本身报错
脚本本身报错不是部署的问题,需要您修改脚本
其他错误
按照上文中的顺序,查看网络与配置后再排查 seatable 与上文各日志输出排查或反馈问题