This article goes through step-by-step of how to deploy a .Net Core application as a Systemd daemon process on Linux Ubuntu.

Creating a new user

Linux daemon processes should be run under a user other than root. To create a user with sudo privileges, add the user to the sudo group. The following will show how this can be achieved.

# create a new user on Ubuntu 16.04
adduser new_user 

# add user to the sudo group
usermod -aG sudo new_user

# command to remove user and its related home directory
# deluser --remove-home new_user

# switch to the user
su - new_user

# navigate to user directory

Setting up systemd process for .Net Core application

To run a .Net Core application under a user, we have to set the .Net Core application file privileges. Before starting the application, remember to update application.json to point to the correct database and directory paths. Assuming that your application is going to run from:

# Granting persmission to directory containing app.dll
chmod -R ug+wrx dotnetcoreapp/

# navigate into the directory and test the new privileges
# depending on the application, you may need to be in the directory where the app.dll is located 
cd /home/new_user/dotnetcoreapp

sudo dotnet app.dll

If permissions are granted successfully, you should be able to run the application. the next step is to hook it onto a systemd process.

Create Linux daemon process

Create a daemon process to run the application. First, we will need to create the daemon service by creating a new service file under systemd.

# Using a linux file editor like vi or nano 
# (you may need to install if you haven't already)
sudo nano /etc/systemd/system/kestrel-name_of_the_service.service

# Place the following into the new service file 
# assuming /home/new_user/dotnetcoreapp is the application root
# user_name should have the required permissions
Description=name_of_the_service on Ubuntu

ExecStart=/usr/bin/dotnet /home/new_user/dotnetcoreapp/app.dll


Start the service using the following commands.

# enable and start the service
systemctl enable kestrel-name_of_the_service .service
systemctl start kestrel-name_of_the_service .service

# you need to restart the service every time you change the service file for it to take effect

Source - Microsoft's  .Net core example