Skip to content

Manual Installation

Prerequisites (tested on Ubuntu 22.04+):

  • An Ubuntu server with sudo access
  • A domain name pointing to your server's public IP (recommended)

1. System setup

Update and install required packages:

bash
sudo apt update
sudo apt install -y git curl build-essential nginx python3-certbot-nginx ffmpeg

Install Node.js and npm (pick one):

MethodBest forNote
NodeSourceMost installs (recommended)System-wide install via apt.
nvmPer-user Node version managementRequires nvm install / nvm use after cloning.
VoltaPinned toolchain per projectInstalls a specific Node/npm version.

NodeSource (Recommended):

bash
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs

nvm:

bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/latest/install.sh | bash

Volta:

bash
curl https://get.volta.sh | bash
volta install node@24.11.1 npm@11.6.4

2. Clone repository

bash
sudo mkdir -p /opt/songbird
cd /opt/songbird
git clone https://github.com/bllackbull/Songbird.git .

INFO

If you installed Node.js using nvm:

bash
nvm install
nvm use

3. Install dependencies

bash
cd /opt/songbird/server
npm install

cd /opt/songbird/client
npm install
npm run build

4. Create systemd service

Create /etc/systemd/system/songbird.service with the following:

ini
[Unit]
Description=Songbird server
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/songbird/server
ExecStart=/usr/bin/env node /opt/songbird/server/index.js
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

INFO

  • If you installed Node.js using nvm, set this as Node path in ExecStart:
ini
ExecStart=/root/.nvm/versions/node/v24.11.1/bin/node index.js
  • If you installed Node.js using volta, set this as Node path in ExecStart:
ini
ExecStart=/root/.volta/bin/node index.js

Recommended: Create a dedicated user:

WARNING

Skip this step if you installed Node.js using nvm or volta.

Due to security concerns, it is recommended to create a dedicated system user and change ownership of the project directory:

  1. Add these lines to systemd service file:
ini
User=songbird
Group=songbird
  1. Create a dedicated system user:
bash
sudo useradd --system --no-create-home --shell /usr/sbin/nologin songbird
  1. Change ownership of the project directory:
bash
sudo chown -R songbird:songbird /opt/songbird
git config --global --add safe.directory /opt/songbird
  1. Grant the service user permission to control its own unit and read system logs (required for service restart/stop and the Logs tab in the admin panel):
bash
sudo tee /etc/sudoers.d/songbird > /dev/null <<'EOF'
# Songbird — allow the service user to control its own unit
# and read privileged logs without a password.
songbird ALL=(root) NOPASSWD: /usr/bin/systemctl restart songbird.service
songbird ALL=(root) NOPASSWD: /usr/bin/systemctl stop songbird.service
songbird ALL=(root) NOPASSWD: /usr/bin/journalctl -u songbird *
songbird ALL=(root) NOPASSWD: /usr/bin/cat /var/log/nginx/error.log
songbird ALL=(root) NOPASSWD: /usr/bin/cat /var/log/nginx/access.log
songbird ALL=(root) NOPASSWD: /usr/bin/nginx -t
songbird ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx
EOF
sudo chmod 0440 /etc/sudoers.d/songbird

Without this step the Restart service and Stop service buttons in the admin panel will fail with a permissions error, and system logs (service journal, nginx) will not be visible in the Logs tab.

Enable and start the service:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now songbird.service

Released under the MIT License.