SeaTable Enterprise Unhealthy - Error "License Expired" Deceptive (Valid License)

Setup:

  • Hardware or environment you use: Google Cloud VM (2 vCPU, 4GB RAM)
  • OS: Debian GNU/Linux 12 (bookworm) amd64 built on 20250415
  • SeaTable Edition: Enterprise
  • SeaTable Version (only necessary for self-hosted): Tried seatable/seatable-enterprise:5.2.7 and seatable/seatable-enterprise:latest
  • Installation Method: Manual Docker Compose (Single Node guide)
  • Docker Version: 27.0.1 (Client & Server)
  • Docker Compose Version: v2.25.1

Describe the Problem/Error/Question:

Hello SeaTable Community,

I am trying to install SeaTable Enterprise Edition following the official manual Docker Compose guide on a Google Cloud VM running Debian 12.

The installation process seems to complete the sudo docker compose up -d command without errors related to port conflicts or initial configuration parsing. However, shortly after startup, the seatable-server container becomes unhealthy.

When trying to access the SeaTable web interface via the configured SEATABLE_SERVER_HOSTNAME (https://seatabl******.online in my case), the browser displays a 502 Bad Gateway error.

The core issue appears to be the seatable-server container failing its internal health checks.

Error Messages:

  • Followed the manual installation guide: Created /opt/seatable-compose, downloaded files, generated passwords, configured .env, placed seatable-license.txt.
  • Corrected initial .env formatting error (# missing on line 1).
  • Resolved port 80 conflict by removing previously installed Easypanel/Traefik Docker Swarm services (sudo docker service rm ...).
  • Verified system time using date - it is correct.
  • Verified the license file content using cat /opt/seatable-compose/seatable-license.txt - it shows valid details, including Expiration = "2028-04-29". The license is definitely NOT expired.
  • Verified directory (/opt/seatable-compose) permissions are drwxr-xr-x (owned by root) and license file permissions are -rw-r--r--.
  • Tried both seatable/seatable-enterprise:5.2.7 and seatable/seatable-enterprise:latest image tags. The problem persists with both versions.
  • Checked internal logs (/opt/seatable/logs/init.log via docker exec) - Found errors indicating Connection refused when trying to connect to http://127.0.0.1:8000/api2/ping/.
  • Checked for other log files (dtable-web.log, controller.log) inside /opt/seatable/logs/ via docker exec, but they are not being created, suggesting a very early startup failure.

EXAMPLE Error Messages:

Example of a code block for error messages
NAME               IMAGE                                      COMMAND                  SERVICE             CREATED             STATUS                    PORTS
caddy              lucaslorentz/caddy-docker-proxy:2.9.1-alpine   "/bin/caddy docker-p…"   caddy               X minutes ago    Up X minutes (healthy)    ...
mariadb            mariadb:11.4.3-noble                       "docker-entrypoint.s…"   mariadb             X minutes ago    Up X minutes (healthy)    ...
redis              redis:7.2.7-bookworm                       "docker-entrypoint.s…"   redis               X minutes ago    Up X minutes (healthy)    ...
seatable-server    seatable/seatable-enterprise:latest        "/sbin/my_init -- /t…"   seatable-server     X minutes ago    Up X minutes (unhealthy)  

Relevant messages from sudo docker compose logs seatable-server: (The log consistently ends like this after attempting startup, even with :latest image)

seatable-server  | *** Running /templates/enterpoint.sh...
seatable-server  | 2025-05-05 XX:XX:XX Conf exists 
seatable-server  | 2025-05-05 XX:XX:XX Nginx ready 
seatable-server  | 2025-05-05 XX:XX:XX Updating CA certificates... 
seatable-server  | 2025-05-05 XX:XX:XX Start server 
seatable-server  | 
seatable-server  | SeaTable License Expired!
seatable-server  | 
seatable-server  | 2025-05-05 XX:XX:XX For more startup information, please check the /opt/seatable/logs/init.log 
seatable-server  | 2025-05-05 XX:XX:XX This is an idle script (infinite loop) to keep the container running. 

Error snippet from /opt/seatable/logs/init.log (via docker exec):

requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=8000): Max retries exceeded with url: /api2/ping/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x...>: Failed to establish a new connection: [Errno 111] Connection refused'))

.env File Content:

# components to be used; IMPORTANT: there should be no space between the files names !
COMPOSE_FILE='caddy.yml,seatable-server.yml'
COMPOSE_PATH_SEPARATOR=','

# system settings
TIME_ZONE="America/Monterrey"

# seatable server url
SEATABLE_SERVER_HOSTNAME="seatable2.******.online" # DNS A record points correctly to server IP
SEATABLE_SERVER_PROTOCOL="https"

# initial web admin
SEATABLE_ADMIN_EMAIL="m@****" # Actual admin email # Masked
SEATABLE_ADMIN_PASSWORD="*****" # Masked

# database
SEATABLE_MYSQL_ROOT_PASSWORD="*****" # Masked

Despite the license file content showing Expiration = "2028-04-29", the server consistently fails to start with the misleading “License Expired!” message, apparently after failing to connect to its internal backend on port 8000. Other specific log files aren’t created.

Any ideas on what could be causing this or how to further diagnose why the internal backend isn’t starting?

Thank you again for your attention and kind help!


Subject: Re: [Original Subject of your forum post] [SOLVED]

Hi everyone,

Just wanted to update this thread to say that the issue is now resolved. Thanks for the input!

The root cause turned out to be quite subtle: I had received my new license content (which was valid until 2028) as text pasted in a reply here on the forum. When I copied and pasted that text directly into my seatable-license.txt file using nano, it included typographic/curly quotes (“”) instead of standard straight quotes (").

These non-standard quotes caused parsing issues for SeaTable’s internal scripts when reading the seatable-license.txt file. Specifically, it led to an internal date: invalid date '...' error when trying to validate the Expiration value because the script couldn’t parse the date correctly with the surrounding (curly) quotes. This failure then triggered the misleading SeaTable License Expired! message and caused the seatable-server container to remain unhealthy.

The Solution:

  1. I edited /opt/seatable-compose/seatable-license.txt again using sudo nano.
  2. I located the Expiration = “YYYY-MM-DD” line.
  3. I completely removed the quotes surrounding the date value, leaving the line as Expiration = YYYY-MM-DD.
  4. Saved the file.
  5. Restarted the stack using sudo docker compose down && sudo docker compose up -d.

After removing the quotes from the date value, the internal script could parse it correctly, the misleading “Expired” error disappeared, and the seatable-server container started successfully and became healthy. The instance is now accessible!

Posting this in case anyone else runs into similar issues when copy-pasting license details from formatted sources.

Thanks again! Marking this as solved.

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.