Skip to content

Deploy SeaTable Developer Edition with Docker


The following assumptions and conventions are used in the rest of this document:

  • /opt/seatable is the directory of SeaTable. If you decide to put SeaTable in a different directory - which you can - adjust all paths accordingly.
  • SeaTable uses two Docker volumes for persisting data generated in its database and SeaTable Docker container. The volumes' host paths are /opt/seatable/mysql-data and /opt/seatable/seatable-data, respectively. It is not recommended to change these paths. If you do, account for it when following these instructions.
  • All configuration and log files for SeaTable and the webserver Nginx are stored in the volume of the SeaTable container.
  • Due to SeaTable's cloud first approach, these instructions only elaborate explicitly on the deployment of SeaTable's latest version. (An earlier version of SeaTable EE can be installed using these instructions. Just download its image from Docker Hub and adjust the docker-compose file accordingly. Earlier versions may not be compatible with the SeaTable plugins available on SeaTable's Market though.)

Installing Docker

This step is only required if you don't have installed docker yet. Execute the following script to install docker and docker compose plugin. Otherwise refer to the official installation documentation of docker for your operating system.

curl -fsSL | bash

Downloading the SeaTable Image

Pull the SeaTable image from Docker Hub:

docker pull seatable/seatable-developer:latest

NOTE: Older SeaTable versions are also available on Docker Hub. To pull an older version, replace 'latest' by the desired version like seatable/seatable-developer:4.1.0.

Downloading and Modifying docker-compose.yml

Download the docker-compose.yml sample file into SeaTable's directory and modify the file to fit your environment and settings.

mkdir /opt/seatable
cd /opt/seatable
wget -O "docker-compose.yml" ""
nano docker-compose.yml

The following fields merit particular attention:

  • Password of MariaDB root (MYSQL_ROOT_PASSWORD and DB_ROOT_PASSWD)

Additional customizable options in the Compose file are:

  • Volume path for the container db
  • Volume path for the container seatable
  • Image tag of the SeaTable version to install (image)
  • Time zone (TIME_ZONE)

Initializing Database

Initialize database by running docker-compose:

cd /opt/seatable
docker compose up

NOTE: You should run the above command in the directory with the docker-compose.yml.

Wait for a while. When you see This is an idle script (infinite loop) to keep container running. in the output log, the database has been initialized successfully. Press keyboard CTRL + C (Windows) or Control + C (Mac) to return to the prompt.

Starting the Docker Containers

Run docker compose again, this time in detached mode:

docker compose up -d

NOTE: You should run the above command in the directory with the docker-compose.yml.

Starting SeaTable Server

Now you can start SeaTable and create the first admin user:

# Start SeaTable service.
docker exec -d seatable /shared/seatable/scripts/ start

# Create admin account.
docker exec -it seatable /shared/seatable/scripts/ superuser

NOTE: The first command uses the option -d which starts the service in the background. The second command use the option -it which runs the command in interactive mode.

You can now access SeaTable at the host name specified in the Compose file.

Reviewing the Deployment

The command docker container list should list the four containers specified in the docker-compose.yml:


The directory layout of the SeaTable container's volume should look as follows:

$tree /opt/seatable/seatable-data -L 2
├── nginx-logs
│   ├── access.log
│   ├── dtable-db.access.log
│   ├── dtable-db.error.log
│   ├── dtable-server.access.log
│   ├── dtable-server.error.log
│   ├── dtable-web.access.log
│   ├── dtable-web.error.log
│   ├── error.log
│   ├── seafhttp.access.log
│   ├── seafhttp.error.log
│   ├── socket-io.access.log
│   └── socket-io.error.log
├── seatable
│   ├── ccnet
│   ├── conf
│   ├── db-data
│   ├── logs
│   ├── pids
│   ├── scripts
│   ├── seafile-data
│   ├── seahub-data
│   └── seatable-license.txt
└── ssl
    ├── account.conf
    ├── ca
    ├── http.header
    ├── renew_cert
    └── README

NOTE: The directory ssl is empty if Let's Encrypt is not used for HTTPS. SEATABLE_SERVER_HOSTNAME substitutes for the host name used in the docker-compose.yml file.

All config files are stored in /opt/seatable/seatable-data/seatable/conf.

Any modification of a configuration file requires a restart of SeaTable to take effect:

docker exec -d seatable /shared/seatable/scripts/ restart

All of SeaTable's log files are stored in /opt/seatable/seatable-data/seatable/logs:

  • dtable-db.log: log of dtable-db component
  • dtable-db-access.log: query log of dtable-db component
  • dtable-db-error.log: error log of dtable-db component
  • dtable-db-slow.log: slow query log of dtable-db component
  • dtable-events.log: log of the dtable-events component
  • dtable_events_io.log: special log for DTABLE import/export as well as Excel and CSV file import/export
  • dtable_events_message.log: special log for sending emails in the dtable-events background
  • dtable-server.log: log of dtable-server component
  • dtable_web.log: log of the dtable-web component
  • init.log: Log of Docker initialization script
  • monitor.log: Monitor logs, can auto restart the unexpectedly closed server
  • seafile.log: log of Seafile server

Additionally, the slow_logs contain slow request logs which help debug performance issues.


  • Let's encrypt SSL certificate

If you set SEATABLE_SERVER_LETSENCRYP to true in "docker-compose.yml", the container requests a letsencrypt-signed SSL certificate for you automatically.


    - "80:80"
    - "443:443"
    - SEATABLE_SERVER_LETSENCRYPT=True # Default is False. Whether to use let's encrypt certificate.
    - # Specifies your host name if https is enabled

NOTE:Since the Nginx configuration file is only generated automatically when you run the container for the first time, you'd better set SEATABLE_SERVER_LETSENCRYPT = True before executing the docker compose up -d command for the first time.

If you want to use your own SSL certificate, you can refer to the following steps.

  • Add your own SSL certificate

  • Upload the SSL certificate file to the SeaTable data directory : /Your SeaTable data volume/ssl/

  • Change the "http" of each SERVER_URL in ccnet.conf, and dtable_server_config.json to "https".
  • Restart the SeaTable service : docker exec -it seatable /shared/seatable/scripts/ restart
  • Restart the Memcached service:docker restart seatable-memcached
  • Modify the nginx configuration file : /Your SeaTable data volume/seatable/conf/nginx.conf


    server {
        if ($host = {
            return 301 https://$host$request_uri;
        listen 80;
        return 404;
    server {
        listen 443 ssl;
        ssl_certificate /shared/ssl/<your-ssl.cer>;
        ssl_certificate_key /shared/ssl/<your-ssl.key>;
        proxy_set_header X-Forwarded-For $remote_addr;
  • Reload the nginx configuration file : docker exec -it seatable /usr/sbin/nginx -s reload


I encounter "Network error" when opening a base. What have I done wrong?

Normally, the issue is caused by incorrect URLs in config file The URL are required for the various components of SeaTable to communicate with one another.

The URLs are read from the Compose file and written to the config file only upon SeaTable's initialization. Any later modification of the URLs in the docker-compose.yml has no effect on the URLs in the config file. Later changes must be done manually in, followed by a restart of SeaTable.

The relevenat URLs are:

# The URL that users used to access a base

# The URL that users used to access the service

# The URL for the file server

SEATABLE_SERVER_HOSTNAME must be the correct hostname (e.g.,

If, for whatever reason, the installation failed, how to start from clean state again?

Just remove the directory /opt/seatable and start again.

I forgot the SeaTable admin email address/password, how do I create a new admin account?

You can create a new admin account by running

# Create admin account
docker exec -it seatable /shared/seatable/scripts/ superuser

The SeaTable service must be up when running the superuser command.

The Let's Encrypt SSL certificate is about to expire, how do I renew it?

The SSL certificate should be renewed automatically 30 days prior to its expiration. If the automatic renewal fails, this command renews the certificate manually:



If you want to change to https after using http, first backup and move the nginx.conf.

mv /opt/seatable/shared/seatable/conf/nginx.conf /opt/seatable/shared/seatable/conf/nginx.conf.bak

Then run the following command to apply a certificate.

docker exec seatable /templates/ init

You need to manually change http to https in other configuration files and restart SeaTable.

docker compose down
docker compose up -d
docker exec -d seatable /shared/seatable/scripts/ start

If you have modified the old nginx.conf, now you can modify the new nginx.conf as you want. Then execute the following command to make the nginx configuration take effect.

docker exec seatable nginx -s reload

Last update: October 20, 2023