Good Morning from my Robotics Lab! This is Shadow_8472, and today I am working on my homelab. I have a lot I want to get done, and I need to stay on task, so I’ll be writing as I go. Let’s get started!
My goal this month –and possibly future months if this format works out– is to have a set of four related mini-projects. If you’re just here for my verdict, check the Takeaway. If you want the journey, hang on.
Overall Vision
This month is all about the family’s GoldenOakLibry access. Joining me is my Hermes AI agent, Shimmering Dust. He needs lots of hand holding. At least I’ve gotten his Gemma 4 26b “brain” doing its thinking on my graphics card, which helped with speed. He is my “rubber duck” with an FAQ list and search engine skills. A notable change I made for him this month was installing Lynx, a terminal Internet browser (his Firefox install was getting guff).
With my primary objective in mind, I need an LDAP server. Next, I’ll use that server to authenticate NFS (Network File System) access and/or web consoles. An eMail server is also a high priority. NextCloud would be nice, and should be within easy reach assuming GoldenOakLibry goes smoothly.
Project 1: LLDAP Container
The good news is that I already have done my reading on LDAP (Lightweight Directory Access Protocol) and turned up “Lightweight LDAP” (LLDAP). The bad news for me is that LLDAP prefers PostgreSQL and my early exploration landed MariaDB as my initial favorite. Long story short: each database organizes data differently. Not all projects will support both. It’s not worth my time to milk storage space savings by using fewer [layers of] a container.
I continued with Shimmering Dust while configuring LLDAP. By the end, lldap.container sat upon lldap-postgresql.container, which used lldap-postgresql.volume, with the containers subscribing to lldap.pod. Shimmering Dust was very useful for pointing out my typos and getting me un-stuck when I might have spent a few hours staring at old forums. Even now, I want to spell it “Postgress” (it has one ‘s’).
The last thing of note here is that Shimmering Dust tripped over a Pod= statement. I get it, Podman+Quadlets+Pod is pretty niche and new, so I can understand if Gemma 4 doesn’t have it in its training data. Nevertheless, Shimmering Dust made a self-improvement skill when we were done.
But hold up, is using a pod here even best practice? I wouldn’t call myself a hacker, but my guess is that a hypothetical attacker would have a harder time moving between containers linked by internal networks than by a pod that binds them tighter than normal containers. After all that work, I de-podded them.
Project 2: Network Accounts
My LDAP foundation took a week. On to using it. First, I need to expose LLDAP. GoldenOakLibry’s Domain Security page under ControlPanel listed a field for LDAP security. Looks like the preferred is the ldap+TLS option [1].
But what about the other options? I quickly got lost in the Great Forest of Knowledge TLS, SSL, and StartTLS. Shimmering Dust kept hallucinating between LDAP+TLS and LDAP+SSL with all the Confidence™ of 30+ years of sloppy industry using the terms interchangeably. DuckDuckGo’s AI bot said one was depreciated (EDIT: early versions are retired [2]. I strongly recommend you read this citation, it cleared up two days of painful confusion).
I found references to a Caddy+LDAP plugin – an unofficial community plugin I wouldn’t know how to install. OPNsense too has LDAP settings to explore. Further digging showed they require a separate LDAP server, so my time setting up LLDAP wasn’t time wasted. On a further side track, I learned about .home.arpa, a “special use” domain I should have been using all along. Disheartening.
Thinking long-term, I remembered I need to make a private website for my largely technologically illiterate extended family. Self-hosting Minecraft was also on my mind for my “online family.” Researching the latter, I found u/cfarence’s relevant thoughts on Reddit:
I have a custom portal where players login and tell it to whitelist their IP address. This then feeds into a pfsense dynamic list to allow the traffic through the perimeter firewall.
Works fairly well and it’s semi easy for players to login. This allows me to have it “open” to the internet and not have it hammered from all over the internet. It doesn’t handle dynamic IPs but players public IPs don’t change too regularly most of the time. [3]
Other Redditors do everything from hosting in the clear to using Tailscale or a virtual private server. Caddy was only built to handle HTTP[S] traffic. I can serve a login page, then manage access to homelab services from there. If someone needs around Caddy, he/she can use an IP authentication tool. Services can handle their own traffic.
Enough musing. Joystick (server’s hostname) needs a hole in its firewall for LDAP traffic.
sudo firewall-cmd --zone=public --add-forward-port=port=389:proto=tcp:toport=38900 --permanent
This rule redirects LDAP and LDAP+TLS traffic to a non-privileged port at 100x the service’s normal port number. I stashed this rule in my notes on in case of homelab rebuild. Interestingly, LLDAP did something similar by multiplying its privileged ports by 10x – the first container image provider I’ve seen do this. Thus, LLDAP’s Quadlet got the following line:
PublishPort=38900:3890
I asked Shimmering Dust for a good way to test the port, and he suggested nc (NetCat), utility I hadn’t heard of.
nc -zv <Joystick’s IP> 389
This tool came in handy as I worked – first on the pod, then through the firewall, then from GoldenOakL– QNAP went and ignored this utility, having “Notification Center” in its place. This wasn’t my first scrape with proprietary systems built on Linux missing expected programs, so I wasn’t too surprised. Shimmering Dust suggested a suite of tools from Telnet to Curl, and I found Sudo Ping for good measure (Why make ping admin only?). Between the tools, we determined GoldenOakLibry was seeing LLDAP.
With over half the week gone, I made the executive decision to ax TLS on LDAP, but with a plan for Caddy to manage a certificate for it using a shared volume. Oh, and after it was too late to change anything, it appears GoldenOakLibry has an LDAP server built in. Oh, well.
Next wall. Login. The top FAQ item is dedicated to it [4]. Turns out I’d installed incorrectly. I didn’t document the full process of “sideways progress,” but it involved adding a bunch of echo statements to bootstrap.sh to chase down a weird error:
"parse error: Invalid numeric literal at line 1, column 16"
I traced this down to the auth() function, where I found an error from a failed database login being processed as JSON:
`Authentication error for user "customadmin"`
16 characters in, that’s the first space, if you include the ` mark.
And here I stalled for the longest time. This month hit the family with two major emergencies back-to-back, and neither feel fully real yet (early morning of 8-21). I will be lucky to finish my base goals. Nevertheless, after a good session with Shimmering Dust where I had him go source diving with a copy of logs for both LLDAP and its Postgress containers, he noticed LLDAP sending MySQL commands to Postgres (I don’t have the skills with databases to verify), which in-turn produced the failed login and crash above.
Shimmering Dust recommended I try using an all-caps version of the variable LLDAP_Database_url to be consistent with relevant standards. As it turns out, the LLDAP container as it is expects the mixed-case version, and I happened to have made it all-caps already. This change allowed me to initialize my LLDAP database and log in.
Project 3: Connecting GoldenOakLibry
With a week left on the clock, I began work on logging GoldenOakLibry into LLDAP. My progress was entirely sideways, bouncing between running process of elimination, circling over similar ideas with Shimmering Dust, and reaching out to the empty LLDAP Discord community.
One big burrier I busted was authentication. I installed Wireguard-CLI to examine the unencrypted traffic between GoldenOakLibry and LLDAP, but its utility, Tshark, resists running as root (I’m monitoring LDAP traffic on a privileged port, after all). I soon found TCPDump, a small packet sniffer program, and ran the log through Tshark.
$ sudo tcpdump -i any 'port 389' -w ~/packet_log.pcap #Ctrl+C to end log
$ tshark -r ~/packet_log.pcap | grep LDAP
I found LLDAP rejecting GoldenOakLibry’s LDAP bindRequests despite following the examples.
Rejected: "id=user_name,dc=yourdomain,dc=lan" simple
Expected: "uid=user_name,ou=people,dc=yourdomain,dc=lan" simple
The next wall was authentication, and took the longest. Shimmering Dust kept volunteering scripts to test hashing algorithms, but I vetoed the attempts. I changed my admin password to “changeme”, and suddenly GoldenOakLibry made it in. My standard procedure for passwords is 128 mixed-case alphanumeric with special characters. Testing showed the max character length is 64.
But the last hurdle stopped me cold the moment I understood it. Even though Tshark was reporting successful bindRequests and LLDAP was sending over all its user data, domain users were still not populating in. I grabbed a large, suspect log from LLDAP’s container where tens of fields were being ignored and fed it to Shimmering Dust – who advised that QTS (GoldenOakLibry’s operating system, made by QNAP) may be expecting a full POSIX environment (Portable Operating System Interface), which LLDAP was never going to provide in the first place.
As of posting, I have a support ticket out to QNAP. So far, my experience so far on this issue has been disappointing, with support only ever getting back to me once a weekday a few minutes after 5:00 PM. On first reply, I spent around three hours drafting an eMail, then gutting the fluff when it was too long for their support form. Then it had to be submitted as a second issue when their system glitched, and that cost me a full interaction when the technician helping me got confused at my merged ticket – during which I solved my authentication hangup and hit the presumed POSIX problem. I was asked to provide a log, but by then I had already decided to switch gears to QTS’ internal LDAP server as a workaround.
Takeaway
I seem to recall trying for a similar format where I compress several smaller projects into one. They have a tendency to go wrong and get delayed. I’m 99% sure LLDAP isn’t compatible with QTS’ LDAP client. Check my next post or two for a solid yes/no.
Prayer
Father in Heaven,
It’s been a long month for me. I’m feeling immense pressure to finish this project on a time frame I can’t do anything about, and having all my progress pulled about at the last few days isn’t doing any favors for moral.
But Father, I ask that when I or my readers get to feeling like this, you help us recontextualize it as learning – be it as “sideways progress” as I like to call it or whatever makes sense.
I praise you for professional tech support. While I may not have a final answer right now, I have faith that I’m being taken care of by someone whom I can’t see, yet knows what he is doing. I ask that you bless him and his team with wisdom as they study my setup.
Likewise, I pray that my readers find inspiration with their own projects – that they absorb the concepts they are studying.
In Jesus’ name I pray
Amen
Works Cited
[1] QNAP, “Connecting a QNAP NAS to an LDAP Directory,”qnap.com,Aug. 7, 2020 (Ambiguously: July 8, 2020). [Online]. Available: https://www.qnap.com/en/how-to/tutorial/article/connecting-a-qnap-nas-to-an-ldap-directory. [Accessed Aug. 9, 2026].
[2] M. Normann, “Overview of TLS and LDAPS,” kb.symas.com, Aug. 19th, 2024. [Online]. Available:https://kb.symas.com/configuration/overview-of-tls-and-ldaps. [Accessed Aug. 11, 2026].
[3] SparkyGears, cfarence, et. all, “Safely Self-Hosting a Minecraft server,” reddit.com, Nov. 24, 2023. [Online]. Available: https://www.reddit.com/r/selfhosted/comments/182h7x9/safely_selfhosting_a_minecraft_server/. [Accessed Aug. 10, 2026].
[4] selfhoster1312, “[LLDAP] Frequently Asked Questions#I can’t log in!,” github.com,July 6, 2025. [Online]. Available: https://github.com/lldap/lldap/blob/main/docs/faq.md#i-cant-log-in. [Accessed Aug. 14, 2026]

















