Deploying .NET Web API with PostgreSQL on Debian 12 LXC

Overview

This document outlines the steps taken to deploy a .NET Web API on a Debian 12 (Bookworm) LXC container running on Proxmox, and connect it to a PostgreSQL database accessible by the API.


Prerequisites

  • Debian 12 (Bookworm) LXC container on Proxmox
  • Root or sudo access on the container
  • Published .NET Web API DLL ready for deployment
  • PostgreSQL installed on the container

Step 1: Install .NET 8 Runtime and SDK

sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates gnupg wget
wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install -y dotnet-sdk-8.0 aspnetcore-runtime-8.0
dotnet --list-sdks
dotnet --list-runtimes

Step 2: Install PostgreSQL

sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable postgresql
sudo systemctl start postgresql

Step 3: Create PostgreSQL User and Database

Log into psql as postgres user:

sudo -u postgres psql

Inside psql shell:

CREATE USER api WITH PASSWORD 'abcd1234';
CREATE DATABASE apidatabase OWNER api;
GRANT ALL PRIVILEGES ON DATABASE apidatabase TO api;
\q

Step 4: Deploy the .NET Web API DLL

  • Copy published files to /opt/api/
  • Ensure files exist (dll, appsettings.json, etc.)

Example files present in /opt/api:

  • Taekwondo.WebApi.dll
  • appsettings.json
  • appsettings.Development.json

Step 5: Configure appsettings.json

Edit /opt/api/appsettings.json to include your database connection:

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Database=apidatabase;Username=api;Password=abcd1234"
  }
}

Step 6: Create systemd Service for API

Create /etc/systemd/system/mydotnetapi.service with:

[Unit]
Description=My .NET Web API
After=network.target

[Service]
WorkingDirectory=/opt/api
ExecStart=/usr/bin/dotnet /opt/api/Taekwondo.WebApi.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-api
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

Reload systemd and start service:

sudo systemctl daemon-reload
sudo systemctl enable mydotnetapi
sudo systemctl start mydotnetapi
sudo systemctl status mydotnetapi

Step 7: Testing API

  • Use curl or Postman to test API endpoints, e.g.:
curl http://localhost:5000/api/your-endpoint
  • Check logs in case of issues:
sudo journalctl -u mydotnetapi -f

Troubleshooting

  • Status=200/CHDIR error: Ensure working directory exists and user permissions are correct:
sudo mkdir -p /opt/api
sudo chown www-data:www-data /opt/api
  • Database connection errors: Verify appsettings.json connection string and PostgreSQL is running.

  • Warning could not change directory to "/root": Permission denied in psql is safe to ignore.


Notes

  • Adjust firewall and reverse proxy as needed.
  • Ensure PostgreSQL allows connections from your API IP if running separately.
  • Tailor environment (e.g., ASPNETCORE_ENVIRONMENT setting) for development or production.
Description
No description provided
Readme 40 KiB
Languages
Shell 100%