Bare Metal Installation
Run OmniLux directly on your server without Docker.
When to use this path
Choose bare metal when you want direct process control, native systemd integration, or a host environment where Docker is not the right operational fit. If you want the simplest supported path, use Docker Installation instead.
Prerequisites
- Node.js 22+ (LTS recommended)
- pnpm (10.x or later)
- FFmpeg (6.0+ for transcoding and streaming)
- SQLite (bundled via better-sqlite3, no separate install needed)
- Git
- Ubuntu 22.04+, Debian 12+, or comparable Linux distribution
Installation
1. Install system dependencies
# Ubuntu/Debian
sudo apt update
sudo apt install -y git ffmpeg curl build-essential
# Install Node.js 22 via NodeSource
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
# Install pnpm
corepack enable
corepack prepare pnpm@latest --activate2. Clone the repository
git clone https://github.com/omnilux-tv/omnilux.git
cd omniluxPrivate repository access
If the canonical omnilux-tv/omnilux repository is still private for your rollout, use the access-granted clone URL provided by the OmniLux team.
3. Install dependencies
pnpm install4. Build
pnpm build5. Run
NODE_ENV=production PORT=4000 pnpm startOmniLux will start on port 4000 and create its SQLite database at data/omnilux.db.
Recommended host layout
Use a dedicated service user and keep runtime state separate from the source checkout:
- App checkout:
/opt/omnilux - Database and downloads:
/var/lib/omnilux - Media library:
/srv/media
Environment variables
Set these before starting or add them to a .env file:
export NODE_ENV=production
export PORT=4000
export OMNILUX_DB_PATH=/var/lib/omnilux/omnilux.db
export OMNILUX_LIBRARY_ROOT=/srv/media
export OMNILUX_DOWNLOAD_PATH=/var/lib/omnilux/downloadsSee Environment Variables for the full reference.
systemd service
Create /etc/systemd/system/omnilux.service:
[Unit]
Description=OmniLux Media Platform
After=network.target
[Service]
Type=simple
User=omnilux
Group=omnilux
WorkingDirectory=/opt/omnilux
ExecStart=/usr/bin/node apps/server/dist/index.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=4000
Environment=OMNILUX_DB_PATH=/var/lib/omnilux/omnilux.db
Environment=OMNILUX_LIBRARY_ROOT=/srv/media
Environment=OMNILUX_DOWNLOAD_PATH=/var/lib/omnilux/downloads
# Hardening
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/var/lib/omnilux /srv/media
[Install]
WantedBy=multi-user.targetEnable and start:
sudo systemctl daemon-reload
sudo systemctl enable --now omniluxThen verify the process and API are reachable before you move on to reverse proxy or remote access.
Updating
cd /opt/omnilux
git pull
pnpm install
pnpm build
sudo systemctl restart omniluxDatabase migrations run automatically on startup.
After updates, use Updating OmniLux for the safer operational checklist.
Backup
Before updating, back up your database: cp /var/lib/omnilux/omnilux.db /var/lib/omnilux/omnilux.db.bak