# Thumbnail Server - Seafile Admin Manual
Author: seafile

Skip to content

# Thumbnail Server Overview

Since Seafile 13.0, a new component thumbnail server is added. Thumbnail server can create thumbnails for images, videos, PDFs and other file types. Thumbnail server uses a task queue based architecture, it can better handle workloads than thumbnail generating inside Seahub component.

Use this feature by forwarding thumbnail requests directly to thumbnail server via caddy or a reverse proxy.

## How to configure and run

First download `thumbnail-server.yml` to Seafile directory:

    wget https://manual.seafile.com/13.0/repo/docker/thumbnail-server.yml

Modify `.env`, and insert `thumbnail-server.yml` into `COMPOSE_FILE`:

    COMPOSE_FILE='seafile-server.yml,caddy.yml,thumbnail-server.yml'

Add following configuration in `seahub_settings.py` to enable thumbnail for videos:

    # video thumbnails (disabled by default)
    ENABLE_VIDEO_THUMBNAIL = True

Finally, You can run thumbnail server with the following command:

    docker compose down
    docker compose up -d

## Thumbnail Server in Seafile cluster

There is no additional features for thumbnail server in the Pro Edition. It works the same as in community edition.

If you enable clustering, You need to deploy thumbnail server on one of the servers, or a separate server. The load balancer should forward websockets requests to this node.

Download `.env` and `thumbnail-server.yml` to thumbnail server directory:

    wget https://manual.seafile.com/13.0/repo/docker/thumbnail-server/thumbnail-server.yml
    wget -O .env https://manual.seafile.com/13.0/repo/docker/thumbnail-server/env

Then modify the `.env` file according to your environment. The following fields are needed to be modified:

variable | description
--- | ---
`SEAFILE_VOLUME` | The volume directory of thumbnail server data
`SEAFILE_MYSQL_DB_HOST` | Seafile MySQL host
`SEAFILE_MYSQL_DB_USER` | Seafile MySQL user, default is `seafile`
`SEAFILE_MYSQL_DB_PASSWORD` | Seafile MySQL password
`TIME_ZONE` | Time zone
`JWT_PRIVATE_KEY` | JWT key, the same as the config in Seafile `.env` file
`INNER_SEAHUB_SERVICE_URL` | Intranet URL for accessing Seahub component, like `http://<your Seafile server intranet IP>`.
`SEAF_SERVER_STORAGE_TYPE` | What kind of the Seafile data for storage. Available options are `disk` (i.e., local disk), `s3` and `multiple` (see the details of multiple storage backends)
`S3_COMMIT_BUCKET` | S3 storage backend commit objects bucket
`S3_FS_BUCKET` | S3 storage backend fs objects bucket
`S3_BLOCK_BUCKET` | S3 storage backend block objects bucket
`S3_KEY_ID` | S3 storage backend key ID
`S3_SECRET_KEY` | S3 storage backend secret key
`S3_AWS_REGION` | Region of your buckets
`S3_HOST` | Host of your buckets
`S3_USE_HTTPS` | Use HTTPS connections to S3 if enabled
`S3_USE_V4_SIGNATURE` | Use the v4 protocol of S3 if enabled
`S3_PATH_STYLE_REQUEST` | This option asks Seafile to use URLs like `https://192.168.1.123:8080/bucketname/object` to access objects. In Amazon S3, the default URL format is in virtual host style, such as `https://bucketname.s3.amazonaws.com/object`. But this style relies on advanced DNS server setup. So most self-hosted storage systems only implement the path style format.
`S3_SSE_C_KEY` | A string of 32 characters can be generated by openssl rand -base64 24. It can be any 32-character long random string. It's required to use V4 authentication protocol and https if you enable SSE-C.
`NON_ROOT` | Run container without a root user

Then you can run thumbnail server with the following command:

    docker compose up -d

You need to configure load balancer according to the following forwarding rules:

1. Forward `/thumbnail` requests to thumbnail server via http protocol.

Here is a configuration that uses haproxy to support thumbnail server. Haproxy version needs to be >= 2.0. You should use similar configurations for other load balancers.

    #/etc/haproxy/haproxy.cfg

    # Other existing haproxy configurations
    ......

    frontend seafile
        bind 0.0.0.0:80
        mode http
        option httplog
        option dontlognull
        option forwardfor
        acl thumbnail_request url_sub -i /thumbnail/
        use_backend thumbnail_backend if thumbnail_request
        default_backend backup_nodes

    backend backup_nodes
        cookie SERVERID insert indirect nocache
        server seafileserver01 192.168.0.2:80

    backend thumbnail_backend
        option forwardfor
        server thumbnail 192.168.0.9:80

Thumbnail server has to access Seafile' storage

The thumbnail server needs to access Seafile storage.

- If you use local storage, you need to mount the `/opt/seafile-data` directory of the Seafile node to the thumbnail node, and set `SEAFILE_VOLUME` to the mounted directory correctly.

- If you use single backend S3 storage, please correctly set relative environment vairables in `.env`.

- If you are using multiple storage backends, you have to copy the `seafile.conf` of the Seafile node to the `/opt/seafile-data/seafile/conf` directory of the thumbnail node, and set `SEAF_SERVER_STORAGE_TYPE=multiple` in `.env`.

## Thumbnail server directory structure

`/opt/seafile-data`

Placeholder spot for shared volumes. You may elect to store certain persistent information outside of a container, in our case we keep various log files outside. This allows you to rebuild containers easily without losing important information.

- /opt/seafile-data/conf: This is the directory for config files.
- /opt/seafile-data/logs: This is the directory for logs.
- /opt/seafile-data/seafile-data: This is the directory for seafile storage (if you use local storage).
- /opt/seafile-data/seahub-data/thumbnail: This is the directory for thumbnail files.

## Common issues when settings up thumbnail server

### Thumbnails cannot be generated for high-resolution images

This is because generating thumbnails for high-resolution images can impact system performance. You can raise the threshold by setting the `THUMBNAIL_IMAGE_ORIGINAL_SIZE_LIMIT` environment variable in the env file; the default is 256 (MB).