<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: APO72A</title>
    <description>The latest articles on DEV Community by APO72A (@apo72a).</description>
    <link>https://dev.to/apo72a</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3936427%2Fa1ad74f8-f0e2-412f-ade7-3f3e2be33ba2.png</url>
      <title>DEV Community: APO72A</title>
      <link>https://dev.to/apo72a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apo72a"/>
    <language>en</language>
    <item>
      <title>I Built and Deployed a Production Web Backend in Raw C++20</title>
      <dc:creator>APO72A</dc:creator>
      <pubDate>Mon, 18 May 2026 07:37:47 +0000</pubDate>
      <link>https://dev.to/apo72a/i-built-and-deployed-a-production-web-backend-in-raw-c20-27ka</link>
      <guid>https://dev.to/apo72a/i-built-and-deployed-a-production-web-backend-in-raw-c20-27ka</guid>
      <description>&lt;p&gt;I built something most developers would probably tell me not to build:&lt;/p&gt;

&lt;p&gt;A production web backend in raw C++20.&lt;/p&gt;

&lt;p&gt;Building a production web server in raw C++20. &lt;br&gt;
No frameworks. No external libraries. &lt;br&gt;
Zero dependencies beyond the OS itself.&lt;/p&gt;

&lt;p&gt;Not because I had to. Because I wanted to understand &lt;br&gt;
infrastructure at the lowest level possible.&lt;/p&gt;

&lt;p&gt;This is the full story — every obstacle, every fix, &lt;br&gt;
every command — from a blank CLion project to a live &lt;br&gt;
HTTPS secured domain at aureonops.dev.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why C++?
&lt;/h2&gt;

&lt;p&gt;Most backend tutorials point you toward Node.js, &lt;br&gt;
Python, or Go. Fast to set up, large ecosystems, &lt;br&gt;
plenty of tutorials.&lt;/p&gt;

&lt;p&gt;But I kept asking the same question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What's actually happening underneath?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C++ forced me to find out. Every connection, every &lt;br&gt;
socket, every HTTP response — I had to build it &lt;br&gt;
myself or it didn't exist.&lt;/p&gt;

&lt;p&gt;Initial local observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small native binary&lt;/li&gt;
&lt;li&gt;Very low memory usage&lt;/li&gt;
&lt;li&gt;Fast startup&lt;/li&gt;
&lt;li&gt;No framework/runtime dependency layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Formal benchmarks are planned for a future release.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;Before we get into the journey, here's what we &lt;br&gt;
ended up with: &lt;/p&gt;

&lt;p&gt;Engine        →  C++20 (raw WinSock2 / POSIX sockets)&lt;br&gt;
OS            →  Ubuntu 24.04 LTS&lt;br&gt;
Proxy         →  Nginx&lt;br&gt;
DNS / CDN     →  Cloudflare&lt;br&gt;
Security      →  SSL/TLS + UFW firewall&lt;br&gt;
Persistence   →  systemd service&lt;br&gt;
Host          →  DigitalOcean $6 VPS&lt;br&gt;
Domain        →  aureonops.dev&lt;/p&gt;


&lt;h2&gt;
  
  
  Building the Backend
&lt;/h2&gt;

&lt;p&gt;The core of AUREON is a single &lt;code&gt;main.cpp&lt;/code&gt; file. &lt;br&gt;
No router library. No HTTP parsing library. &lt;br&gt;
Raw socket programming.&lt;/p&gt;

&lt;p&gt;The server works like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Create socket&lt;/span&gt;
&lt;span class="n"&gt;SocketType&lt;/span&gt; &lt;span class="n"&gt;serverSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Bind to port 8080&lt;/span&gt;
&lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;serverAddr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;serverAddr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;serverAddr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;serverAddr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;INADDR_ANY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverSocket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;serverAddr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverAddr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverSocket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Accept connections&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SocketType&lt;/span&gt; &lt;span class="n"&gt;clientSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serverSocket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clientSocket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Parse request, build response, send it back&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire connection model. Accept a request, &lt;br&gt;
handle it, close the connection, repeat.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cross Platform from Day One
&lt;/h3&gt;

&lt;p&gt;One non-negotiable requirement — it had to compile &lt;br&gt;
on both Windows and Linux.&lt;/p&gt;

&lt;p&gt;The solution was clean &lt;code&gt;#ifdef&lt;/code&gt; guards:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifdef _WIN32
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;winsock2.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#pragma comment(lib, "ws2_32.lib")
#else
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#endif
&lt;/span&gt;
&lt;span class="cp"&gt;#ifdef _WIN32
&lt;/span&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;SocketType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SOCKET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#else
&lt;/span&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;SocketType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Developed on Windows in CLion. Deployed on Ubuntu. &lt;br&gt;
Same codebase. Zero changes.&lt;/p&gt;
&lt;h3&gt;
  
  
  API Routes
&lt;/h3&gt;

&lt;p&gt;Request routing is done via simple string matching &lt;br&gt;
on the raw HTTP buffer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GET /api/status"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;npos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="s"&gt;"HTTP/1.1 200 OK&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
        &lt;span class="s"&gt;"Content-Type: application/json&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
        &lt;span class="s"&gt;"Access-Control-Allow-Origin: *&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
        &lt;span class="s"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;online&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;C++&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;}"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not elegant by framework standards. But completely &lt;br&gt;
transparent. You know exactly what every byte of &lt;br&gt;
that response contains.&lt;/p&gt;
&lt;h3&gt;
  
  
  File Serving
&lt;/h3&gt;

&lt;p&gt;Static files are served directly from disk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;serveFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ifstream&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stringstream&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rdbuf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"HTTP/1.1 200 OK&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
           &lt;span class="s"&gt;"Content-Type: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
           &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend lives in a &lt;code&gt;/frontend&lt;/code&gt; folder — &lt;br&gt;
&lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, &lt;code&gt;script.js&lt;/code&gt;. &lt;br&gt;
The C++ server reads and serves them on every request.&lt;/p&gt;


&lt;h2&gt;
  
  
  The First Deployment Disaster 💀
&lt;/h2&gt;

&lt;p&gt;Everything worked on localhost. Time to go live.&lt;/p&gt;

&lt;p&gt;I spun up a DigitalOcean Ubuntu droplet, cloned &lt;br&gt;
the repo, built the binary, and ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And immediately locked myself out of SSH.&lt;/p&gt;

&lt;p&gt;The mistake? I enabled UFW before adding port 22.&lt;br&gt;
UFW's default is deny all incoming — including SSH.&lt;br&gt;
The server was unreachable. Web console timed out.&lt;br&gt;
Complete lockout.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Destroy the droplet. Start over. &lt;br&gt;
This time with the correct order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow SSH FIRST — before anything else&lt;/span&gt;
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 8080/tcp

&lt;span class="c"&gt;# THEN enable&lt;/span&gt;
ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lesson learned the hard way. UFW order of operations &lt;br&gt;
matters. Always allow SSH before enabling the firewall.&lt;/p&gt;


&lt;h2&gt;
  
  
  Cross Platform Build Issue
&lt;/h2&gt;

&lt;p&gt;The Linux build hit another wall immediately: &lt;/p&gt;

&lt;p&gt;fatal error: winsock2.h: No such file or directory&lt;/p&gt;

&lt;p&gt;The CMakeLists.txt was linking &lt;code&gt;ws2_32&lt;/code&gt; unconditionally &lt;br&gt;
— a Windows only library. Linux doesn't have it.&lt;/p&gt;

&lt;p&gt;Fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;&lt;span class="nb"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;WIN32&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;target_link_libraries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;cpp_backend_test ws2_32&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three lines. Problem gone. Build succeeded.&lt;/p&gt;




&lt;h2&gt;
  
  
  systemd — Making It Persistent
&lt;/h2&gt;

&lt;p&gt;A server that dies when you close the terminal &lt;br&gt;
isn't a server. It's a demo.&lt;/p&gt;

&lt;p&gt;The fix is a systemd service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;AUREON C++ Backend&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/root/aureon-cpp-backend&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/root/aureon-cpp-backend/server&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;aureon
systemctl start aureon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The systemd bug that looked like a backend failure
&lt;/h2&gt;

&lt;p&gt;At one point the service was active, but the site returned:&lt;/p&gt;

&lt;p&gt;404 - File not found&lt;/p&gt;

&lt;p&gt;The binary was running, but it could not find &lt;code&gt;frontend/index.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The fix was not in C++ at all. It was systemd:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/root/aureon-cpp-backend&lt;/span&gt;


&lt;span class="err"&gt;That&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;real&lt;/span&gt; &lt;span class="err"&gt;engineering&lt;/span&gt; &lt;span class="err"&gt;lesson.&lt;/span&gt;

&lt;span class="err"&gt;---&lt;/span&gt;

&lt;span class="c"&gt;### 6. Mention the Cloudflare 521 issue
&lt;/span&gt;
&lt;span class="err"&gt;This&lt;/span&gt; &lt;span class="err"&gt;is&lt;/span&gt; &lt;span class="err"&gt;another&lt;/span&gt; &lt;span class="err"&gt;great&lt;/span&gt; &lt;span class="err"&gt;struggle&lt;/span&gt; &lt;span class="err"&gt;section.&lt;/span&gt;

&lt;span class="err"&gt;Add:&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
md&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cloudflare 521 problem
&lt;/h2&gt;

&lt;p&gt;After the domain was connected, Cloudflare returned:&lt;/p&gt;

&lt;p&gt;521 Web Server Is Down&lt;/p&gt;

&lt;p&gt;The backend was alive. &lt;code&gt;curl http://127.0.0.1:8080&lt;/code&gt; returned the correct HTML.&lt;/p&gt;

&lt;p&gt;That narrowed the issue down to the path between Cloudflare, Nginx, and the origin SSL configuration.&lt;/p&gt;

&lt;p&gt;The lesson: when debugging production, test each layer separately.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the backend alive locally?&lt;/li&gt;
&lt;li&gt;Is Nginx proxying correctly?&lt;/li&gt;
&lt;li&gt;Is DNS pointing correctly?&lt;/li&gt;
&lt;li&gt;Is SSL mode compatible with the origin?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Debugging checklist I wish I had earlier
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Is the backend alive?&lt;/span&gt;
curl http://127.0.0.1:8080

&lt;span class="c"&gt;# Is the backend listening?&lt;/span&gt;
ss &lt;span class="nt"&gt;-tulnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;8080

&lt;span class="c"&gt;# Is the service running?&lt;/span&gt;
systemctl status aureon

&lt;span class="c"&gt;# What did the service log?&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; aureon &lt;span class="nt"&gt;-n&lt;/span&gt; 50 &lt;span class="nt"&gt;--no-pager&lt;/span&gt;

&lt;span class="c"&gt;# Is Nginx config valid?&lt;/span&gt;
nginx &lt;span class="nt"&gt;-t&lt;/span&gt;

&lt;span class="c"&gt;# Is the firewall correct?&lt;/span&gt;
ufw status

Now AUREON:
- Starts automatically on boot
- Restarts automatically on crash
- Runs 24/7 without a terminal session

&lt;span class="nt"&gt;---&lt;/span&gt;

&lt;span class="c"&gt;## Nginx — The Right Way to Expose a Backend&lt;/span&gt;

Running a C++ binary directly on port 80 is 
not how production works.

Nginx sits &lt;span class="k"&gt;in &lt;/span&gt;front as a reverse proxy:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
nginx&lt;br&gt;
server {&lt;br&gt;
    listen 80;&lt;br&gt;
    server_name aureonops.dev;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Benefits:
- Clean port 80/443 — no `:8080` in the URL
- SSL termination handled by Nginx + Cloudflare
- Easy to add rate limiting, caching later
- Industry standard architecture

---

## Cloudflare — Free Enterprise Grade Protection

Pointing the domain through Cloudflare's orange cloud 
gave AUREON:

- **Free SSL/TLS** — HTTPS on aureonops.dev
- **Cloudflare edge layer — DNS, proxying, TLS, and CDN capability
- **DDoS protection** — built in, automatic
- **DNS management** — fast, reliable

HTTPS is enabled through Let’s Encrypt on the origin server, with Cloudflare handling the edge layer. — Cloudflare encrypts 
all the way to the origin server.

---

## The Final Architecture

User Browser
│
⌄
┌─────────────┐
│  Cloudflare │  &amp;lt; DNS + CDN + DDoS + SSL
└──────┬──────┘
│ HTTPS
┌──────⌄──────┐
│    Nginx    │  &amp;lt; Reverse proxy, port 80/443
└──────┬──────┘
│ HTTP
┌──────⌄──────┐
│   AUREON    │  &amp;lt; C++20 binary, port 8080
│  C++ Engine │
└─────────────┘
│
DigitalOcean
Ubuntu 24.04
$6/month VPS

---

## The Result

[aureonops.dev](https://aureonops.dev) is live.

A raw C++ binary handling real HTTP requests, 
serving a production frontend, secured by Cloudflare, 
proxied by Nginx, running 24/7 as a systemd service 
on a $6 VPS.

Performance characteristics:
- Binary size: &amp;lt; 500KB
- Memory usage: &amp;lt; 10MB
- Cold start: &amp;lt; 10ms
- Zero runtime dependencies

---

## What I Learned

**1. Low level is not harder — it's more transparent**
Frameworks hide complexity. Raw sockets reveal it.
Both have their place but understanding the low level
makes you a better developer at any level.

**2. Production is a different beast than localhost**
UFW, systemd, Nginx, SSL — none of this exists 
on your laptop. The gap between "it works locally" 
and "it works in production" is where real 
engineering happens.

**3. C++ for web backends is underrated**
Not for every use case. But for performance 
critical, low latency, resource constrained 
systems — nothing comes close.

**4. The stack matters less than the fundamentals**
Understanding sockets, HTTP, file serving, process 
management — these skills transfer to every stack.

---

## What's Next for AUREON

AUREON is evolving into a high performance backend 
infrastructure platform:

- Multi-threaded connection handling
- Built in metrics and telemetry
- One command deployment scripts
- Docker container support
- Developer template packages

The goal: make C++ backend deployment accessible 
to engineers who care about performance without 
the painful setup.

---

## Try It Yourself

The full source code is open source:

**GitHub:** [APO72A/aureon-cpp-backend](https://github.com/APO72A/aureon-cpp-backend)

**Live:** [aureonops.dev](https://aureonops.dev)

If you have questions, drop them in the comments.
Happy to go deep on any part of this. ⚙️

---

*Built with C++ · Deployed on DigitalOcean · 
Secured by Cloudflare*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>cpp</category>
      <category>backend</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
