<?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: Samwaran Banerjee</title>
    <description>The latest articles on DEV Community by Samwaran Banerjee (@samwaran).</description>
    <link>https://dev.to/samwaran</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%2F4133017%2F50d20bcf-3953-49e8-9e48-b39c0f657d3f.png</url>
      <title>DEV Community: Samwaran Banerjee</title>
      <link>https://dev.to/samwaran</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samwaran"/>
    <language>en</language>
    <item>
      <title>DIY Homelab NAS Mark-1: Build Log (Ubuntu Server + Docker + Immich)</title>
      <dc:creator>Samwaran Banerjee</dc:creator>
      <pubDate>Sun, 08 Nov 2026 08:05:16 +0000</pubDate>
      <link>https://dev.to/samwaran/diy-homelab-nas-mark-1-build-log-ubuntu-server-docker-immich-3n2</link>
      <guid>https://dev.to/samwaran/diy-homelab-nas-mark-1-build-log-ubuntu-server-docker-immich-3n2</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Repurposed an old HP laptop into a &lt;strong&gt;home NAS&lt;/strong&gt; running &lt;strong&gt;Ubuntu Server + Docker&lt;/strong&gt; for ~₹8K. Handles &lt;strong&gt;photo backup (Immich)&lt;/strong&gt;, &lt;strong&gt;file sharing (Samba)&lt;/strong&gt;,&lt;br&gt;
and &lt;strong&gt;remote access (Tailscale)&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Specs &amp;amp; Parts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bought:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Qty&lt;/th&gt;
&lt;th&gt;Net Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;WD Green 480 GB SSD&lt;/td&gt;
&lt;td&gt;2899&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2899&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;WD Green 240 GB SSD&lt;/td&gt;
&lt;td&gt;1751.25&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1751.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Connector&lt;/td&gt;
&lt;td&gt;WAVLINK USB 3.0 to SATA 2.5" External Hard Drive Enclosure with UASP Protocol&lt;/td&gt;
&lt;td&gt;754&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;754&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Hardware&lt;/td&gt;
&lt;td&gt;Justec 270pcs M2 Male Female Brass Spacer Standoff Screw Nut Assortment Kit"&lt;/td&gt;
&lt;td&gt;499&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Connector&lt;/td&gt;
&lt;td&gt;22Pin (7+15) Female Jack Connector SATA Serial ATA Data Power Combo Extension Cables Wire Cords&lt;/td&gt;
&lt;td&gt;164.5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;329&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Connector&lt;/td&gt;
&lt;td&gt;Optical Bay 2nd Hard Drive Caddy, Caddy 9.5mm for Laptop&lt;/td&gt;
&lt;td&gt;189&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;189&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;Hi-tech Hynix 8GB DDR3L Laptop RAM 1600 Mhz PC3L-12800S 1.35 Volt 204 Pin SODIMM&lt;/td&gt;
&lt;td&gt;750.775&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1501.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;SanDisk Ultra Fit 3.1 64GB USB Flash Drive&lt;/td&gt;
&lt;td&gt;864&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;864&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Reused / already had:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Motherboard&lt;/td&gt;
&lt;td&gt;HP 15-r041tx Motherboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;4th Gen Intel Core i3 4005U 1.7 GHz Cores Dual Core, 4 Threads 3 MB Cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;2 GB, Nvidia Geforce 820m (2 Gb Ddr3 Dedicated) Graphics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Seagate Mobile SDC001 1TB HDD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Total spent:&lt;/strong&gt; ₹8786.8&lt;/p&gt;
&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POWER
↓
MOTHERBOARD + CPU + RAM + GPU (Integrated)
│
├── SATA CONTROLLER → SATA Port 1 → SSD 250GB (primary)
│
├── CD Bay → CD to SATA Adapter → SSD 480GB (Secondary)
│
└── USB CONTROLLER
          ├── USB 2.0 → SanDisk Ultra Fit 64GB [Ubuntu Server (OS Only)]
          ├── USB 2.0 (Unused / available)
          └── USB 3.0 → SATA to USB Adapter → 2.5" HDD 1TB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Storage Layout
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Drive&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;sda (64 GB USB)&lt;/td&gt;
&lt;td&gt;OS only&lt;/td&gt;
&lt;td&gt;Ubuntu Server&lt;/td&gt;
&lt;td&gt;Plenty of space for OS, updates, logs (if kept on tmpfs or minimal), very safe for writes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sdb (240 GB SSD)&lt;/td&gt;
&lt;td&gt;Data + Docker volumes&lt;/td&gt;
&lt;td&gt;Fast storage for Docker containers, apps, and frequently accessed data&lt;/td&gt;
&lt;td&gt;SSD ensures fast container performance; avoid putting heavy media here to reduce wear.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sdc (500 GB SSD)&lt;/td&gt;
&lt;td&gt;Data + Docker volumes&lt;/td&gt;
&lt;td&gt;Additional fast storage for apps, media caches, or working datasets&lt;/td&gt;
&lt;td&gt;Same as sdb; great for splitting Docker workloads or high-speed media access.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sdd (1 TB External HDD via USB)&lt;/td&gt;
&lt;td&gt;Media + backups&lt;/td&gt;
&lt;td&gt;Bulk storage for movies, photos, and periodic backups&lt;/td&gt;
&lt;td&gt;Slower, but perfect for large, sequential file storage; reduces wear on SSDs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Network Layout
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Internet ]  
      ↓
[ Router / Modem ] (LAN / DHCP)  
      ↓
[ NAS Server (Ubuntu Server) ]  
      │  
      ├── SSH (22)  → Remote Management  
      │  
      ├── Web Services  
      │      ├─ Immich (2283)  
      │      ├─ Webmin (10000)  
      │      └─ Dockge (5001)  
      │  
      ├── Security Layer  
      │      ├─ UFW (Firewall)  
      │      └─ Fail2Ban (Intrusion Protection)  
      │  
      ├── Backup Services  
      │     └─ Restic (Scheduled Backups)  
      │  
      ├── Local Tools  
      │     ├─ htop (Process Monitor)  
      │     └─ neofetch (System Info)  
      │  
      ├── Remote Access  
      │      └─ Tailscale (Secure VPN)  
      │  
      ├── File Services  
      │      └─ Samba (445)  
      │  
      └── Monitoring  
             └─ Netdata (19999)

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

&lt;/div&gt;

&lt;h2&gt;
  
  
  Software Stack (Optimized)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.  Ubuntu Server OS
2.  Dockge (Docker control)
3.  Immich (Photos)
4.  Samba (File sharing)
5.  Webmin (Admin UI)
6.  Netdata (Monitoring)
7.  Restic (Backups)
8.  UFW + Fail2Ban (Security)
9.  htop (Process monitor)
10. neofetch (Info display)
11. Tailscale (Remote access)
12. Avahi (hostname.local)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  The Build
&lt;/h2&gt;


&lt;h3&gt;
  
  
  1. Teardown
&lt;/h3&gt;

&lt;p&gt;Popped the back panel and battery off the laptop and pulled the motherboard free from the chassis to see exactly what it had to offer. Booted a Ubuntu live USB briefly just to confirm what the board could actually see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsblk &lt;span class="nt"&gt;-o&lt;/span&gt; NAME,SIZE,TYPE,MOUNTPOINT
lscpu | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Model name"&lt;/span&gt;
dmesg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; sata

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

&lt;/div&gt;



&lt;p&gt;What turned up: a single onboard SATA port (already claimed by the original 1TB Seagate HDD), a CD-ROM SATA header that a caddy adapter could repurpose into a second SATA connection, two DDR3L SO-DIMM slots, one USB 3.0 port, and a daughterboard riding in on a ribbon cable with two more USB 2.0 ports. The single SATA port was the real constraint — the caddy adapter got it to two, which meant one drive for the OS and exactly one for actual storage until the USB controller got pulled into the plan too.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. OS Install
&lt;/h3&gt;

&lt;p&gt;Flashed Ubuntu Server 24.04 LTS onto the 64GB USB drive — this is the drive the whole system now boots from, keeping the SSDs free of OS writes:&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;# From a separate machine&lt;/span&gt;
&lt;span class="nb"&gt;sudo dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ubuntu-24.04-live-server-amd64.iso &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/sdX &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4M &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress &lt;span class="nv"&gt;conv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fsync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Booted the laptop off the USB drive, set the BIOS boot order accordingly, and ran the install headless — no GUI, OpenSSH enabled during the setup wizard so it never needed a monitor again after this point.&lt;/p&gt;

&lt;p&gt;First-boot config: a static IP over netplan so the server doesn't wander to a new address after every reboot.&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="nb"&gt;sudo &lt;/span&gt;nano /etc/netplan/00-installer-config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;ethernets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;eth0&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;dhcp4&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
      &lt;span class="na"&gt;addresses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;192.168.1.50/24&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;gateway4&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;192.168.1.1&lt;/span&gt;
      &lt;span class="na"&gt;nameservers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;addresses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;1.1.1.1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;8.8.8.8&lt;/span&gt;&lt;span class="pi"&gt;]&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;&lt;span class="nb"&gt;sudo &lt;/span&gt;netplan apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then formatted and mounted the 240GB SSD, 480GB SSD, and the 1TB HDD (via its USB enclosure) into their assigned roles:&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="nb"&gt;sudo &lt;/span&gt;mkfs.ext4 /dev/sda   &lt;span class="c"&gt;# 240GB SSD — Docker / fast storage&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;mkfs.ext4 /dev/sdb   &lt;span class="c"&gt;# 480GB SSD — app storage&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;mkfs.ext4 /dev/sdc   &lt;span class="c"&gt;# 1TB HDD — media / backups&lt;/span&gt;

&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /mnt/ssd240 /mnt/ssd480 /mnt/hdd1tb
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount /dev/sda /mnt/ssd240
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount /dev/sdb /mnt/ssd480
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount /dev/sdc /mnt/hdd1tb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Added all three to &lt;code&gt;/etc/fstab&lt;/code&gt; so the mounts survive a reboot.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Service Setup
&lt;/h3&gt;

&lt;p&gt;Installed Docker and Compose first, since almost everything else runs as a container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://get.docker.com | sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker-compose-plugin &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dockge&lt;/strong&gt;, for managing everything else through a web UI instead of raw CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dockge&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;louislam/dockge:1&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;5001:5001&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data:/app/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/mnt/ssd240/stacks:/opt/stacks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Immich&lt;/strong&gt;, pointed at the HDD for actual photo storage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;immich-server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/immich-app/immich-server:release&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/mnt/hdd1tb/immich:/usr/src/app/upload&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;2283:2283&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Samba&lt;/strong&gt;, for file sharing across the network:&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;samba &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/samba/smb.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[nas-share]&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="py"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/mnt/hdd1tb/shared&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="py"&gt;browseable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="py"&gt;writable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="na"&gt;guest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="py"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&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;&lt;span class="nb"&gt;sudo &lt;/span&gt;smbpasswd &lt;span class="nt"&gt;-a&lt;/span&gt; yourusername
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart smbd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Webmin, Netdata, htop, neofetch&lt;/strong&gt; — the admin panel and the day-to-day visibility tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://raw.githubusercontent.com/webmin/webmin/master/webmin-setup-repo.sh | sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;webmin &lt;span class="nt"&gt;-y&lt;/span&gt;

wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://get.netdata.cloud/kickstart.sh | sh

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;htop neofetch &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;UFW, Fail2Ban, Tailscale&lt;/strong&gt; — locked the server down, then opened exactly one secure door back in:&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ufw fail2ban &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow OpenSSH
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 2283/tcp   &lt;span class="c"&gt;# Immich&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 5001/tcp   &lt;span class="c"&gt;# Dockge&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable

&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://tailscale.com/install.sh | sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;tailscale up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Challenges &amp;amp; Fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Only one SATA port
&lt;/h3&gt;

&lt;p&gt;Used an "Optical Bay 2nd Hard Drive Caddy, Caddy 9.5mm for Laptop" to increase one more SATA connection&lt;/p&gt;

&lt;h3&gt;
  
  
  Immediate case/cabinet for the NAS - minimal
&lt;/h3&gt;

&lt;p&gt;For a Case or enclosure for the whole self made NAS I am using a plasic box which costed me INR 200 in local market to be used here. I removed the seperators withn the plastic box with hand tools like hacksaw and a file to finish it of.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ubuntu wasn't booting at first
&lt;/h3&gt;

&lt;p&gt;Checked the boot menu to keep the pendrive at top of the boot menu and remove secure boot due to a few driver conflicts. Also using the grub 2 boot menu and the UEFI option rathe than legacy boot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Immich container stuck after a bad SSH script
&lt;/h3&gt;

&lt;p&gt;A careless SSH script deleted Immich's installation folders mid-experiment.&lt;br&gt;
The container still showed up in OMV's UI afterward and wouldn't remove&lt;br&gt;
through the interface. Rather than patch around it, switched to a clean&lt;br&gt;
headless Ubuntu Server install instead of continuing on OMV.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results &amp;amp; Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Final cost:&lt;/strong&gt; ~₹8,200 (₹8,000 in drives/adapters + ₹200 for the case) — against ₹20,000-25,000 for even an entry-level commercial NAS. Reusing the laptop's motherboard, CPU, and RAM instead of buying new is what made that gap possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually held up:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separating storage by purpose (OS on USB, fast storage on SSD, bulk media on HDD) kept the system predictable — no single drive doing double duty and choking under load.&lt;/li&gt;
&lt;li&gt;Running everything in Docker meant mistakes were cheap. When the Immich install got wiped by a bad SSH script, the fix was "redeploy the container," not "reinstall the OS."&lt;/li&gt;
&lt;li&gt;Netdata turned troubleshooting from guessing into just... looking. The Immich indexing CPU spike is a good example — you can watch it happen instead of assuming it's happening.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I'd do differently:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test a backup &lt;em&gt;before&lt;/em&gt; you need one. Losing the first Immich instance mid-experiment was low-stakes because there wasn't real data on it yet — it wouldn't have been if there was.&lt;/li&gt;
&lt;li&gt;One SATA port on a repurposed motherboard is a hard ceiling, not a minor inconvenience. If I were doing this again, I'd check port count before falling in love with a specific piece of donor hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Adding a 3D printed case.&lt;/li&gt;
&lt;li&gt;Extending the number of SATA ports for data storage to 6 from 2&lt;/li&gt;
&lt;li&gt;Ensuring proper cooling by adding external fans&lt;/li&gt;
&lt;li&gt;Using full potential for n8n and other tools test as well&lt;/li&gt;
&lt;li&gt;adding another server for other services from another laptop motherboard lying around&lt;/li&gt;
&lt;li&gt;Adding both to a 10" server rack system&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📖 Full story (the "why" behind this build): &lt;a href="https://samwaranb.medium.com/i-built-my-own-cloud-storage-because-subscriptions-werent-worth-it-anymore-82b3f54f49b2?sharedUserId=samwaranb" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💼 More projects like this: &lt;a href="https://samwaran.github.io" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>homelab</category>
      <category>selfhosted</category>
      <category>linux</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
