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