Monday, October 12, 2026

I Now Have A Functional (and Private) Git Server

I've been struggling with wrapping my head around Git the past 4-5 years.  It sounds silly, yeah, but I'm old school.  

I started my first position in the IT Security field in 2003.  There was no such thing as Infrastructure as Code (IaC).  The first time I remember hearing of IaC was in 2017.  Note that I didn't enter the sub-field of security engineering in a dedicated fashion up until 2017.  In my prior positions, I didn't need to be familiar with such information.

I didn't even start being involved with Docker up until 5 years ago.  I was initially pushed to it by work - my supervisor wanted each team to be familiar with it, so I tool an ACloudGuru course.  I didn't use it at work after finishing the course (and the course didn't cover Git), either, but I got some ideas on how to use it at home (in the home lab).  

I wanted to use Docker containers to replace a lot of my old computers within my lab, but actually ended up using it to install Wordpress on a Docker instance, hoping to replace my Wodrpress website with a dockerized instance.  I intially set up Wordpress on my LAN as a container stack.  When I saw how easy it was to set up, and after I tested and ran it maybe 6 months on my LAN, I replaced the server instance with a docker instance on the hosted server (Linode).  It was super easy and I think it runs more efficiently.  I just restored a good known backup onto the Dockerized Wordpress.

At this point, I've tested several containerized Wordpress setups, seeking greater efficiency, so there were tons of compose files that I wasn't tracking because I kept avoiding Git (and couldn't even understand it).

Only tonight, after speaking with a coworker about it, after gaining understanding of it when researching it (and Terraform usage), and after asking Gemini AI questions, I was able to give it a shot.

For Git, I'm using a Gitea as a container.  I used Gemini to ask questions on how to set up a private Git that I could keep track of all my code (across 3 different Docker host systems, on the LAN and from a public server, as well).

For each Docker host, I've created a repo to track that host's Docker code.  It took a long while to understand that I had to push the IaC files to the Gitea server.  I initially didn't even have an idea of how to map out the repos.  I was a total mess.

Now that I've the repos set up, I do not want to have to set it all up again, but if I had to, it would probably go a lot quicker in setting things up.  I'd love to be able to back up the repos to my NAS (if that's even possible).

The next steps will be to pull repo files, edit them, and merge them, or to use it to create new repos (with new files, instead of just pushing large batches of old code to a GIT UI).

Friday, September 18, 2026

Jeep Wrangler Modification

I'm a car guy.  I'm usually into sports cars and motorcycles.  As this blog is named "All Things Tech", this post fits.

I bought a 2018 Jeep Wrangler Sport S in the fall of 2018, trading in my 2011 Subaru WRX STI sedan.  Before then, I had a 2001 Jeep Wrangler Sport, and bought it used, but it had very bad frame rot, so I had to get rid of it.  I still wanted a Wrangler, so I bought a new one.

It was basically unmodified up until last year (other than a roof rack and side steps).  Last year, I needed new tires and I decided to have larger tires installed.  No, I didn't have it lifted.  I installed the largest tires that wouldn't rub against the undercarriage and/or suspension.  I installed Toyo Open Country AT IIIs (C load) in 285/75/17, which is basically Rubicon size but with a wider footprint.

Those larger sized tires will throw off the speedometer (was aware of that before I bought them).  It took me a year to get around to correcting the speedometer.

I bought a vLinker MC+, which is a bluetooth-enabled OBD II reader.  The reader is designed for use with the Jeep Wrangler.  I also installed Jscan on my iPhone, which is an OBD II tuner - I had to buy a user license to use it, but it was maybe $30.

I also had to by a set of $20 security bypass cables, as the Jeep has an integral firewall.  The cables bypass the firewall.

I used Jscan to reconfigure the tire size within the ECU.

I took a long trip to NC last weekend and found that the speedometer was spot on - I used Waze (car nav software) to determine my true speed and compared it to the speedometer's measurement...it was spot-on at all speeds.

I shouldn't have waited a full year to do this, but as I get older (I'm almost 60 now), I've less patience with car things, which is why I got the Jeep in the first place - the STI ended up being too much work for me...I'll always love STIs but mine was modded and you can't fire and forget with Subarus (you can, but it will eventually catch you out).

Testing Out Dockge

I've decided to give Dockge a test run.

I installed it on the Rasberry Pi 500+ (as I also did with Arcane).  It's simplistic.  Sometimes I think Portainer is a bit too busy.  Arcane is less so, and Dockge is lesser so.

One thing I like about Dockge is that it is also designed to work as an agent.  I wanted to also manage the containers that I'm hosting on a non-Pi device (there are mabye 7-8 containers on that host).  I installed Dockge on that machine and then pointed the Pi Dockge console to it - it now shows containers that reside on two hosts!

Dockge was also created by the Uptime Kuma developer, as well, which is another great tool for a home lab.


Wednesday, September 09, 2026

Portainer Alternatives?

I've been using Portainer for a while now.  I'm not using it as efficiently as I should, but that's a discussion for another day.

I wanted to explore other alternatives to Portainer and landed on Arcane.

I had serious issues getting Arcane set up as a Docker instance, but there's an alternative method - I ran the following command:

curl -fsSL https://getarcane.app/install.sh | sudo bash

No, this does not leverage Docker, but I was frustrated in getting Arcane to run within a container.  I'll double back to get that working later.

What I like is that Arcane detects all the pre-existing containers.  I didn't have to set anything up.

One thing I've noticed is that, when I restarted a Wordpress container, Arcane froze and wouldn't let me back in.  As I was going to restart the Arcane service, it came back up.  Arcane is running on a Pi 500, but it is pretty robust as far as Pis go.

Another thing - I'm unable to see the containers' compose files from the Arcane console.  Maybe I'm not looking in the correct areas of the console.  This is something to research.

The very cool thing is that Arcane has security findings if you enable container security scanning!  I think it's using the Trivy scanner.  As well, if you click on a discovered CVE, it points directly to the NIST CVE entry.

I'll also be testing Dockge, Dokploy, Coolify, and Dockhand, as well.  I'll share my thoughts as I test.

Uptime Kuma Has No Built-In Backup Strategy!

I've been using Uptime Kuma to monitor my LAN and external systems.

I'd noticed that Uptime Kuma had an update.  I was hesistant to apply the update because I might lose my configuration data, but tried it anyways.  Yeah, I lost everything.

I'd looked into the settings to see if there was a backup strategy but didn't see anything.

I used AI to determine if there was an alternative backup solution.  The AI stated that the Uptime Kuma (UK) developer had issues with a configuration backup solution and had reverted what existed.

I asked it to give me a script to use as a backup solution.  Based on the Docker compose file that I'm using (which I provided to the AI), it presented me this:

#!/bin/bash


# --- CONFIGURATION ---

CONTAINER_NAME="uptime-kuma"

#SOURCE_DIR="/app/data" # Or your specific host path found in Step 1

SOURCE_DIR="/data/compose/28/uptime-kuma-data"

BACKUP_DIR="/opt/stacks/backups/uptime-kuma"

TIMESTAMP=$(date +"%Y%m%d_%H%M%S")

BACKUP_NAME="kuma_backup_$TIMESTAMP.tar.gz"

RETENTION_DAYS=30

# ---------------------


# Ensure backup directory exists

mkdir -p "$BACKUP_DIR"


echo "Starting Uptime Kuma backup..."


# 1. Stop the container to freeze the SQLite DB safely

docker stop "$CONTAINER_NAME"


# 2. Compress the data directory

tar -czf "$BACKUP_DIR/$BACKUP_NAME" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"


# 3. Restart the container immediately

docker start "$CONTAINER_NAME"


# 4. Clean up backups older than X days

find "$BACKUP_DIR" -type f -name "kuma_backup_*.tar.gz" -mtime +$RETENTION_DAYS -exec rm {} \;


echo "Backup completed successfully: $BACKUP_DIR/$BACKUP_NAME"

I tested it several times.  There was an issue with the source directory values, which I sorted.  Once I sorted that, the script worked.

I then created a cron job for the script:

# Backup of Uptime-Kuma

0 2 * * 1 /usr/local/bin/backup-kuma.sh > /dev/null 2>&1

One cool option is that I can set the retention days for the backup data.  Anything older than 30 days, for example, gets removed.  That value can also be changed (it was initially set to backup on a daily basis).

I also asked the AI to present restoration steps, which it did.  I documented that for later use.  I will ask it, later, to create a script of the restoration steps.

That is my backup solution.

The backup solution is mainly so that I do not have to recreate the UK monitors if I lose them during an upgrade of Uptime Kuma.

Saturday, July 18, 2026

My Son's Steam Deck Wouldn't Hibernate, But I Fixed It

My son noticed that his base model Steam Deck stopped hibernating.  I asked if I could take a look at it and he gave me permission.

I tried a few things:

I tested to determine if it wasn't hibernating - it wasn't.

I then put the Deck into Desktop Mode and tried to hibernate it - it hibernated.  This told me that it wasn't a hardware issue.

I then went back into Game Mode and then went into the system's settings to check which update channel he was using (for SteamOS).  He was using the Standard update channel.  I then configured his system to use the Beta update channel, which prompted a reboot.  After the system rebooted, I went back into the system stettings to force an OS update.  It applied the update.  I then switch the update channel back to Standard and rebooted.  After rebooting, I then forced an update.  I then checked to see if the system would hibernate in Game Mode and it would not.

Next, as I suspected that something was corrupted within his Steam Folders, I needed to actually delete some files.  I switched to Desktop Mode and exited the Steam app.  I then opened the file manager and visited /home/deck/.steam/.  That directory contains a folder named 'root'.  Instead of deleting it, I changed the name to 'root_original'.  I then reopened the Steam app, returned to Gaming Mode, and then checked to see if the Deck would hibernate - it DID!

I wanted to attempt the soltuions that didn't require file deletions first, as it wasn't my Deck - was trying to be repectful of my son.  In the end, it required files to be altered, but I didn't have to actually delete the files.  I suppose I can go back into the file manager and delete 'root_original', knowing I already repaired the 'root' firectory by having the Steam app rebuild that directory.

I wanted to share this info in case others run into a similar issue.

Saturday, June 27, 2026

Since I'm having Problems with Youtube, I'm downloading all my videos now.

I've been having problems with YouTube.

I was hit with a community warning.  It was not a strike but a warning, but they removed a video.

What's the problem?  There are several problems, actually.

For one, I didn't violate any policy.

Secondly, YouTube won't share any details - I've no idea what policy was violated, but they pointed me to their firearms policy (I own firearms and much of my content is related to firearms advocacy).  I'm familiar with their firearms policy.  I looked over it when this first occurred - I went down the policy line by line, reviewing the banned video footage.  I saw nothing that I violated.  The video was also age-limited.  I wasn't selling or manufacturing (I don't sell or manufacture firearms or firearms parts).

Third, they said I could appeal but IMMEDIATELY denied the appeal when I submitted it.

Fourth, they said that I "have the option to take a quick, seven-question training to have" the communitiy warning "expire in 90 days."

What's concerning is that I initially refused to take the training, mainly because:  I. Did. Not. Violate. YouTube's. Firearms. Policy.  The fact that I keep receiving notifications that I have the option to take the training makes it seem as if it's not an option.

The main problem I have at this point in time is that YouTube wants me to incriminate myself.  Taking that training could be conscruted by them as admitting that I was in violation of their policy.  It feels as if I'm being forced to take the training.

They also stated that if I get another warning while this current warning is still in my queue, I'll actually get a channel strike, UNLESS I take the training.

So, I'm now in the process of downloading every single video I've ever uploaded to YouTube, just in case they shut down the channel.  I've 397 videos.

I used Google's AI (yeah, there's irony there - Google owns YouTube) to assist with this.

I had the AI create a script that would download each video.

It is a python script, and it is below:


import os

import sys

from yt_dlp import YoutubeDL


def download_XXX_channel():

    """

    Downloads all videos from the XXX YouTube channel.

    Includes English subtitles and auto-generated captions embedded into the MP4s.

    """

    channel_url = "https://www.youtube.com/@XXX"

    output_folder = "youtube_archive"


    # Create the destination folder if it doesn't exist

    if not os.path.exists(output_folder):

        os.makedirs(output_folder)

        print(f"Created directory: {output_folder}")


    # Configuration options for yt-dlp

    ydl_opts = {

        # Formats: pulls the absolute highest quality video and audio available

        'format': 'bestvideo+bestaudio/best',

        

        # Path and naming template for downloaded files

        'outtmpl': os.path.join(output_folder, '%(upload_date)s_%(title)s.%(ext)s'),

        

        # History log: prevents downloading the same video twice if restarted

        'download_archive': os.path.join(output_folder, 'downloaded_history.txt'),

        

        # Resumes interrupted downloads

        'continue_dl': True,

        

        # Keeps running even if a specific video throws an error

        'ignoreerrors': True,

        

        # Merges video + audio tracks into an MP4 container

        'merge_output_format': 'mp4',


        # --- SUBTITLE CONFIGURATION ---

        # Attempts to download the official creator-uploaded English subtitles

        'writesubtitles': True,

        

        # Falls back to YouTube's auto-generated English captions if manual ones don't exist

        'writeautomaticsub': True,

        

        # Limits the download strictly to English subtitles

        'subtitleslangs': ['en'],

        

        # Embeds the subtitles directly inside the video container file 

        # (This allows you to turn them on or off inside players like VLC or QuickTime)

        'embedsubtitles': True,

    }


    print(f"Starting archival for: {channel_url}")

    print(f"Videos and subtitles will save to: {os.path.abspath(output_folder)}\n")


    try:

        with YoutubeDL(ydl_opts) as ydl:

            ydl.download([channel_url])

        print("\nProcess finished! Check your output directory.")

    except Exception as e:

        print(f"An unexpected error occurred: {e}", file=sys.stderr)


if __name__ == "__main__":

    download_XXX_channel()


I basically just asked the AI to help me download all my videos on my channel.

The script is currently running and has captured 44 videos thus far (it's been running maybe an hour).  It is slow going but I'll leave it running overnight.

My plan is to upload these videos to Rumble.  I'll keep the YT channel up but I've the feeling they're going to keep messing with me and eventually ban my channel.  Why?  Because they hate firearms.  Note that they're doing this to many, many other folks, as well.  You can see folks on Reddit and X.com complaining about this all the time, and plenty of those folks don't even run firearms-related channels.

Maybe I'm being paranoid with YouTube but I just don't like how a commercial company is trying to force me to accept that I did something wrong, without showing me what I actually did wrong, and then attempting to make me take training to make things right - when I didn't do anything wrong.  I no longer trust them.  They could do all of this again 6 weeks/months from now without providing proof and I'd have no way to fight it at all.  There's no transparency with them and there's not discourse.  That's a shitty way to conduct business, in my opinion.


UPDATE (6/28/2026):  I let the script run overnight.  I checked on it a few minutes ago and it completed the backups.  There were 413 videos, measuring out to approximately 162 GB.  I'm now in the process of transferring them all to my NAS drive.

Sunday, June 21, 2026

I Repaired My Steam Deck!

I bought a Steam Deck maybe 1.5-2 years ago.  I bought the 1-TB OLED version.

Up until recently, it's been an uneventful user experience.

I'm usually not rough on my equipment but I noticed that the left joystick would stick, but only in the UP position.  When I looked at the stick, a chunk was missing under the stick knob, in the area where a user would press up on the stick.  It adversely affects the gaming experience.

I did some research and found that ifixit.com sold Steam Deck parts, so I bought a replacement kit that includes the thumbstick module. I bought it maybe six months ago and had been neglecting to change the stick ever since.

Today, I installed the new stick.  ifixit.com has a nice write-up on how to replace the stick.

After I replaced it, I experienced an issue where the Steam Deck wouldn't boot up.  I panicked because I thought I did something wrong - I ended up re-opening the case (twice, actually) before researching the issue.  This is a normal thing.  I did a hard reset (held the power button for 30 sec) and  then waited maybe 60 seconds for the Steam Deck to reset itself, which it did.  The SD is now functioning without issue.

I didn't even have to recalibrate the sticks - they're Hall Effect sticks, and don't drift.

Working on the Steam Deck is super easy, as well, since it's so modular. 

Monday, May 25, 2026

*Profound Sadness* My Airpods Max Stopped Working!

Two weeks ago, my APM headset (USB-C) stopped working.  They stopped pairing but I also noticed that they appeared to stop charging, as well.

This was disappointing, but I'd been having problems the past 6-8 months with pairing, so I expected them to eventually die.  Them being not-pairable was a blessing because that meant they were not usable...a broken headset would be something Apple can't ignore, right?  

I'd also been removing the pods from the headset harness to clean the hardware connections, which would temporarily fix the pairing issues (that eventually stopped fixing the issue).

So, I went to Apple's support pages to make an appointment at the nearest Apple Store.  That was intitially problematic, because the support page didn't consider a pairing issue to be an issue, so it wouldn't allow me to open a support case. (WTF!)  I tried a second time and it excepted my case - I was able to make an appointment.

I visited the Apple Store and told them what was going on.  They attempted to charge the headset (waited a few minutes after connecting it to power) and saw that it wasn't charging.  It still had power but was not charging.  They then checked to see if it would go into pairing mode - it would not.  They told me that they'd keep the headset and send it out to a service center.  They told me that they'd have it maybe five to seven days.

That seven days sucked.  I'm so used to my APMs that using any ohter headset sucked.  I have a Steel Series headset, a Skull Candy Venue, and a Beats Studio Pro...they all suck compared to the APM.  The next best thing was probably the Skull Candy.  The BSPs have better sound, but the headset is old and beat up - the band is slightly warped.

Seven days later, they called me and said I could come pick them up.  At the Apple Store, they told me that they had to replace the left-side pod, as it had the BT module (and power, I believe).  The new pod still had protective plastic on it.

It felt soooo good to be able to pair my APMs again, without jumping through hoops.

As well, none of this would've happened without AC+.  I have Apple Care + on the headset and it's something I wanted since the headset is not cheap.  I'm glad I did, because they might have fixed it but would've charged me if I didn't have AC+.  I paid $0 for this repair.