<?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: Fabian</title>
    <description>The latest articles on DEV Community by Fabian (@fabianwolski).</description>
    <link>https://dev.to/fabianwolski</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4019553%2F028c74be-768f-40a1-ad81-c06233b8302d.png</url>
      <title>DEV Community: Fabian</title>
      <link>https://dev.to/fabianwolski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabianwolski"/>
    <language>en</language>
    <item>
      <title>Development &amp; Production Environments</title>
      <dc:creator>Fabian</dc:creator>
      <pubDate>Wed, 22 Jul 2026 08:45:43 +0000</pubDate>
      <link>https://dev.to/fabianwolski/development-production-environments-3pmh</link>
      <guid>https://dev.to/fabianwolski/development-production-environments-3pmh</guid>
      <description>&lt;h2&gt;
  
  
  Goal:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx5a5hnpt5pz2g75y1fzx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx5a5hnpt5pz2g75y1fzx.png" alt=" " width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is to setup the above basic architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  What remains is roughly(chatgpt):
&lt;/h2&gt;

&lt;p&gt;Containerise Next.js locally&lt;br&gt;
Run that container on Hetzner&lt;br&gt;
Confirm it works internally on the server.&lt;br&gt;
Point Nginx at the container&lt;br&gt;
Replace the temporary static page with the real app.&lt;br&gt;
Introduce Docker Compose&lt;br&gt;
Manage the app more cleanly and prepare separate dev and production services.&lt;br&gt;
Add dev.mynextjsapp.com&lt;br&gt;
Separate environment variables, port, and password protection.&lt;br&gt;
Add production public/private mode&lt;br&gt;
Nginx authentication during maintenance.&lt;br&gt;
Create a repeatable deployment process&lt;br&gt;
Initially manual: build image, move/push it, pull it on Hetzner, restart the intended service, verify, roll back if needed.&lt;br&gt;
Optional automation later&lt;br&gt;
GitHub Container Registry and GitHub Actions. These are not required to launch.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Containers</title>
      <dc:creator>Fabian</dc:creator>
      <pubDate>Thu, 16 Jul 2026 21:23:03 +0000</pubDate>
      <link>https://dev.to/fabianwolski/development-production-environments-1ld8</link>
      <guid>https://dev.to/fabianwolski/development-production-environments-1ld8</guid>
      <description>&lt;h1&gt;
  
  
  Goal:
&lt;/h1&gt;

&lt;p&gt;Containerize our next.js app! &lt;/p&gt;

&lt;h2&gt;
  
  
  But what does containerizing even means?
&lt;/h2&gt;

&lt;p&gt;Best analogy that helped me understand:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Dockerfile = recipe&lt;br&gt;
Image      = prepared meal&lt;br&gt;
Container  = meal being served&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Resources:
&lt;/h2&gt;

&lt;p&gt;I will be following this &lt;a href="https://docs.docker.com/guides/nextjs/" rel="noopener noreferrer"&gt;guide&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;
&lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="nx"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nx"&gt;standalone&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;standalone&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What problem are we solving with the above code?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Normally when we run &lt;code&gt;npm run build&lt;/code&gt; our project folder keep &lt;strong&gt;everything&lt;/strong&gt; and we get that infamous massive &lt;code&gt;node_modules&lt;/code&gt; folder. Now imagine putting all that into your Docker Image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does &lt;code&gt;output: "standalone"&lt;/code&gt; actually do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Standalone output (&lt;code&gt;output: "standalone"&lt;/code&gt;) makes Next.js build a self-contained output that includes only the files and dependencies needed to run the application."&lt;a href="https://docs.docker.com/guides/nextjs/" rel="noopener noreferrer"&gt;-1.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my own words, once that trimming process is done it creates a lightweight server.js file. No need for heavy next CLI tool commands; a simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to run our app and same lightweight file is used for deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker Images
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dhi.io&lt;/code&gt; - Docker Hardened Images (DHIs). They are base images pre-configured, patched and scanned by Docker to strip out unnecessary software and security vulnerabilities. &lt;/p&gt;

&lt;p&gt;we run &lt;code&gt;docker login dhi.io&lt;/code&gt; because we have to login before being able to &lt;code&gt;docker pull&lt;/code&gt;. The hardened images are found in Docker's private catalog.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3-Stage Dockerfile:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Stage 1: dependencies ] ──(passes node_modules)──&amp;gt; [ Stage 2: builder ] ──(passes standalone app)──&amp;gt; [ Stage 3: runner ]
 (Installs packages)                                  (Compiles Next.js)                                (Final tiny image)

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stage 1:&lt;/strong&gt; Download all NPM packages safely and quickly&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 2:&lt;/strong&gt; Turns source code into lightweight Next.js standalone bundle. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works?&lt;/strong&gt; grabs the installed node_modules from Stage 1, copies over the app code and runs npm build. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Because we configured output: "standalone" in our config, Next.js creates a minimal .next/standalone folder containing only the specific code needed to run in production. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage 3:&lt;/strong&gt; Turns source code into lightweight Next.js standalone bundle. &lt;/p&gt;

&lt;p&gt;Stage 1 and Stage 2 are discarded. All we have left is public/ (static images or fonts), .next/standalone (our mini Node sever), .next/static (compiled CSS/JS assets) which are&lt;/p&gt;

&lt;h2&gt;
  
  
  .yaml:
&lt;/h2&gt;

&lt;p&gt;The package.json version for my container environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Success:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00k1rljp78lgzj1ku1wj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00k1rljp78lgzj1ku1wj.png" alt=" " width="800" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Docker WSL Install</title>
      <dc:creator>Fabian</dc:creator>
      <pubDate>Thu, 16 Jul 2026 21:07:24 +0000</pubDate>
      <link>https://dev.to/fabianwolski/development-production-environments-3m16</link>
      <guid>https://dev.to/fabianwolski/development-production-environments-3m16</guid>
      <description>&lt;h2&gt;
  
  
  Goal:
&lt;/h2&gt;

&lt;p&gt;Have docker run on WSL&lt;/p&gt;

&lt;h2&gt;
  
  
  A little hiccup on download
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd72vfmzg68n9m2cf6bp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd72vfmzg68n9m2cf6bp0.png" alt=" " width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we have two distros running on wsl at the same time. Both isolated running in parallel. &lt;/p&gt;

&lt;p&gt;I've learned that "Docker Desktop runs Docker Daemon(server) inside its own hidden minimal WSL 2 distribution(called docker-desktop)"-chatgpt(yes its time we quote AI lol)&lt;/p&gt;

&lt;h2&gt;
  
  
  fix
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqk1445vb4f9rwht6ol17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqk1445vb4f9rwht6ol17.png" alt=" " width="677" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  but what happened under the hood 🧐
&lt;/h1&gt;

&lt;p&gt;you would not be reading this blog if the above statement doesn't keep you up at night.&lt;/p&gt;

&lt;p&gt;symlinks!... to the rescue, once again! we've touched on these in my previous post. &lt;/p&gt;

&lt;p&gt;upon toggling &lt;strong&gt;WSL Integration&lt;/strong&gt; on for Ubuntu-24.04 Docker Desktop which adds a symlink named docker inside my /usr/bin/ that points to Docker Desktop's CLI tools running in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  what's next?
&lt;/h2&gt;

&lt;p&gt;Containerize our next.js app! &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Nginx</title>
      <dc:creator>Fabian</dc:creator>
      <pubDate>Thu, 16 Jul 2026 20:59:19 +0000</pubDate>
      <link>https://dev.to/fabianwolski/development-production-environments-38aj</link>
      <guid>https://dev.to/fabianwolski/development-production-environments-38aj</guid>
      <description>&lt;h1&gt;
  
  
  Goal:
&lt;/h1&gt;

&lt;p&gt;Have nginx serve a custom static html file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nginx
&lt;/h2&gt;

&lt;p&gt;The front-desk receptionist to my web traffic. &lt;/p&gt;

&lt;h2&gt;
  
  
  Path setup
&lt;/h2&gt;

&lt;p&gt;I added a new path '/var/www/app' inside &lt;br&gt;
&lt;code&gt;sudo nano /etc/nginx/sites-available/app.mynextjsapp.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here we are adding our custom html file. &lt;/p&gt;

&lt;h2&gt;
  
  
  sites-available vs sites-enabled
&lt;/h2&gt;

&lt;p&gt;sites-available: the folder where you keep all your websites active or inactive&lt;br&gt;
sites-enabled: a folder containing symbolic links(see below) to point to the active files inside sites-available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Symlinks
&lt;/h2&gt;

&lt;p&gt;A symbolic link is essentially a Linux shortcut&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;-s&lt;/code&gt; flag in &lt;code&gt;ln -s&lt;/code&gt; stands for symbolic.&lt;/p&gt;

&lt;p&gt;I need both paths to point to the same direction. Currently they are two seperate folders.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/app.mynextjsapp.com /etc/nginx/sites-enabled/app.mynextjsapp.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I am basically saying:&lt;br&gt;
"Create a shortcut named app.mynextjsapp.com inside /sites-enabled/ that points directly to the real file inside /sites-available/." &lt;/p&gt;

&lt;p&gt;that's it. done.&lt;/p&gt;

&lt;h2&gt;
  
  
  I just created two subdomains
&lt;/h2&gt;

&lt;p&gt;app.mynextjsapp.com &lt;br&gt;
dev.mynextjsapp.com (will use later)&lt;/p&gt;

&lt;p&gt;which both point to the same IPv4 address of my hetzner cloud server. this will later achieve two functional environments on one hetzner bill plan.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Nginx with let's encrypt
&lt;/h2&gt;

&lt;p&gt;I followed this cool &lt;a href="https://rafftechnologies.com/learn/tutorials/secure-nginx-lets-encrypt-ubuntu-24-04" rel="noopener noreferrer"&gt;guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now app.mynextjsapp.com can be accessed on https :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Creating a Hetzner Cloud Server</title>
      <dc:creator>Fabian</dc:creator>
      <pubDate>Tue, 07 Jul 2026 14:44:33 +0000</pubDate>
      <link>https://dev.to/fabianwolski/creating-a-hetzner-cloud-server-19b9</link>
      <guid>https://dev.to/fabianwolski/creating-a-hetzner-cloud-server-19b9</guid>
      <description>&lt;h2&gt;
  
  
  Day 1 - Renting my first Hetzner Server
&lt;/h2&gt;

&lt;p&gt;Today I created my first Hetzner server. I didn't know I am simply renting CPU, RAM and SSD... I spun up a Ubuntu VM on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up a firewall
&lt;/h2&gt;

&lt;p&gt;"a good firewall blocks everything"&lt;/p&gt;

&lt;p&gt;Port 22 SSH (the remote control to my server on an unsecured network)&lt;/p&gt;

&lt;p&gt;(will add later)&lt;br&gt;
Port 80 HTTP (standard unencrypted network traffic)&lt;br&gt;
Port 443 HTTPS (web traffic secure i.e the little lock icon in tab)&lt;br&gt;
ICMP (let's me ping the server)&lt;/p&gt;

&lt;h2&gt;
  
  
  SSH
&lt;/h2&gt;

&lt;p&gt;for default path we can find it using &lt;code&gt;ssh cat ~/.ssh/id_ed25519.pub&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I can ssh into my server using&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ssh root@MY_SERVER&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Main Lesson
&lt;/h1&gt;

&lt;p&gt;before running software, I need to control access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;making sure everything is secure! &lt;/p&gt;

</description>
      <category>sre</category>
    </item>
    <item>
      <title>Why SRE?</title>
      <dc:creator>Fabian</dc:creator>
      <pubDate>Tue, 07 Jul 2026 13:02:48 +0000</pubDate>
      <link>https://dev.to/fabianwolski/why-sre-2hhp</link>
      <guid>https://dev.to/fabianwolski/why-sre-2hhp</guid>
      <description>&lt;h2&gt;
  
  
  Google pAIr mentoring program
&lt;/h2&gt;

&lt;p&gt;Out of 1,500 applicants 15 of us were selected to take part in google's pAIr program, the first in Dublin HQ. &lt;/p&gt;

&lt;p&gt;The program is designed to empower you to excel in securing your dream role at Google.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mentorship
&lt;/h2&gt;

&lt;p&gt;Each of us was assigned a mentor. I was very fortunate to meet Neil who has been working in SRE at Google for over a decade. &lt;/p&gt;

&lt;h2&gt;
  
  
  Plan
&lt;/h2&gt;

&lt;p&gt;The targeted skill development aspect of the program really stuck out to me. After discussing with Neil we both agreed on a two month plan for me to really up skill in software reliability engineering. &lt;/p&gt;

&lt;p&gt;I decided to document the entire journey. &lt;/p&gt;

</description>
      <category>sre</category>
    </item>
  </channel>
</rss>
