Run your own server
Synara's server is open source under GPL-2.0 and ships as a Docker image. Start with one container and SQLite. Add Postgres, a Redis cluster and the trained recommendation model when you want them.
What you need
Docker with Compose
Storage for your library
A reachable address
Set it up
Write a compose file
SetupImageNo stable server image yet, so this file uses the dev images (
ghcr.io/dertyp7214/synara:latest-dev).compose.yaml (SQLite) services: synara: image: ghcr.io/dertyp7214/synara:latest-dev ports: - "8080:8080" environment: CLIENT_ID: admin # initial admin user (first run) CLIENT_SECRET: change-me # initial admin password JWT_SECRET: change-me-to-a-long-random-string DB_URL: jdbc:sqlite:/data/synara.db # SQLite database file inside the data volume # CREDENTIALS_ENCRYPTION_KEY: "" # openssl rand -base64 32 volumes: - synara_data:/data - synara_config:/home/appuser/.config - synara_tiddl:/home/appuser/.tiddl - synara_backups:/backups restart: unless-stopped volumes: synara_data: synara_config: synara_tiddl: synara_backups:Start it
Terminal docker compose up -d docker compose logs -f synaraConnect an app
- Install the app from the download page and open it.
- Enter your server's address, for example
http://192.168.1.20:8080or your HTTPS domain. - Log in with the
CLIENT_IDandCLIENT_SECRETfrom your compose file.
Good to know
- /data is Synara’s own folder
- Owned by UID and GID 1000
- SQLite or Postgres
- Redis has to be a cluster
- Behind an HTTPS proxy
- Upgrading from 0.0.1 or older
Key settings
The environment variables you're most likely to touch.
| Variable | What it does | Default |
|---|---|---|
CLIENT_ID, CLIENT_SECRET | Username and password of the initial admin. Created at startup if no user with that name exists. Changing them later does not change the password. | none |
JWT_SECRET | Signs login tokens. Set a long random string. | changeme |
DB_URL | JDBC URL. Use an absolute path for SQLite: jdbc:sqlite:/data/synara.db. | none |
DB_DRIVER | org.postgresql.Driver for Postgres. | org.sqlite.JDBC |
DB_USER, DB_PASSWORD | Database credentials (Postgres). | none |
CREDENTIALS_ENCRYPTION_KEY | Encrypts credentials stored in admin settings. Generate with openssl rand -base64 32 and keep it with your backups. If unset, Synara generates a key and stores it in the config volume. | none |
SERVER_SSL_SUPPORTED | Set to true if your HTTPS reverse proxy doesn’t send X-Forwarded-Proto, so apps know to use https/wss. | false |
REDIS_HOST, REDIS_PORT | Optional Redis. Leave REDIS_HOST empty to run without it. Cluster mode only: pointed at a plain standalone Redis, the server fails to start. | none |
AUDIO_EMBED_URL | Audio embedding service. Empty disables it. | none |
RECSYS_DATA_DIR | Directory shared with the recommendation service. Empty disables it. | none |
PORT | Port the server listens on. | 8080 |
Go further in the docs
Run your own server
Synara's server is open source under GPL-2.0 and ships as a Docker image. Start with one container and SQLite. Add Postgres, a Redis cluster and the trained recommendation model when you want them.
What you need
1. Write a compose file
services:
synara:
image: ghcr.io/dertyp7214/synara:latest-dev
ports:
- "8080:8080"
environment:
CLIENT_ID: admin # initial admin user (first run)
CLIENT_SECRET: change-me # initial admin password
JWT_SECRET: change-me-to-a-long-random-string
DB_URL: jdbc:sqlite:/data/synara.db # SQLite database file inside the data volume
# CREDENTIALS_ENCRYPTION_KEY: "" # openssl rand -base64 32
volumes:
- synara_data:/data
- synara_config:/home/appuser/.config
- synara_tiddl:/home/appuser/.tiddl
- synara_backups:/backups
restart: unless-stopped
volumes:
synara_data:
synara_config:
synara_tiddl:
synara_backups:
One container. The database is a SQLite file in the data volume, which is fine for personal libraries.
No stable server image yet, so this file uses the dev images (ghcr.io/dertyp7214/synara:latest-dev).
Save it as compose.yaml in an empty folder. Change every change-me value before the first start.
2. Start it
docker compose up -d
docker compose logs -f synaraThe server listens on port 8080. Follow the log until it's ready.
3. Connect an app
Use the admin account from your compose file. Get the apps.
Good to know
/data is Synara’s own folder
/dataholds Synara’s data root (/data/Synara/…). Lossless files you already have can go into/data/Synara/other, which Synara indexes.Owned by UID and GID 1000
The image runs as user 1000. If you swap the named volumes for bind mounts, make the folders writable for it:
sudo chown -R 1000:1000 ./data.SQLite or Postgres
SQLite needs no extra service, but search is simpler on it. Postgres is recommended for larger libraries and enables the full search index.
Redis has to be a cluster
Redis is optional. Leave
REDIS_HOSTempty to run without it. Synara connects to Redis in cluster mode only. Pointed at a plain standalone Redis, the server fails to start, so usesynara-redis-clusteras in the full file.Behind an HTTPS proxy
Set
SERVER_SSL_SUPPORTED: "true"if your HTTPS reverse proxy doesn’t sendX-Forwarded-Proto, so apps know to use https/wss.Upgrading from 0.0.1 or older
Run
ghcr.io/dertyp7214/synara:0.0.1-devuntil the log showsFinished custom migration FillAlbumReleaseDates, then update.
Key settings
CLIENT_ID, CLIENT_SECRETUsername and password of the initial admin. Created at startup if no user with that name exists. Changing them later does not change the password.
JWT_SECRETSigns login tokens. Set a long random string.
Default:
changemeDB_URLJDBC URL. Use an absolute path for SQLite:
jdbc:sqlite:/data/synara.db.DB_DRIVERorg.postgresql.Driverfor Postgres.Default:
org.sqlite.JDBCDB_USER, DB_PASSWORDDatabase credentials (Postgres).
CREDENTIALS_ENCRYPTION_KEYEncrypts credentials stored in admin settings. Generate with
openssl rand -base64 32and keep it with your backups. If unset, Synara generates a key and stores it in the config volume.SERVER_SSL_SUPPORTEDSet to
trueif your HTTPS reverse proxy doesn’t sendX-Forwarded-Proto, so apps know to use https/wss.Default:
falseREDIS_HOST, REDIS_PORTOptional Redis. Leave
REDIS_HOSTempty to run without it. Cluster mode only: pointed at a plain standalone Redis, the server fails to start.AUDIO_EMBED_URLAudio embedding service. Empty disables it.
RECSYS_DATA_DIRDirectory shared with the recommendation service. Empty disables it.
PORTPort the server listens on.
Default:
8080
The environment variables you're most likely to touch. All environment variables
Go further in the docs
Environment variables
Every setting, with defaults: importers, proxies, storage paths, metrics.
MCP
Connect an AI assistant to your listening history, read-only.
Plugins
Add importers, indexers, routes, tasks and screens.
Build a client
REST, Kotlin RPC, Subsonic and MCP: pick an API and make your first call.