Latest server version
0.1.49
- Released
- Nov 11, 2026, 17:54
- Package
- cinarox-server_0.1.49_amd64.deb
- Size
- 129.7 MB
- Architecture
- amd64
06c0de96e0adf2276b31c71cc6d158f2597ff51e87fa0aedb70cf7fe501da50dThe server for Linux amd64 as a Debian package or Docker image, plus the apps. Every version here also runs on our own servers.
Latest server version
06c0de96e0adf2276b31c71cc6d158f2597ff51e87fa0aedb70cf7fe501da50ddocker pull amslertec/cinarox:0.1.49One tag per release, linux/amd64 · sha256:6b6bd7ea4262…
Docker Hub pageCompare with the SHA-256 above.
sha256sum cinarox-server_0.1.49_amd64.debUbuntu 24.04 or newer, Debian 12 and 13, amd64
/usr/bin/cinarox, cinarox.service, the system user cinarox and cinarox-credentialsffmpeg (5 or newer) and libchromaprint-tools (intro and credits detection)postgresql-client 15 to 18 for backupspostgresql) and cinarox-redis, an own Redis instance on 127.0.0.1:6380cinarox-server only, see belowPasswords are random and never printed; `sudo cinarox-credentials` shows them.
Downloads the signing key and adds the source. apt checks every package against this key.
sudo apt update && sudo apt install -y curl gpg ca-certificates
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://downloads.cinarox.com/apt/cinarox.asc \
| sudo gpg --dearmor --yes -o /etc/apt/keyrings/cinarox.gpg
sudo tee /etc/apt/sources.list.d/cinarox.sources > /dev/null <<'EOF'
Types: deb
URIs: https://downloads.cinarox.com/apt
Suites: prod
Components: main
Architectures: amd64
Signed-By: /etc/apt/keyrings/cinarox.gpg
EOF
sudo apt updateOne command installs the server, PostgreSQL and an own Redis instance and sets everything up.
sudo apt install cinaroxThe complete package cinarox needs the package source from step 1; it pulls cinarox-server and cinarox-redis along. For a cluster node or your own database see Server only below.
PostgreSQL: user and database cinarox with a random password. Redis: an own instance cinarox-redis on 127.0.0.1:6380 with a random password; the Redis of your distribution stays as it is. Both are entered in /etc/cinarox/config.yaml and Cinarox starts right away. On a machine that already has a database configured, nothing is changed.
The installation never prints a password, because apt keeps its whole output in a log file. The passwords are stored in /etc/cinarox/config.yaml; this command shows the database and Redis access:
sudo cinarox-credentialsYour film and show folders are chosen later in the setup wizard. The service runs as user cinarox and needs read access to them:
sudo -u cinarox ls /srv/media/Movies # must list your files
sudo usermod -aG <group-of-your-media> cinarox # if it says permission deniedOnly the two Cinarox ports, for the devices that should reach the server. Example with ufw:
sudo ufw allow 8977/tcp # HTTP: web app and the native apps
sudo ufw allow 9977/tcp # HTTPS, self-signed certificate
# PostgreSQL (5432) and Redis (6380) stay closed: they only listen on 127.0.0.1Open http://<server>:8977. The wizard creates the admin account, asks for your libraries and the TMDB key.
In the journal and in /var/log/cinarox/cinarox.log (rotated daily). The admin area shows the same under Server → Logs.
sudo journalctl -u cinarox -f
sudo tail -f /var/log/cinarox/cinarox.logNew releases come with the normal system updates. Database migrations run automatically when the service starts.
sudo apt update && sudo apt upgradeDocker Engine with Compose v2, linux/amd64
Everything for the stack lives in one folder: docker-compose.yaml, .env and config.yaml.
mkdir cinarox && cd cinaroxCinarox, PostgreSQL 18 and Redis 7.4 with pinned versions, health checks, log rotation and volumes. Database and Redis get no host port.
# docker-compose.yaml: Cinarox + PostgreSQL + Redis
# Needs .env and config.yaml in the same folder.
name: cinarox
x-logging: &logging
driver: json-file
options:
max-size: "10m"
max-file: "3"
services:
# One-shot helper: makes config.yaml readable for the non-root
# cinarox user (uid 100) in the image, then exits.
config-perms:
image: amslertec/cinarox:${CINAROX_VERSION:?set CINAROX_VERSION in .env}
user: "0:0"
entrypoint: ["sh", "-c", "chown 100:100 /cfg/config.yaml && chmod 0640 /cfg/config.yaml"]
volumes:
- ./config.yaml:/cfg/config.yaml
restart: "no"
logging: *logging
cinarox:
image: amslertec/cinarox:${CINAROX_VERSION:?set CINAROX_VERSION in .env}
container_name: cinarox
restart: unless-stopped
ports:
- "8977:8977" # HTTP: web app and the native apps
- "9977:9977" # HTTPS: self-signed, created on first start
environment:
TZ: ${TZ:-Europe/Zurich}
volumes:
- ./config.yaml:/etc/cinarox/config.yaml:ro
- cinarox-data:/var/lib/cinarox # caches, images, TLS cert, master key
- cinarox-logs:/var/log/cinarox
- ${MEDIA_DIR:-/srv/media}:/media:ro # your films and shows, read-only
# Hardware transcoding (VAAPI / Intel QSV) when the host has /dev/dri:
# devices:
# - /dev/dri:/dev/dri
depends_on:
config-perms:
condition: service_completed_successfully
postgres:
condition: service_healthy
redis:
condition: service_healthy
logging: *logging
postgres:
image: postgres:18.6-alpine
container_name: cinarox-postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-cinarox}
POSTGRES_DB: ${POSTGRES_DB:-cinarox}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256 --data-checksums"
TZ: ${TZ:-Europe/Zurich}
volumes:
- cinarox-postgres:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
logging: *logging
# no host port: only reachable inside the compose network
redis:
image: redis:7.4.11-alpine
container_name: cinarox-redis
restart: unless-stopped
command: ["sh", "-c", "exec redis-server --requirepass \"$$REDIS_PASSWORD\" --appendonly yes"]
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:?set REDIS_PASSWORD in .env}
REDISCLI_AUTH: ${REDIS_PASSWORD}
volumes:
- cinarox-redis:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 10
logging: *logging
volumes:
cinarox-data:
cinarox-logs:
cinarox-postgres:
cinarox-redis:This block creates two random passwords and writes them into both files. The containers read .env, Cinarox reads only config.yaml, so the values must match.
PG_PASSWORD=$(openssl rand -hex 24)
REDIS_PASSWORD=$(openssl rand -hex 24)
cat > .env <<EOF
CINAROX_VERSION=0.1.49
TZ=Europe/Zurich
MEDIA_DIR=/srv/media
POSTGRES_USER=cinarox
POSTGRES_DB=cinarox
POSTGRES_PASSWORD=$PG_PASSWORD
REDIS_PASSWORD=$REDIS_PASSWORD
EOF
cat > config.yaml <<EOF
http:
listen_addr: "0.0.0.0:8977"
tls_listen_addr: "0.0.0.0:9977"
public_url: "http://$(hostname -I | awk '{print $1}'):8977"
database:
dsn: "postgres://cinarox:$PG_PASSWORD@postgres:5432/cinarox?sslmode=disable"
redis:
addr: "redis:6379"
password: "$REDIS_PASSWORD"
db: 0
auth:
jwt_secret: ""
media:
transcode_dir: /var/lib/cinarox/transcode
cache_dir: /var/lib/cinarox/cache
cluster:
node_name: "primary"
EOF
chmod 600 .env config.yamlThe resulting .env looks like this. Set MEDIA_DIR to the folder with your films and shows; in the wizard it appears as /media.
# .env: read by docker compose, never by Cinarox itself
CINAROX_VERSION=0.1.49
TZ=Europe/Zurich
MEDIA_DIR=/srv/media
POSTGRES_USER=cinarox
POSTGRES_DB=cinarox
POSTGRES_PASSWORD=<48 hex characters from openssl rand -hex 24>
REDIS_PASSWORD=<48 hex characters from openssl rand -hex 24>Cinarox waits until PostgreSQL and Redis report healthy.
nano docker-compose.yaml # paste the file from above
docker compose pull
docker compose up -d
docker compose ps # all three "healthy" / "running"
docker compose logs -f cinarox # wait for "http server listening"Open http://<server>:8977 and allow ports 8977 and 9977 in the host firewall.
Set the new release in .env, pull and recreate. Migrations run on start.
sed -i 's/^CINAROX_VERSION=.*/CINAROX_VERSION=<new version>/' .env
docker compose pull && docker compose up -dThe database dump and the data volume with master.key. Keep both off the server.
# database dump (custom format, restore with pg_restore)
docker compose exec -T postgres pg_dump -U cinarox -Fc cinarox > cinarox-$(date +%F).dump
# master key, TLS certificate and caches: without master.key encrypted settings are lost
docker run --rm -v cinarox_cinarox-data:/data:ro -v "$PWD":/backup alpine \
tar czf /backup/cinarox-data-$(date +%F).tgz -C /data .
# restore the database into an empty stack
docker compose exec -T postgres pg_restore -U cinarox -d cinarox --clean < cinarox-<date>.dumpAdd the Cinarox package source once. After that, new versions arrive with the normal system updates: sudo apt update && sudo apt upgrade. The service restarts itself after an upgrade, and database migrations run when it starts.
sudo apt update && sudo apt install -y curl gpg ca-certificates
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://downloads.cinarox.com/apt/cinarox.asc \
| sudo gpg --dearmor --yes -o /etc/apt/keyrings/cinarox.gpg
sudo tee /etc/apt/sources.list.d/cinarox.sources > /dev/null <<'EOF'
Types: deb
URIs: https://downloads.cinarox.com/apt
Suites: prod
Components: main
Architectures: amd64
Signed-By: /etc/apt/keyrings/cinarox.gpg
EOF
sudo apt updatesudo apt install cinarox # single server, sets up PostgreSQL and Redis
sudo apt install cinarox-server # cluster node or own databasesudo apt update && sudo apt upgradeOptional: let unattended-upgrades install Cinarox updates automatically. The pattern matches the Release file of the Cinarox repository (Origin and Label Cinarox, Codename prod).
sudo apt install -y unattended-upgrades
sudo tee /etc/apt/apt.conf.d/52cinarox-unattended > /dev/null <<'EOF'
Unattended-Upgrade::Origins-Pattern {
"origin=Cinarox,label=Cinarox,codename=prod";
};
EOF
sudo dpkg-reconfigure -f noninteractive unattended-upgrades
sudo unattended-upgrade --dry-run --debug 2>&1 | grep -i cinaroxQuestions about Cinarox, installation problems or ideas. Your message goes to us by e-mail.
Loading the form…
Most installation questions are answered in the setup guide and its operating notes. Open the setup guide · Open the forum