/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.

linuxrhelpodmancontainerssystemdrhcsasysadmin

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.

linuxlvmswapstoragerhelrhcsasysadmin

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.

linuxrhelsystemdcronbackupsysadmin

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.

linuxrheldnfrepositorieshttpdselinuxsysadmin

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.

linuxrhelbootgrubselinuxrhcsasysadmin

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.

linuxrheldnfrepositoriessysadmin

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.

linuxlvmstoragerhelsysadmin

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.

linuxselinuxnginxtroubleshootingrhel

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.

linuxbackuprsynccronsysadmin

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).

linuxbashbashrcterminalcustomization

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.

linuxsecurityhardeningsshsysadmin

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.

linuxnginxwordpresstroubleshootingsysadmin

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.

nginxubuntuweb-serverwordpress