Planned an offline page for JOS
I started planning a dedicated offline page for times when Homebase cannot be reached. It could show limited, non-sensitive connection information, but it was not deployed.
From a spare PC to the infrastructure behind JOS: a self-hosted platform for applications, databases, networking, media, and remote development.
Newest first. Approximate dates are kept as recorded; their order within a month or year is not exact.
I started planning a dedicated offline page for times when Homebase cannot be reached. It could show limited, non-sensitive connection information, but it was not deployed.
I started investigating why Codex Bridge could appear offline away from home even with Tailscale active. I checked which network interfaces and addresses the bridge was listening on; the issue was still under investigation.
I created this portfolio and connected its GitHub repository to Cloudflare deployments. The portfolio runs separately from Homebase.
I added owner authentication and protected API access to the public JOS deployment. The work also covered session cookies, login limits, and separate authentication for Codex worker routes.
A power outage shut down Homebase and the services running on it. I began work on a UPS and server upgrade plan, including battery backup and controlled shutdown; those upgrades were not finished.
I confirmed that the LAN address, Tailscale address, and usejos.com all reached the same JOS application. They were different ways to access it, not separate deployments.
I moved usejos.com toward the Homebase-hosted application and checked DNS, HTTPS, and tunnel connectivity. A Cloudflare 1033 error helped identify that the tunnel connector was unavailable.
I reviewed the split between application storage on the SSD and Plex media on the external drive. I also started planning more memory, better backups, battery backup, and a better server setup. These were upgrade plans, not completed installations.
I began moving JOS from private LAN and Tailscale access to usejos.com. Cloudflare Tunnel connected the public site to Homebase without directly forwarding router ports.
I connected JOS to Google Calendar on Homebase. Later, I used SSH port forwarding to complete browser authorization for the headless server and restored the integration after renewing access.
I added persistent storage for uploaded syllabi and linked the files to course records in PostgreSQL. I confirmed that a CHM 111 syllabus was uploaded and tracked.
SSH worked through Tailscale, but the JOS webpage initially did not. I checked service bindings, ports, and firewall settings to work out why the web application was not reachable.
I investigated sleep, suspend, hibernation, and automatic shutdown settings. Homebase needed to stay available as more of my applications depended on it.
I set up Tailscale, MagicDNS, and Tailscale SSH for private access to Homebase. I was able to manage the server from my Mac while away from home without exposing SSH publicly.
JOS began storing conversations and messages in PostgreSQL. I checked that conversations stayed available after refreshing the page and switching between chats.
I started running my personal assistant project on Homebase, initially under the name Jarvis. It later became JOS and grew into the main application on the server.
Homebase became unreachable over SSH. I checked the Ethernet connection, host address, and SSH service, and learned to distinguish Docker bridge addresses from the server’s LAN address.
By July, Homebase was running Portainer, Plex, Pi-hole, Netdata, Minecraft, and WG-Easy. It had become the server I used for several projects rather than just a Linux experiment.
As JOS grew, I set up its backend, frontend, PostgreSQL database, and persistent file storage on Homebase. I also introduced Alembic migrations to keep track of database changes.
I started experimenting with WireGuard through WG-Easy. The goal was to connect my laptop and phone to my home network while I was away.
I set up Plex and connected an external drive for movies and TV. This gave me practice with Linux mounts and keeping container data on persistent storage.
I deployed Pi-hole in Docker to filter DNS requests and block advertising and tracking domains on my home network.
I turned an old spare PC into Homebase and installed Ubuntu Server. I managed it over SSH and used it to learn Linux and try self-hosting services.
I added a switch so my main computer and Homebase could share the available Ethernet connection.
I installed Docker and Docker Compose to run services in separate containers. This let me update or restart one service without changing everything on the server.
I hosted the YesterDay Car Detailing website on Homebase. Maintaining it gave me more experience with web servers, domains, DNS, and deployments.
I added Portainer to manage containers and check their logs. I also set up Netdata to see how the server was using CPU, memory, storage, and network resources.
I deployed a Minecraft server on Homebase. I worked with container storage, ports, and networking to run it alongside my other services.
Public access to JOS; owner authentication protects application data.
Remote administration without public SSH exposure.
Local access to Homebase and its services.
Ubuntu Server · Docker / Docker Compose
Tailscale also provides host-level private networking.
The portfolio deployment is separate: GitHub → Cloudflare.
Ubuntu, Docker, JOS, PostgreSQL, and application data.
Seagate media drive, primarily used by Plex.
Documented architecture, October 2026. WireGuard / WG-Easy reflects the earlier VPN experiment; Tailscale is the preferred private-access path. Upgrades and fallback work remain planned or in progress.
Ubuntu Server · Linux · Docker · Docker Compose · Portainer · Linux storage
SSH · Tailscale · WireGuard · WG-Easy · Cloudflare · Cloudflare Tunnel · DNS · Networking
Python · FastAPI · PostgreSQL · Alembic · REST APIs · OAuth · Google APIs
Pi-hole · Plex · Netdata · Server monitoring · Web security · Git · GitHub
Linux administration, containerization, Docker networking, filesystems, persistent storage, and monitoring taught me to manage the host as well as the services running on it.
SSH, VPNs, Tailscale, DNS, Cloudflare, reverse tunneling, and HTTP / HTTPS made remote administration and infrastructure troubleshooting practical skills.
PostgreSQL, migrations, REST APIs, backend development, web hosting, and OAuth connected application behavior to durable data and real infrastructure.
Authentication, web security, power management, storage planning, and outages showed why a working application is only one part of a dependable platform.
Hardware photos and screenshots have not been added yet. The architecture above documents how the pieces connect.