众所周知的 Seafile 老用户了,家里的私有云盘一直在使用 Seafile。有时候收集或分享文件时也会直接甩 Seafile 链接,Seafile 可以很好的存储和分享文件。

最近一直再找一个笔记软件(要求是啥都能存),有事没事打算记录点啥东西,试过 Typora,试过 OneNote,试过 MyBase,甚至是为知笔记(私有部署版),总觉得差点什么。

突然发现 Seafile 团队搞的一个新产品叫 SeaTable,按照官方的说法:

SeaTable 是一款新型的在线协同表格和信息管理工具。它支持“文件”、“图片”、“单选项”、“协作人”、“计算公式”等丰富的数据类型。它帮助你用表格的形式来方便的组织和管理各类信息,同时又和专门的软件系统一样强大。它还可以按照你的需要进行扩展,实现数据处理的自动化和业务流程的自动化。

咦,这不就是我要找的可以啥都能存的小工具么,好像还能写脚本自动化的搞一些事情。看起来不错哦~ 于是花了点时间上了一台 SeaTable 打算使用一下。CentOS 更新策略变了,是时候选择一个“下一代”的服务器操作系统了,不打算再新装 CentOS7 了,一直关注 OpenEuler 社区,正好搞一波 OpenEuler。本文主要是在 OpenEuler 平台下 Docker 部署 SeaTable 的小记。

大坑警告

建议先避开如下的坑,有助于提高部署效率。

  • 如果你之前有了 Seafile 环境,千万不要将 SeaTable 和 Seafile 部署在同一台机器上。可能会出现很多莫名其妙的问题,虽然后续可以解决,但是 debug 起来非常麻烦。。
  • docker 起来之后还要起一下 seatable 服务。。否则就一直 502。。
  • 如果需要跑 Python 脚本去处理复杂业务,需要额外部署脚本节点。。

部署

本节大概分安装 OpenEuler 系统,安装 Docker,启动 SeaTable,最后的配置几部分。

安装 OpenEuler

按照 SeaTable 官方文档要求,推荐配置是 4C8G,先搞个虚拟机,然后正常最小化安装系统,建议搞个 LVM 分区,安装系统的部分略过。。。

安装 Docker

暂时没用 iSula,还是装 Docker。先搞一个 DockerCE 源。

1
2
3
4
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 切换成清华源
cd /etc/yum.repos.d/
sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

简单修改一下 docker-ce.repo。

1
2
3
4
sudo vi docker-ce.repo
# 不把$releasever换成8,读源的时候会404哦,如下图。
:%s/$releasever/8/g
:wq

ec12175fa98ca1758452cfc9662d581

开始安装 Docker。

1
sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose --nobest -y

关闭防火墙,配置 Docker 开启自启。

1
2
3
4
systemctl stop firewalld
systemctl disable firewalld
systemctl enable docker
systemctl start docker

启动 SeaTable

Docker 的好处就是即开即用。所以到了这一步已经完成一大半了。
建立一个数据存储目录,这个目录是要映射给 Docker 容器做数据持久化存储的。我就放在 /data 下了。/data/docker 放 compose 文件,/data/seatable 放 SeaTable 的持久化数据文件。
拉取一份 docker-compose,改一下。

1
2
wget https://docs.seatable.cn/d/2af5c4bcb8e14f1b85f7/files/?p=/docker/seatable-ce/docker-compose.yml&dl=1
vim docker-compose.yml

你也可以直接用我改好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
version: '2.0'
services:
db:
image: mariadb:10.5
container_name: seatable-mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD} # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
volumes:
- /data/seatable/mysql-data:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
networks:
- seatable-net

memcached:
image: memcached:1.5.6
container_name: seatable-memcached
entrypoint: memcached -m 256
networks:
- seatable-net

redis:
image: redis:5.0.7
container_name: seatable-redis
networks:
- seatable-net

seatable:
image: seatable/seatable:latest
container_name: seatable
ports:
- "80:80" # HTTP 端口映射外部端口:内部端口,只需要关心外部端口即可。
- "443:443" # HTTPS端口映射。
volumes:
- /data/seatable/seatable-data:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=${MYSQL_PASSWORD} # Requested, the value shuold be root's password of MySQL service.
- SEATABLE_SERVER_LETSENCRYPT=False # Default is False. Whether to use let's encrypt certificate.
- SEATABLE_SERVER_HOSTNAME=table.txisfine.cn # Specifies your host name.
- TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone.
depends_on:
- db
- memcached
- redis
networks:
- seatable-net

networks:
seatable-net:

在 docker-compose.yml 同目录下建立.env,用于存放 MySQL 密码。

1
2
3
4
5
vim .env
# 文件内容
MYSQL_PASSWORD=PleaseChangeME
# 文件内容结束
:wq

开始拉起容器。

1
docker-compose up

这时候会打印出一些日志,当看到 This is a idle script (infinite loop) to keep container running 时,数据库已初始化成功。可以先 Ctrl+C 杀掉容器,转为后台运行。

1
docker-compose up -d

最后的配置

docker ps ,应该能看到正在运行的容器,这表示 SeaTable 容器已经起来了,这时候还需要我们手动配置一下。

  • 启动 SeaTable 服务:docker exec -d seatable /shared/seatable/scripts/seatable.sh start
  • 创建管理员用户:docker exec -it seatable /shared/seatable/scripts/seatable.sh superuser
  • 配置 SeaTable URL:
1
2
3
4
5
6
7
8
9
# 编辑dtable配置文件,默认是在/映射的数据卷/seatable-data/seatable/conf/里
vim dtable_web_settings.py
# 配置成你的SeaTable域名,是啥也啥,有端口也要写上。
DTABLE_SERVER_URL = 'https://et.txisfine.cn:6666/dtable-server/'
DTABLE_SOCKET_URL = 'https://et.txisfine.cn:6666/'
# 供用户访问SeaTable服务器的 dtable web的URL
DTABLE_WEB_SERVICE_URL = 'https://et.txisfine.cn:6666/'
# 文件服务器URL
FILE_SERVER_ROOT = 'https://et.txisfine.cn:6666/seafhttp/'
  • 配置 HTTPS:
    首先 Docker 得先把 HTTPS 端口映射出来。有证书,或者申请让老子加密(LetsEncrypt)证书。
    上传证书:证书路径是/映射的数据卷/seatable-data/ssl/
    修改 Nginx 配置,默认路径:/映射的数据卷/seatable-data/,下面是一个 Demo 配置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
server_name 域名;
# 因为容器内的Nginx,监听的就是443端口,容器端口映射是在docker-compose里配的
listen 443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# 需要和SSL证书位置保持一致
ssl_certificate /shared/ssl/domain.pem;
ssl_certificate_key /shared/ssl/domain.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
# ...
  • 如果你是特殊端口,即从特殊端口的 HTTP 跳转到 HTTPS,避免 497 错误。
1
2
3
4
5
server {
# ....
# 400 Bad Request: The plain HTTP request was sent to HTTPS port
error_page 497 =301 https://$server_name:<Docker映射出去的特殊端口>$request_uri;
# ....
  • 如果你是标准端口,即从 80 跳转 443。
1
2
3
4
5
6
7
8
9
10
# 官方写法,example.seatable.com为你的域名
server {
if ($host = example.seatable.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name example.seatable.com;
return 404;
}

坐和放宽,改完配置需要重启 Nginx 和 SeaTable 服务。

1
2
3
4
5
#重启SeaTable
docker exec -d seatable /shared/seatable/scripts/seatable.sh restart
#校验Nginx配置并重载配置
docker exec -d seatable nginx -t
docker exec -d seatable nginx -s reload

功能体验

用户登录页:
20211129223138
用户工作区:
20211129223110
20211129223158
表格:
20211129223303
高级插件:
20211129223327
统计:
20211129223352
表单收集:
20211129223432
管理面板:
20211129223648
插件市场:
20211129223836

TODO

  • 对接企业微信
  • 搭建脚本节点
  • 对接 Seafile
  • ….

参考文档