版本比较
标识
- 该行被添加。
- 该行被删除。
- 格式已经改变。
简介
和之前的版本相比,6.0 版本有了以下的改进
- 增加了 AI 的接入支持
- 插件中增加了 Calendar, Kanban, 和 Gallery 组件
- 数据类型中增加了 手机 字段
- 其它的一些优化改进的内容
从 5.0.7 或 5.0.10 可以直接升级无需调整对应的配置文件内容。
| 信息 |
|---|
如果配置了 Python 的运行环境,需要同时调整 Python 运行环境的容器镜像版本 |
由 5.0.10 升级到 6.0.10 (无 Python 环境)
.env
| 代码块 | ||
|---|---|---|
| ||
# components to be used; IMPORTANT: there should be no space between the files names ! COMPOSE_FILE='seatable-server.yml' COMPOSE_PATH_SEPARATOR=',' # system settings TIME_ZONE='Asia/Shanghai' # seatable server url SEATABLE_SERVER_HOSTNAME='table.waringid.me' SEATABLE_SERVER_PROTOCOL='https' # initial web admin SEATABLE_ADMIN_EMAIL='13601@139.com' SEATABLE_ADMIN_PASSWORD='password' # database SEATABLE_MYSQL_ROOT_PASSWORD='password' MARIADB_PASSWORD='password' # redis REDIS_PASSWORD='password' JWT_PRIVATE_KEY=='password' |
seatable-server.yml
| 信息 |
|---|
需要注意的是除了 seatable 的版本升级了外,数据库和 Redis 的版本也调整到较新的版本 |
| 代码块 | ||
|---|---|---|
| ||
---
services:
seatable-server:
image: ${SEATABLE_IMAGE:-seatable/seatable-enterprise:6.0.10}
restart: unless-stopped
container_name: seatable-server
ports:
- "8006:80"
volumes:
- "${SEATABLE_DIR}/seatable-server:/shared"
- "${SEATABLE_DIR}/deps/seatable.sh:/templates/seatable.sh:rx"
- "${SEATABLE_DIR}/deps/licenseparse.py:/opt/seatable/seatable-server-latest/dtable-web/seahub/utils/licenseparse.py:rw"
- "${SEATABLE_DIR}/deps/seafile-controller:/opt/seatable/seatable-server-latest/seafile/bin/seafile-controller:rw"
- "${SEATABLE_DIR}/deps/seaf-server:/opt/seatable/seatable-server-latest/seafile/bin/seaf-server:rw"
environment:
- SEATABLE_MYSQL_DB_HOST=${MARIADB_HOST:-mariadb}
- SEATABLE_MYSQL_DB_PORT=${MARIADB_PORT:-3306}
- SEATABLE_MYSQL_DB_USER=root
- SEATABLE_MYSQL_DB_PASSWORD=${MARIADB_PASSWORD:?Variable is not set or empty}
- INIT_SEATABLE_MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD:-${MARIADB_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:?Variable is not set or empty}
- JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY:?Variable is not set or empty}
- 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}
- ENABLE_PYTHON_SCRIPT=${ENABLE_PYTHON_SCRIPT:-true}
- 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://help.seatable.com}
- SEATABLE_LOG_LEVEL=${SEATABLE_LOG_LEVEL:-INFO}
- ENABLE_SEATABLE_AI=${ENABLE_SEATABLE_AI:-false}
- SEATABLE_AI_SERVER_URL=${SEATABLE_AI_SERVER_URL:-http://seatable-ai:8888}
depends_on:
mariadb:
condition: service_healthy
redis:
condition: service_healthy
networks:
- frontend-net
- backend-seatable-net
# healthcheck specifically for dtable-web
healthcheck:
test: ["CMD-SHELL", "curl --fail http://localhost:8000 || exit 1"]
interval: 20s
retries: 3
start_period: 30s
timeout: 10s
mariadb:
image: ${SEATABLE_DB_IMAGE:-mariadb:11.8.3-noble}
restart: unless-stopped
container_name: mariadb
command: ["mariadbd", "--innodb_snapshot_isolation=OFF"]
environment:
- MYSQL_ROOT_PASSWORD=${SEATABLE_MYSQL_ROOT_PASSWORD:?Variable is not set or empty}
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
- TZ=${TIME_ZONE}
volumes:
- "${SEATABLE_DIR}/mariadb:/var/lib/mysql"
networks:
- backend-seatable-net
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--connect",
"--mariadbupgrade",
"--innodb_initialized",
]
interval: 20s
retries: 3
start_period: 30s
timeout: 10s
# On older database containers without healthcheck users present you might need to create them manually,
# otherwise the container stays unhealthy.
redis:
image: ${SEATABLE_REDIS_IMAGE:-redis:8.2.2-bookworm}
restart: unless-stopped
container_name: redis
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD:?Variable is not set or empty}
command:
- /bin/sh
- -c
- redis-server --requirepass "$${REDIS_PASSWORD:?REDIS_PASSWORD variable is not set}"
networks:
- backend-seatable-net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 20s
retries: 3
timeout: 5s
networks:
frontend-net:
name: frontend-net
backend-seatable-net:
name: backend-seatable-net |
上述的配置文件是升级安装的内容,如果是首次安装需要调整以下的内容,详细邪恶配置也可以直接参考官网的说明。【https://admin.seatable.com/】

Nginx.conf
通过版本升级的方式安装无需调整 Nginx 的配置,保留已有的配置即可。
启动
完成上述的检查调整后即可启动镜像并验证是否正常
| 代码块 | ||
|---|---|---|
| ||
docker-compose -f seatable-server.yml --env-file=./.env up |
[+] Running 5/5
✔ Network backend-seatable-net Created 0.1s
✔ Network frontend-net Created 0.1s
✔ Container mariadb Created 0.3s
✔ Container redis Created 0.3s
✔ Container seatable-server Created 0.1s
Attaching to mariadb, redis, seatable-server
redis | 10:C 06 Feb 2026 23:03:46.360 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis | 10:C 06 Feb 2026 23:03:46.360 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis | 10:C 06 Feb 2026 23:03:46.360 * Redis version=8.2.2, bits=64, commit=00000000, modified=1, pid=10, just started
redis | 10:C 06 Feb 2026 23:03:46.360 * Configuration loaded
redis | 10:M 06 Feb 2026 23:03:46.360 * Increased maximum number of open files to 10032 (it was originally set to 1024).
redis | 10:M 06 Feb 2026 23:03:46.360 * monotonic clock: POSIX clock_gettime
redis | 10:M 06 Feb 2026 23:03:46.362 * Running mode=standalone, port=6379.
redis | 10:M 06 Feb 2026 23:03:46.362 * Server initialized
redis | 10:M 06 Feb 2026 23:03:46.362 * Ready to accept connections tcp
mariadb | 2026-02-07 07:03:46+08:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.3+maria~ubu2404 started.
mariadb | 2026-02-07 07:03:46+08:00 [Warn] [Entrypoint]: /sys/fs/cgroup///memory.pressure not writable, functionality unavailable to MariaDB
mariadb | 2026-02-07 07:03:46+08:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mariadb | 2026-02-07 07:03:46+08:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.8.3+maria~ubu2404 started.
mariadb | 2026-02-07 07:03:46+08:00 [Note] [Entrypoint]: Starting temporary server
mariadb | 2026-02-07 07:03:46+08:00 [Note] [Entrypoint]: Waiting for server startup
mariadb | 2026-02-07 7:03:46 0 [Note] Starting MariaDB 11.8.3-MariaDB-ubu2404 source revision b565b3e7e041c480fd8013e3beec6b99544d6bf8 server_uid N22O+99Hwtag4eZAFl0mpoN4hnI= as process 56
mariadb | 2026-02-07 7:03:46 0 [Note] InnoDB: Compressed tables use zlib 1.3
mariadb | 2026-02-07 7:03:46 0 [Note] InnoDB: Number of transaction pools: 1
mariadb | 2026-02-07 7:03:46 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
mariadb | 2026-02-07 7:03:46 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts)
mariadb | 2026-02-07 7:03:46 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup).
mariadb | create_uring failed: falling back to libaio
mariadb | 2026-02-07 7:03:46 0 [Note] InnoDB: Using Linux native AIO
mariadb | 2026-02-07 7:03:46 0 [Note] InnoDB: innodb_buffer_pool_size_max=128m, innodb_buffer_pool_size=128m
mariadb | 2026-02-07 7:03:46 0 [Note] InnoDB: Completed initialization of buffer pool
mariadb | 2026-02-07 7:03:46 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes)
mariadb | 2026-02-07 7:03:47 0 [Note] InnoDB: End of log at LSN=107464838
mariadb | 2026-02-07 7:03:47 0 [Note] InnoDB: Opened 3 undo tablespaces
mariadb | 2026-02-07 7:03:47 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active.
mariadb | 2026-02-07 7:03:47 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ...
mariadb | 2026-02-07 7:03:47 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
mariadb | 2026-02-07 7:03:47 0 [Note] InnoDB: log sequence number 107464838; transaction id 182771
mariadb | 2026-02-07 7:03:47 0 [Note] Plugin 'FEEDBACK' is disabled.
mariadb | 2026-02-07 7:03:47 0 [Note] Plugin 'wsrep-provider' is disabled.
mariadb | 2026-02-07 7:03:48 0 [Note] mariadbd: ready for connections.
mariadb | Version: '11.8.3-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 0 mariadb.org binary distribution
mariadb | 2026-02-07 07:03:48+08:00 [Note] [Entrypoint]: Temporary server started.
mariadb | 2026-02-07 07:03:48+08:00 [Note] [Entrypoint]: Backing up system database to system_mysql_backup_11.4.3-MariaDB.sql.zst
mariadb | 2026-02-07 07:03:49+08:00 [Note] [Entrypoint]: Backing up complete
mariadb | 2026-02-07 07:03:49+08:00 [Note] [Entrypoint]: Starting mariadb-upgrade
mariadb | The --upgrade-system-tables option was used, user tables won't be touched.
mariadb | Major version upgrade detected from 11.4.3-MariaDB to 11.8.3-MariaDB. Check required!
mariadb | Phase 1/8: Checking and upgrading mysql database
mariadb | Processing databases
mariadb | mysql
mariadb | mysql.column_stats OK
mariadb | mysql.columns_priv OK
mariadb | mysql.db OK
mariadb | mysql.event OK
mariadb | mysql.func OK
mariadb | mysql.global_priv OK
mariadb | mysql.gtid_slave_pos OK
mariadb | mysql.help_category OK
mariadb | mysql.help_keyword OK
mariadb | mysql.help_relation OK
mariadb | mysql.help_topic OK
mariadb | mysql.index_stats OK
mariadb | mysql.innodb_index_stats OK
mariadb | mysql.innodb_table_stats OK
mariadb | mysql.plugin OK
mariadb | mysql.proc OK
mariadb | mysql.procs_priv OK
mariadb | mysql.proxies_priv OK
mariadb | mysql.roles_mapping OK
mariadb | mysql.servers OK
mariadb | mysql.table_stats OK
mariadb | mysql.tables_priv OK
mariadb | mysql.time_zone OK
mariadb | mysql.time_zone_leap_second OK
mariadb | mysql.time_zone_name OK
mariadb | mysql.time_zone_transition OK
mariadb | mysql.time_zone_transition_type OK
mariadb | mysql.transaction_registry OK
mariadb | Phase 2/8: Installing used storage engines... Skipped
mariadb | Phase 3/8: Running 'mysql_fix_privilege_tables'
mariadb | Phase 4/8: Fixing views... Skipped
mariadb | Phase 5/8: Fixing table and database names ... Skipped
mariadb | Phase 6/8: Checking and upgrading tables... Skipped
mariadb | Phase 7/8: uninstalling plugins
mariadb | Phase 8/8: Running 'FLUSH PRIVILEGES'
mariadb | OK
mariadb | 2026-02-07 07:03:51+08:00 [Note] [Entrypoint]: Finished mariadb-upgrade
mariadb | 2026-02-07 07:03:51+08:00 [Note] [Entrypoint]: Stopping temporary server
mariadb | 2026-02-07 7:03:51 0 [Note] mariadbd (initiated by: unknown): Normal shutdown
mariadb | 2026-02-07 7:03:51 0 [Note] InnoDB: FTS optimize thread exiting.
mariadb | 2026-02-07 7:03:51 0 [Note] InnoDB: Starting shutdown...
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Removed temporary tablespace data file: "./ibtmp1"
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Shutdown completed; log sequence number 107464838; transaction id 182775
mariadb | 2026-02-07 7:03:52 0 [Note] mariadbd: Shutdown complete
mariadb | 2026-02-07 07:03:52+08:00 [Note] [Entrypoint]: Temporary server stopped
mariadb | 2026-02-07 7:03:52 0 [Note] Starting MariaDB 11.8.3-MariaDB-ubu2404 source revision b565b3e7e041c480fd8013e3beec6b99544d6bf8 server_uid N22O+99Hwtag4eZAFl0mpoN4hnI= as process 1
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Compressed tables use zlib 1.3
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Number of transaction pools: 1
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Using crc32 + pclmulqdq instructions
mariadb | 2026-02-07 7:03:52 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts)
mariadb | 2026-02-07 7:03:52 0 [Warning] mariadbd: io_uring_queue_init() failed with EPERM: sysctl kernel.io_uring_disabled has the value 2, or 1 and the user of the process is not a member of sysctl kernel.io_uring_group. (see man 2 io_uring_setup).
mariadb | create_uring failed: falling back to libaio
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Using Linux native AIO
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: innodb_buffer_pool_size_max=128m, innodb_buffer_pool_size=128m
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Completed initialization of buffer pool
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: File system buffers for log disabled (block size=512 bytes)
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: End of log at LSN=107464838
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Opened 3 undo tablespaces
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: 128 rollback segments in 3 undo tablespaces are active.
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ...
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: log sequence number 107464838; transaction id 182771
mariadb | 2026-02-07 7:03:52 0 [Note] Plugin 'FEEDBACK' is disabled.
mariadb | 2026-02-07 7:03:52 0 [Note] Plugin 'wsrep-provider' is disabled.
mariadb | 2026-02-07 7:03:52 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
mariadb | 2026-02-07 7:03:53 0 [Note] InnoDB: Buffer pool(s) load completed at 260207 7:03:53
mariadb | 2026-02-07 7:03:57 0 [Note] Server socket created on IP: '0.0.0.0', port: '3306'.
mariadb | 2026-02-07 7:03:57 0 [Note] Server socket created on IP: '::', port: '3306'.
mariadb | 2026-02-07 7:03:57 0 [Note] mariadbd: Event Scheduler: Loaded 0 events
mariadb | 2026-02-07 7:03:57 0 [Note] mariadbd: ready for connections.
mariadb | Version: '11.8.3-MariaDB-ubu2404' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
seatable-server | *** Running /etc/my_init.d/01_init.sh...
seatable-server | *** Booting runit daemon...
seatable-server | *** Runit started as PID 15
seatable-server | *** Running /templates/enterpoint.sh...
seatable-server | 2026-02-07 07:04:07 Conf exists
seatable-server | 2026-02-07 07:04:07 Nginx ready
seatable-server | 2026-02-07 07:04:07 Updating CA certificates...
seatable-server | 2026-02-07 07:04:13 Start server
seatable-server | Check SeaTable License!
seatable-server |
seatable-server | SeaTable started
seatable-server |
seatable-server | 2026-02-07 07:04:17 For more startup information, please check the /opt/seatable/logs/init.log
seatable-server | 2026-02-07 07:04:17 This is an idle script (infinite loop) to keep the container running.

Python 环境 5.0.7 升级到 6.0.10
.env
| 代码块 | ||
|---|---|---|
| ||
# components to be used; IMPORTANT: there should be no space between the files names !
COMPOSE_FILE='seatable-server.yml'
COMPOSE_PATH_SEPARATOR=','
# system settings
TIME_ZONE='Asia/Shanghai'
# seatable server url
SEATABLE_SERVER_HOSTNAME='seatable.waringid.me'
SEATABLE_SERVER_PROTOCOL='https'
# initial web admin
SEATABLE_ADMIN_EMAIL='1361@139.com'
SEATABLE_ADMIN_PASSWORD='password'
# database
SEATABLE_MYSQL_ROOT_PASSWORD='password'
SEATABLE_DIR='/data/seatable'
SEATABLE_PYTHON_PIPELINE_MYSQL_DB_HOST=db
SEATABLE_PYTHON_PIPELINE_DB_NAME=scheduler
SEATABLE_PYTHON_PIPELINE_MYSQL_ROOT_PASSWORD='password'
SEATABLE_PYTHON_PIPELINE_MYSQL_USER=python
SEATABLE_PYTHON_PIPELINE_MYSQL_PASSWORD='password'
#SEATABLE_PYTHON_PIPELINE_MYSQL_VOLUMNS=/data/seatable/python-pipeline/mysql-data
PYTHON_TRANSFER_DIRECTORY_PATH=/data/seatable/python-pipeline/tmp
PYTHON_SCHEDULER_AUTH_TOKEN=25d46ca953db0899c2cad07eeb54fd39
PYTHON_SCHEDULER_URL=http://python-scheduler
PYTHON_SCHEDULER_LOGS_DIR=/data/seatable/python-pipeline/logs/scheduler-logs
PYTHON_STARTER_USE_ALTERNATIVE_FILE_SERVER_ROOT=True
PYTHON_STARTER_ALTERNATIVE_FILE_SERVER_ROOT=http://seatable-server
PYTHON_STARTER_LOGS_DIR=/data/seatable/python-pipeline/logs/starter-logs
SEATABLE_SCHEDULER_IMAGE=seatable/seatable-python-scheduler:4.3.0
SEATABLE_STARTER_IMAGE=seatable/seatable-python-starter:4.3.0
SEATABLE_RUNNER_IMAGE=seatable/seatable-python-runner:4.3.0
REDIS_PASSWORD='password'
JWT_PRIVATE_KEY=='password'
SEATABLE_MYSQL_ROOT_PASSWORD='password'
MARIADB_PASSWORD='password' |
seatable-server.yml
| 代码块 | ||
|---|---|---|
| ||
---
services:
seatable-server:
image: ${SEATABLE_IMAGE:-seatable/seatable-enterprise:6.0.10}
restart: unless-stopped
container_name: seatable-server
ports:
- "8006:80"
volumes:
- "${SEATABLE_DIR}/seatable-server:/shared"
- "${SEATABLE_DIR}/deps/seatable.sh:/templates/seatable.sh:rx"
- "${SEATABLE_DIR}/deps/licenseparse.py:/opt/seatable/seatable-server-latest/dtable-web/seahub/utils/licenseparse.py:rw"
- "${SEATABLE_DIR}/deps/seafile-controller:/opt/seatable/seatable-server-latest/seafile/bin/seafile-controller:rw"
- "${SEATABLE_DIR}/deps/seaf-server:/opt/seatable/seatable-server-latest/seafile/bin/seaf-server:rw"
environment:
- SEATABLE_MYSQL_DB_HOST=${MARIADB_HOST:-mariadb}
- SEATABLE_MYSQL_DB_PORT=${MARIADB_PORT:-3306}
- SEATABLE_MYSQL_DB_USER=root
- SEATABLE_MYSQL_DB_PASSWORD=${MARIADB_PASSWORD:?Variable is not set or empty}
- INIT_SEATABLE_MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD:-${MARIADB_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:?Variable is not set or empty}
- JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY:?Variable is not set or empty}
- 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}
- ENABLE_PYTHON_SCRIPT=${ENABLE_PYTHON_SCRIPT:-true}
- 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://help.seatable.com}
- SEATABLE_LOG_LEVEL=${SEATABLE_LOG_LEVEL:-INFO}
- ENABLE_SEATABLE_AI=${ENABLE_SEATABLE_AI:-false}
- SEATABLE_AI_SERVER_URL=${SEATABLE_AI_SERVER_URL:-http://seatable-ai:8888}
depends_on:
mariadb:
condition: service_healthy
memcached:
condition: service_healthy
redis:
condition: service_healthy
networks:
- frontend-net
- backend-seatable-net
healthcheck:
test: ["CMD-SHELL", "curl --fail http://localhost:8000 || exit 1"]
interval: 20s
retries: 3
start_period: 30s
timeout: 10s
mariadb:
image: ${SEATABLE_DB_IMAGE:-mariadb:11.8.3-noble}
restart: unless-stopped
container_name: mariadb
command: ["mariadbd", "--innodb_snapshot_isolation=OFF"]
environment:
- MYSQL_ROOT_PASSWORD=${SEATABLE_MYSQL_ROOT_PASSWORD:?Variable is not set or empty}
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
- "${SEATABLE_DIR}/mariadb:/var/lib/mysql"
networks:
- backend-seatable-net
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--connect",
"--mariadbupgrade",
"--innodb_initialized",
]
interval: 20s
retries: 3
start_period: 30s
timeout: 10s
memcached:
image: ${SEATABLE_MEMCACHED_IMAGE:-memcached:1.6.22}
restart: unless-stopped
container_name: memcached
entrypoint: memcached -m 256
networks:
- backend-seatable-net
healthcheck:
test: ["CMD-SHELL", "timeout 2 bash -c '</dev/tcp/localhost/11211'"]
interval: 20s
retries: 3
timeout: 5s
redis:
image: ${SEATABLE_REDIS_IMAGE:-redis:8.2.2-bookworm}
restart: unless-stopped
container_name: redis
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD:?Variable is not set or empty}
command:
- /bin/sh
- -c
- redis-server --requirepass "$${REDIS_PASSWORD:?REDIS_PASSWORD variable is not set}"
networks:
- backend-seatable-net
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 20s
retries: 3
timeout: 5s
python-scheduler:
image: ${SEATABLE_SCHEDULER_IMAGE:-seatable/seatable-python-scheduler:4.3.0}
restart: unless-stopped
container_name: python-scheduler
environment:
- TIME_ZONE=${TIME_ZONE}
- DATABASE_NAME=${SEATABLE_PYTHON_PIPELINE_MYSQL_DB_NAME:-scheduler}
- DB_HOST=mariadb
- DB_ROOT_PASSWD=${SEATABLE_PYTHON_PIPELINE_MYSQL_ROOT_PASSWORD:-}
- DB_USER=${SEATABLE_PYTHON_PIPELINE_MYSQL_USER:-}
- DB_PASSWD=${SEATABLE_PYTHON_PIPELINE_MYSQL_PASSWORD:-}
- PYTHON_SCHEDULER_AUTH_TOKEN=${PYTHON_SCHEDULER_AUTH_TOKEN:?Variable is not set or empty}
- SEATABLE_SERVER_URL=${SEATABLE_SERVER_PROTOCOL}://${SEATABLE_SERVER_HOSTNAME}
- PYTHON_STARTER_URL=${PYTHON_STARTER_URL:-http://python-starter:8080}
- PYTHON_SCHEDULER_LOG_LEVEL=${PYTHON_SCHEDULER_LOG_LEVEL:-WARNING}
- DELETE_LOG_DAYS=${DELETE_LOG_DAYS:-30}
- PYTHON_PROCESS_TIMEOUT=${PYTHON_PROCESS_TIMEOUT:-900}
- PYTHON_SCHEDULER_SCRIPT_WORKERS=${PYTHON_SCHEDULER_SCRIPT_WORKERS:-5}
volumes:
- "${PYTHON_SCHEDULER_LOGS_DIR:-/tmp}:/opt/scheduler/logs"
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- backend-scheduler-net
- frontend-net
- backend-seatable-net
depends_on:
mariadb:
condition: service_healthy
healthcheck:
test:
[
"CMD-SHELL",
"pgrep -f 'python3 scheduler.py' && pgrep -f 'python3 flask_server.py'",
]
interval: 20s
retries: 3
start_period: 20s
timeout: 10s
python-starter:
image: ${SEATABLE_STARTER_IMAGE:-seatable/seatable-python-starter:4.3.0}
restart: unless-stopped
container_name: python-starter
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "${PYTHON_TRANSFER_DIRECTORY_PATH:-/tmp}:${PYTHON_TRANSFER_DIRECTORY_PATH:-/tmp}"
- "${PYTHON_STARTER_LOGS_DIR:-/tmp}:/opt/seatable-python-starter/logs"
environment:
- TIME_ZONE=${TIME_ZONE}
- PYTHON_SCHEDULER_URL=http://python-scheduler
- PYTHON_TRANSFER_DIRECTORY=${PYTHON_TRANSFER_DIRECTORY_PATH:-/tmp}
- PYTHON_RUNNER_IMAGE=${SEATABLE_RUNNER_IMAGE:-seatable/seatable-python-runner:4.3.0}
- PYTHON_STARTER_LOG_LEVEL=${PYTHON_STARTER_LOG_LEVEL:-WARNING}
- PYTHON_PROCESS_TIMEOUT=${PYTHON_PROCESS_TIMEOUT:-900}
- PYTHON_STARTER_THREAD_COUNT=${PYTHON_STARTER_THREAD_COUNT:-10}
- PYTHON_STARTER_USE_ALTERNATIVE_FILE_SERVER_ROOT=${PYTHON_STARTER_USE_ALTERNATIVE_FILE_SERVER_ROOT:-}
- PYTHON_STARTER_ALTERNATIVE_FILE_SERVER_ROOT=${PYTHON_STARTER_ALTERNATIVE_FILE_SERVER_ROOT:-}
- PYTHON_RUNNER_OUTPUT_LIMIT=${PYTHON_RUNNER_OUTPUT_LIMIT:-1000000}
- PYTHON_RUNNER_CONTAINER_MEMORY=${PYTHON_RUNNER_CONTAINER_MEMORY:-2g}
- PYTHON_RUNNER_CONTAINER_CPUS=${PYTHON_RUNNER_CONTAINER_CPUS:-}
- PYTHON_RUNNER_OTHER_OPTIONS=${PYTHON_RUNNER_OTHER_OPTIONS:-}
networks:
- backend-scheduler-net
- frontend-net
python-runner:
image: ${PYTHON_RUNNER_IMAGE:-seatable/seatable-python-runner:4.3.0}
restart: unless-stopped
container_name: python-runner
networks:
- runner-net
networks:
frontend-net:
name: frontend-net
backend-seatable-net:
name: backend-seatable-net
backend-scheduler-net:
name: backend-scheduler-net
runner-net:
name: runner-net
driver: bridge
driver_opts:
# Disable inter-container connectivity
com.docker.network.bridge.enable_icc: "false" |
nginx.conf
| 代码块 | ||
|---|---|---|
| ||
log_format seatableformat '[$time_iso8601] $http_x_forwarded_for $remote_addr "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';
upstream dtable_servers {
server 127.0.0.1:5000;
keepalive 15;
}
server {
server_name seatable.waringid.me 127.0.0.1 192.168.77.102;
listen 443 ssl;
ssl_certificate /shared/ssl/waringid.cer;
ssl_certificate_key /shared/ssl/waringid.key;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
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";
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;
}
proxy_pass http://127.0.0.1:8000;
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_read_timeout 1200s;
client_max_body_size 0;
access_log /opt/nginx-logs/dtable-web.access.log seatableformat;
error_log /opt/nginx-logs/dtable-web.error.log;
}
location /seafhttp {
rewrite ^/seafhttp(.*)$ $1 break;
proxy_pass http://127.0.0.1:8082;
client_max_body_size 0;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_request_buffering off;
proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;
send_timeout 36000s;
access_log /opt/nginx-logs/seafhttp.access.log seatableformat;
error_log /opt/nginx-logs/seafhttp.error.log;
}
location /media {
root /opt/seatable/seatable-server-latest/dtable-web;
}
location /socket.io {
proxy_pass http://dtable_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_redirect off;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
access_log /opt/nginx-logs/socket-io.access.log seatableformat;
error_log /opt/nginx-logs/socket-io.error.log;
}
location /dtable-server {
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";
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;
}
rewrite ^/dtable-server/(.*)$ /$1 break;
proxy_pass http://dtable_servers;
proxy_redirect off;
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-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
# used for import excel
client_max_body_size 100m;
access_log /opt/nginx-logs/dtable-server.access.log seatableformat;
error_log /opt/nginx-logs/dtable-server.error.log;
}
location /dtable-db/ {
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";
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;
}
proxy_pass http://127.0.0.1:7777/;
proxy_redirect off;
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-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
access_log /opt/nginx-logs/dtable-db.access.log seatableformat;
error_log /opt/nginx-logs/dtable-db.error.log;
}
location /api-gateway/ {
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";
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;
}
proxy_pass http://127.0.0.1:7780/;
proxy_redirect off;
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-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;
access_log /opt/nginx-logs/api-gateway.access.log seatableformat;
error_log /opt/nginx-logs/api-gateway.error.log;
}
}
server {
server_name seatable.waringid.me seatable-server 127.0.0.1 192.168.77.102;
listen 80;
# for letsencrypt
location /.well-known/acme-challenge/ {
alias /var/www/challenges/;
try_files $uri =404;
}
proxy_set_header X-Forwarded-For $remote_addr;
location / {
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";
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;
}
proxy_pass http://127.0.0.1:8000;
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_read_timeout 1200s;
# used for view/edit office file via Office Online Server
client_max_body_size 0;
access_log /opt/nginx-logs/dtable-web.access.log seatableformat;
error_log /opt/nginx-logs/dtable-web.error.log;
}
location /seafhttp {
rewrite ^/seafhttp(.*)$ $1 break;
proxy_pass http://127.0.0.1:8082;
client_max_body_size 0;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_request_buffering off;
proxy_connect_timeout 36000s;
proxy_read_timeout 36000s;
proxy_send_timeout 36000s;
send_timeout 36000s;
access_log /opt/nginx-logs/seafhttp.access.log seatableformat;
error_log /opt/nginx-logs/seafhttp.error.log;
}
location /media {
root /opt/seatable/seatable-server-latest/dtable-web;
}
location /socket.io {
proxy_pass http://dtable_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_redirect off;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
access_log /opt/nginx-logs/socket-io.access.log seatableformat;
error_log /opt/nginx-logs/socket-io.error.log;
}
location /dtable-server {
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";
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;
}
rewrite ^/dtable-server/(.*)$ /$1 break;
proxy_pass http://dtable_servers;
proxy_redirect off;
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-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
# used for import excel
client_max_body_size 100m;
add_header Content-Security-Policy upgrade-insecure-requests;
access_log /opt/nginx-logs/dtable-server.access.log seatableformat;
error_log /opt/nginx-logs/dtable-server.error.log;
}
location /dtable-db/ {
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";
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;
}
proxy_pass http://127.0.0.1:7777/;
proxy_redirect off;
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-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
access_log /opt/nginx-logs/dtable-db.access.log seatableformat;
error_log /opt/nginx-logs/dtable-db.error.log;
}
location /api-gateway/ {
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";
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;
}
proxy_pass http://127.0.0.1:7780/;
proxy_redirect off;
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-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;
access_log /opt/nginx-logs/api-gateway.access.log seatableformat;
error_log /opt/nginx-logs/api-gateway.error.log;
}
} |
效果
Image Added
Image Added
| 目录 |
|---|