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.dllappsettings.jsonappsettings.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
curlor 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.jsonconnection string and PostgreSQL is running. -
Warning
could not change directory to "/root": Permission deniedin 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_ENVIRONMENTsetting) for development or production.
Description
Languages
Shell
100%