# 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:

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

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

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

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

```py
# video thumbnails (disabled by default)
ENABLE_VIDEO_THUMBNAIL = True
```

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

```sh
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](../setup_binary/cluster_deployment.md), 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:

```sh
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](../setup/setup_with_multiple_storage_backends.md)) |
| `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. |

Then you can run thumbnail server with the following command:

```sh
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

```

!!! warning "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).
