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
- 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.
- 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
- 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