/labs
Hands-on guides and configuration walkthroughs for real tasks I've worked through - bigger than a single command, smaller than a full project.
Running a Rootless Podman Container as a systemd Service with Quadlet
A static website in a rootless nginx container, run by a regular user and managed by systemd through a Quadlet .container file: why su - breaks systemctl --user, why the unit can't be enabled, an image that exits silently without Exec=, loginctl enable-linger for starting at boot without a login, Restart=on-failure, and the rootless limits - port 80, SELinux :Z and subuid mapping.
Adding Persistent Swap on an LVM Logical Volume
Extra swap carved out of the vg_data volume group from the LVM lab: a new logical volume, mkswap, swapon, a priority higher than the existing swap, an /etc/fstab entry tested with swapon -a (mount -a ignores swap), and growing it later - including why lvextend -r refuses swap and a mkswap that has to be rerun.
Replacing a cron Job with a systemd Timer
The nightly backup from the cron + rsync lab, moved to a systemd service and timer on RHEL 10: a oneshot service tested on its own first, a calendar schedule checked with systemd-analyze, Persistent=true catching up a run missed while the server was off, OnFailure= alerts instead of MAILTO, and why flock is no longer needed.
Serving the Local ISO Repository Over HTTP to an Offline Network
One RHEL 10 server with the install ISO mounted becomes the package source for every other machine on an air-gapped network: httpd serving /repo, the SELinux mount-context fix that restorecon can't do on a read-only ISO, a firewall opening, and client .repo files pointing at it over plain HTTP with GPG checking still doing the real security work.
Resetting a Lost Root Password on RHEL 10, Step by Step
The rd.break procedure done for real on a VM: interrupting GRUB, dropping into the initramfs shell, remounting /sysroot, changing the password inside a chroot, and handling SELinux correctly - with a full relabel or the faster enforcing=0 + restorecon route - then locking the door with a GRUB password.
Setting Up Repository Access From the Install ISO, Fully Offline
A RHEL 10 machine with no internet, no Red Hat CDN and no Satellite - turning the installation DVD into a persistent ISO file, loop-mounting it via /etc/fstab, and defining BaseOS and AppStream as local dnf repositories with GPG signature checking left on.
Setting Up LVM on a New Disk, From Scratch
A new disk, built into usable storage through all three LVM layers (PV -> VG -> LV), formatted, mounted persistently via /etc/fstab, and - the part that's the actual point of LVM - extended later with a second disk, with the original data confirmed intact afterward.
Diagnosing an SELinux "denied" Problem on a Real Service
Nginx returns 403 for a site moved to a non-standard directory, even though every Unix permission looks correct. Diagnosing it's actually SELinux, reading the denial, and fixing it permanently with semanage fcontext + restorecon instead of the chcon shortcut or disabling SELinux.
Automating Backups with cron and rsync
A practical end-to-end backup pipeline for a WordPress site: mysqldump plus rsync's --link-dest incremental snapshots, scheduled safely with cron and flock, pruned automatically, and actually verified with a real restore - including a --link-dest gotcha that silently breaks deduplication if missed.
Customizing the Bash Prompt (PS1)
Recolor the Bash prompt in ~/.bashrc using 256-color escape codes: the existing color_prompt block every Debian/Ubuntu install already has, the \[ \] wrapping rule, reusable color variables, and a few ready-to-use prompt variants (exit-status-aware, git branch, two-line, minimalist).
Hardening a Fresh Linux Server
A practical hardening checklist for a freshly provisioned Ubuntu/Debian server: users and SSH, firewall and fail2ban, automatic updates, time sync, kernel/network tuning, and the mistakes that lock you out.
WordPress on Nginx Troubleshooting Cheat Sheet
Symptom-to-fix runbook for WordPress served by Nginx and PHP-FPM on Ubuntu: gateway errors, permissions, database issues, TLS, performance and server housekeeping.
Host One or Multiple Websites with Nginx on Ubuntu Server
Set up Nginx server blocks, PHP-FPM, MySQL, and WordPress for one or more websites on Ubuntu.