Run nats-server as systemd service

Run nats-server as systemd service

Required packages

apt-get install wget

# For readlink
apt-get install coreutils

Script to auto setup nats-server as service

  1. NOTE: It is assume that this script will run as root. That is why there is no sudo in front of commands: groupadd, useradd, systemctl.
  2. This will download nats server binary from github: https://github.com/nats-io/nats-server/releases/download/v2.11.4/nats-server-v2.11.4-linux-amd64.tar.gz
  3. Setup and register nats-server as service in systemd.
#!/bin/bash
set -e

# Download nats server
    url=https://github.com/nats-io/nats-server/releases/download/v2.11.4/nats-server-v2.11.4-linux-amd64.tar.gz
    wget ${url}

    nats_server_dir="./nats-server";
    rm -rf "${nats_server_dir}" || true
    mkdir -p "${nats_server_dir}";
    tar -vxzf $(\ls nats-server*linux-amd64.tar.gz | sort -r | head -n1)  --strip 1 -C "${nats_server_dir}";

# Get nats-server paths
    nasts_server_bin=$(readlink -ev "./nats-server/nats-server")
    nasts_server_conf_file="nats-server.prod.conf"
        touch "${nasts_server_conf_file}"
        nasts_server_conf_file=$(readlink -ev "${nasts_server_conf_file}")

# Get sample service file
    sample_service_file="sample-nats-server.service"
    url=https://raw.githubusercontent.com/nats-io/nats-server/refs/heads/main/util/nats-server.service
    wget ${url} -O "${sample_service_file}"

# Write new service file with new executable path
    nats_service_file="nats-server.service"
    exec_cmd="ExecStart=\"${nasts_server_bin}\" -c \"${nasts_server_conf_file}\""
    sed "s|^ExecStart=.*$|${exec_cmd}|" "${sample_service_file}" > "${nats_service_file}"

# Create nats user and group
    groupadd nats   || true
    useradd -r -s /usr/sbin/nologin -d /opt/nats -m -g nats nats || true

# Register service
    \cp "${nats_service_file}" /etc/systemd/system/
    systemctl enable "${nats_service_file}"
    systemctl start "${nats_service_file}"
    systemctl status "${nats_service_file}" --no-pager

nats user and group creation explanation

useradd -r -s /usr/sbin/nologin -d /opt/nats -m -g nats nats:

  • -r: Creates a system user (no password needed, typically used for services).
  • -s /usr/sbin/nologin: Sets the login shell to /usr/sbin/nologin, preventing direct login.
  • -d /opt/nats: Sets the home directory for the user to /opt/nats. You might need to create this directory if it doesn't exist.
  • -m: Creates the home directory if it doesn't exist.
  • -g nats: Assigns the user to the nats group.
  • nats: The username.

Troubleshooting

  • If you don't create a nats user and group, you will get the following error when systemd tries to run nats server service.
    systemd[1]: Started nats-server.service - NATS Server.
    systemd[1]: nats-server.service: Main process exited, code=exited, status=217/USER
    systemd[1]: nats-server.service: Failed with result 'exit-code'.
    systemd[1]: nats-server.service: Scheduled restart job, restart counter is at 5.
    systemd[1]: Stopped nats-server.service - NATS Server.
    systemd[1]: nats-server.service: Start request repeated too quickly.
    systemd[1]: nats-server.service: Failed with result 'exit-code'.
    systemd[1]: Failed to start nats-server.service - NATS Server.
    
  • Useful commands
    systemctl stop nats-server.service
    systemctl start nats-server.service
    systemctl restart nats-server.service
    systemctl status nats-server.service  --no-pager
    
    # Display logs of service
    journalctl -u nats-server.service