Files
dashy/docs/deployment/bare-metal.md
2026-07-04 14:43:10 +01:00

8.6 KiB

Bare Metal

Build from Source

Dashy can be compiled and run directly on your machine.
For this, you will need both git and Node.js (v20 or newer) installed.

  1. Get Code: git clone https://github.com/Lissy93/dashy.git and cd dashy
  2. Configuration: Fill in your settings in ./user-data/conf.yml
  3. Install dependencies: yarn
  4. Build: yarn build
  5. Run: yarn start

For example, the following steps can be used for Ubuntu/Debian based distros:

# Install prerequisites
sudo apt update
sudo apt install -y curl git

# Install Node.js (v24 LTS) from NodeSource, and enable yarn
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs
sudo corepack enable

# Get the code
git clone https://github.com/Lissy93/dashy.git
cd dashy

# Install dependencies and build
yarn
yarn build

# Run it (serves on http://localhost:4000 by default, change with PORT env var)
yarn start

# Put all your assets (icons, styles, scripts, fonts, pages, etc) and configs in ./user-data
# Then, get started with editing the main config
nano user-data/conf.yml

Notes:

  • If you're making changes to Dashy's codebase, you can run yarn dev to start the dev server with hot reloading. See the Developing docs for more info.
  • To keep Dashy running in the background, either use yarn pm2-start (instead of yarn start). Or, with systemd, see the systemd service example below

Pre-Built Release

We publish GitHub releases for every major and minor (not patch) version of Dashy.
Each release includes the pre-compiled app as dashy-[version].tar.gz (plus a SHA256 checksum and SLSA build-provenance attestation).

This is useful if you want to run Dashy on bare metal, without the need to compile from source.

You'll need Node.js (v20 or newer), curl, tar, and yarn enabled through Corepack.

  1. Pick a release from GitHub Releases
  2. Download dashy-[version].tar.gz
  3. Extract it somewhere permanent, such as /opt/dashy
  4. Run yarn install --production --frozen-lockfile
  5. Edit user-data/conf.yml
  6. Start it with node server

For example (replace 4.3.0 with whichever version you want):

curl -LO https://github.com/Lissy93/dashy/releases/download/4.3.0/dashy-4.3.0.tar.gz
mkdir -p dashy
tar -xzf dashy-4.3.0.tar.gz -C dashy
cd dashy
corepack enable
yarn install --production --frozen-lockfile
node server

Dashy will run on http://localhost:4000 by default. Change this with the PORT env var.

You can now start configuring by editing user-data/conf.yml and put any assets you want within user-data.


Systemd Service

If you're running Dashy on a Linux server, you can use systemd to start it at boot and restart it if it crashes.

This example assumes Dashy is installed in /opt/dashy, and runs it as a dedicated dashy user, so adjust it for your usecase.

Run these commands as root:

useradd --system --home /opt/dashy --shell /usr/sbin/nologin dashy
chown -R dashy:dashy /opt/dashy

Create /etc/systemd/system/dashy.service:

[Unit]
Description=Dashy
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=dashy
WorkingDirectory=/opt/dashy
Environment=NODE_ENV=production
Environment=PORT=4000
ExecStart=/usr/bin/env node server
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Then enable and start it:

systemctl daemon-reload
systemctl enable --now dashy
systemctl status dashy

If you installed Dashy somewhere else, update WorkingDirectory.


Checksum Verification

Each pre-built release includes a SHA256 checksum. This is optional, but it is a quick way to check the file downloaded correctly.

curl -LO https://github.com/Lissy93/dashy/releases/download/4.3.0/dashy-4.3.0.tar.gz
curl -LO https://github.com/Lissy93/dashy/releases/download/4.3.0/dashy-4.3.0.tar.gz.sha256
sha256sum -c dashy-4.3.0.tar.gz.sha256

You should see dashy-4.3.0.tar.gz: OK.


Provenance Attestation

GitHub releases also include a SLSA build-provenance attestation. This lets you verify that the release asset was built by Dashy's GitHub Actions release workflow.

Install a recent GitHub CLI, then run:

gh attestation verify dashy-4.3.0.tar.gz --repo Lissy93/dashy

Install Script

The following is an example script to install or update the latest pre-built release on a Linux server with systemd. It creates a dashy user, installs into /opt/dashy, verifies the SHA256 checksum, installs production dependencies, and starts Dashy as a service.

install-dashy.sh
#!/usr/bin/env bash
set -euo pipefail

REPO="Lissy93/dashy"
INSTALL_DIR="${INSTALL_DIR:-/opt/dashy}"
RUN_USER="${RUN_USER:-dashy}"
PORT="${PORT:-4000}"
VERSION="${DASHY_VERSION:-latest}"

if [ "$(id -u)" -ne 0 ]; then
  echo "Please run this script as root"
  exit 1
fi

need_cmd() {
  command -v "$1" >/dev/null 2>&1 || {
    echo "Missing required command: $1"
    exit 1
  }
}

install_packages() {
  if command -v apt-get >/dev/null 2>&1; then
    apt-get update
    apt-get install -y curl ca-certificates tar gzip coreutils
  elif command -v dnf >/dev/null 2>&1; then
    dnf install -y curl ca-certificates tar gzip coreutils nodejs
  elif command -v yum >/dev/null 2>&1; then
    yum install -y curl ca-certificates tar gzip coreutils nodejs
  else
    echo "Please install curl, tar, sha256sum and Node.js v20 or newer, then re-run this script."
    exit 1
  fi
}

install_packages
need_cmd curl
need_cmd tar
need_cmd sha256sum
need_cmd runuser

install_node_apt() {
  curl -fsSL https://deb.nodesource.com/setup_24.x | bash -
  apt-get install -y nodejs
}

if ! command -v node >/dev/null 2>&1; then
  if command -v apt-get >/dev/null 2>&1; then
    install_node_apt
  else
    echo "Please install Node.js v20 or newer, then re-run this script."
    exit 1
  fi
fi

NODE_MAJOR="$(node -p "process.versions.node.split('.')[0]")"
if [ "$NODE_MAJOR" -lt 20 ]; then
  if command -v apt-get >/dev/null 2>&1; then
    install_node_apt
    NODE_MAJOR="$(node -p "process.versions.node.split('.')[0]")"
  fi

  if [ "$NODE_MAJOR" -lt 20 ]; then
    echo "Node.js v20 or newer is required. Found: $(node -v)"
    exit 1
  fi
fi

corepack enable
need_cmd yarn

case "$INSTALL_DIR" in
  /*) ;;
  *) echo "INSTALL_DIR must be an absolute path"; exit 1 ;;
esac

if [ "$INSTALL_DIR" = "/" ]; then
  echo "INSTALL_DIR cannot be /"
  exit 1
fi

if [ "$VERSION" = "latest" ]; then
  RELEASE_URL="$(curl -fsSLI -o /dev/null -w '%{url_effective}' "https://github.com/${REPO}/releases/latest")"
  VERSION="${RELEASE_URL##*/}"
fi
VERSION="${VERSION#v}"

ASSET="dashy-${VERSION}.tar.gz"
BASE_URL="https://github.com/${REPO}/releases/download/${VERSION}"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "$TMP_DIR"' EXIT

echo "Downloading Dashy ${VERSION}..."
curl -fL "${BASE_URL}/${ASSET}" -o "${TMP_DIR}/${ASSET}"
curl -fL "${BASE_URL}/${ASSET}.sha256" -o "${TMP_DIR}/${ASSET}.sha256"

(
  cd "$TMP_DIR"
  sha256sum -c "${ASSET}.sha256"
)

if ! id "$RUN_USER" >/dev/null 2>&1; then
  useradd --system --home "$INSTALL_DIR" --shell /usr/sbin/nologin "$RUN_USER"
fi

if [ -d "$INSTALL_DIR/user-data" ]; then
  BACKUP_DIR="${INSTALL_DIR}.user-data.$(date +%Y%m%d%H%M%S)"
  cp -a "$INSTALL_DIR/user-data" "$BACKUP_DIR"
  echo "Backed up user-data to ${BACKUP_DIR}"
fi

NEW_DIR="${INSTALL_DIR}.new"
OLD_DIR="${INSTALL_DIR}.old"

rm -rf "$NEW_DIR" "$OLD_DIR"
mkdir -p "$NEW_DIR"
tar -xzf "${TMP_DIR}/${ASSET}" -C "$NEW_DIR"

if [ -d "$INSTALL_DIR/user-data" ]; then
  rm -rf "${NEW_DIR}/user-data"
  cp -a "$INSTALL_DIR/user-data" "${NEW_DIR}/user-data"
fi

chown -R "$RUN_USER:$RUN_USER" "$NEW_DIR"

runuser -u "$RUN_USER" -- bash -lc "cd '$NEW_DIR' && yarn install --production --frozen-lockfile"

if [ -d "$INSTALL_DIR" ]; then
  mv "$INSTALL_DIR" "$OLD_DIR"
fi

mv "$NEW_DIR" "$INSTALL_DIR"
rm -rf "$OLD_DIR"

cat >/etc/systemd/system/dashy.service <<EOF
[Unit]
Description=Dashy
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=${RUN_USER}
WorkingDirectory=${INSTALL_DIR}
Environment=NODE_ENV=production
Environment=PORT=${PORT}
ExecStart=/usr/bin/env node server
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable dashy
systemctl restart dashy

echo "Dashy ${VERSION} is running on http://localhost:${PORT}"
echo "Edit your config at ${INSTALL_DIR}/user-data/conf.yml"

To install a specific version, run it with DASHY_VERSION=4.3.0. To use a different port, set PORT=8080.