logo Buffalo slack logo
Systemd Service
Deploy

Systemd Service#

In this chapter, we’ll see how to setup your Buffalo app as a Systemd service. Systemd is the new standard on many GNU/Linux distributions, for running the system services.

It allows you to configure an application in a standard way, and manage its lifecycle with systemctl commands. You can refer to the systemd man page for further information.

Install Your Buffalo App#

The first step is to place your app into the right folder: on Debian, the common place for executables installed by hand is /usr/local/bin. That’s where we’ll install the app.

$ sudo mv myapp /usr/local/bin

Ensure the rights are correctly set, and give the ownership to the user you want to use. Here, I’ll use the root account.

$ sudo chown root: /usr/local/bin/myapp
$ sudo chmod +x /usr/local/bin/myapp

Create the Systemd Config File#

The systemd service files are located in /lib/systemd/system/, we’ll create a new myapp.service file there for your app.

[Unit]
Description=My super app

[Service]
ExecStart=/usr/local/bin/myapp
User=root
Group=root
UMask=007

[Install]
WantedBy=multi-user.target

Here, we create a new service with an readable name “My super app”. It’s a simple service, which will spawn a new process described with ExecStart: the absolute path to your app. This process will be executed as root:root, with a UMask giving rights only to the process owner (root).

In the Install section, we just tell Systemd to wait for a ready system. If you have more requirements, you can ask Systemd to wait for a database, for instance:

[Unit]
Description=My super app
After=mysql.service

[Service]
ExecStart=/usr/local/bin/myapp
User=root
Group=root
UMask=007

[Install]
WantedBy=multi-user.target

Set Env Variables#

The official way to handle config with Buffalo is through environment variables. Using Systemd, you can set them with an override file.

Our override file will be located in /etc/systemd/system/myapp.service.d/, and be called override.conf.

[Service]
Environment="ADDR=0.0.0.0"
Environment="GO_ENV=production"
Environment="SESSION_SECRET=kqdjmlkajdùméa]$"

Each Environment line define an environment variable for your app.

Play with the Service#

The systemd service is now ready, you can test it with the systemctl and journalctl commands:

$ sudo systemctl start myapp.service

To start the service, and check if everything is running fine.

$ journalctl -u myapp.service -f

To read the logs from the standard output (-u to set the service name, -f to follow the logs).

$ sudo systemctl stop myapp.service

To stop the service, for a maintenance (for instance).

Enable the Service on Startup#

Once the service is working as you want, you can enable it on startup. This way, if the server need to restart, your app will restart as well.

$ sudo systemctl enable myapp.service