Public


1. Announcements & Introduction

Hi PrecisionPlanIT enjoyer,

We will dedicate this space to guides once more in the months to come. I am so-so-so-so sorry to anyone who makes it here by way of links that I dropped in the past that are now deadlinks as none of the content exists anymore...

The original guides located at this site are lost w/o backups due to mishaps with CEPH and poor planning ~ not having backups.

Daily backups ~ Going forward I have daily backups being generated at the end of every day. We are in no fear of losing data again at this point. I will be better as a sysadmin going forward. I knew better, I thought I could procrastinate creating backups another few weeks as it had been 7+ years without and this is the first loss of data since I began hosting content to the WWW... Well no more of that. We have daily backups and we are working towards getting everything back online and better than ever before!

Thank you for your patience and understanding during this relaunch of our services,

Kai ~ aka. SoFMeRight
Owner of PrecisionPlanIT & SoFMeRight Gaming

Ubuntu Chronicles

Ubuntu Chronicles

NGINX Shenanigans

I will be exposing my self hosted repo soon that will contain some ansible scripts and stuff I used to build out my environment without any guesswork. Also will be the repo I am using to build my flux+K8s cluster that is to be my debut into full fledged gitops. I will share ALL of my nginx configs etc from there as well when we get to that point. Sorry guys its a trickle getting back up and going.

Most recent updates: 02/01/2025 09:04:32 UTC

Generate SSL Certs the caveman way with simple Terminal Commands.

Installing certbot if needed:

sudo apt-get install python3-certbot-dns-cloudflare

Store the cloudflare api token key:

mkdir /some/path/to/the
sudo chmod 0700 /some/path/to/the
sudo chmod 0400 /some/path/to/the/api_access_secret.ini
sudo nano /some/path/to/the/api_access_secret.ini

The contents of the api_access_secret.ini should be:

dns_cloudflare_api_token = <yourtopsecretcloudflareapitoken>

Pulling wildcard certs for a domain:

sudo certbot -v certonly --dns-cloudflare --dns-cloudflare-credentials /some/path/to/the/api_access_secret.ini -d 'prplanit.com' -d '*.prplanit.com'

Return Public IP with curl, one-liner:

curl ifconfig.me
Ubuntu Chronicles

SAMBA/CIFS

Malformed Interfaces Issue

image.png

This issue was originally introduced to Ubuntu via a kernel update as such it is related to a kernel issue.

Solutions I found for this issue involve kernel patching/updating or changing the cifs settings. I recommend the latter, as changing the kernel is a more invasive solution that may result in new issues (see below).

Install a hwe kernel (not currently recommended):

Warning: using this solution broke nvidia-smi in a host with most of its workload being GPU accelerated docker/docker-compose. Updating the kernel may cause other issues but it did resolve this issue without changing the cifs settings and I am certain that the issue can be resolved with a kernel patch but I don't remember what method I used previously.

apt-get install linux-generic-hwe-22.04

Replace the (22.04) with your distro. I do not anticipate you should be here if you are running 24.04. My testing is with Ubuntu 22.04.

CIFS Settings (Recommended):

Without installing a different kernel or patch, the issue is resolved by adding the ,vers=2.1 option in the fstab mount or docker-compose cifs mount. We are not going to investigate the differences between cifs 3 vs 2.1 for the scope of this issue. Do research further if this will be a concern.

Examples:

volumes:
  plex_config:
    driver: local
    driver_opts:
      type: cifs
      o: "iocharset=utf8,username=<username>,password=<somepass>,vers=2.1,rw,uid=<changethistotheproperuid>,file_mode=0777,dir_mode=0777"
      device: "//192.168.1.1/<sharename>"

//192.168.1.1/<sharename> /mnt/path cifs username=<username>,password=<password>,uid=1000,gid=www-data,file_mode=0777,dir_mode=0777,noperm,vers=2.1 0 0

If you discover a more viable solution please feel free to reach out by any method available and I will update this information.

This page is redirected to from a shortlink. That short link was originally created before a disaster event in which all non-critical application data that did not reside on our NAS was lost without backups. At this time we did lose our original public facing documentation. I am working on restoring the state of the documentation but I wanted to leave a note to clarify why the state of this link might seem less than what would be expected. Please keep backups and test them to make sure they work ~ Computers 101 <3

IDP/SSO: Zitadel


IDP/SSO: Zitadel

Software Integrations (Tested In-House)

At KB.precisionplanit.com, we pride ourselves on our commitment to continuous improvement and adaptation. As part of our mission, we've integrated a variety of open-source, Identity and Access Management (IAM) compatible FOSS (Free and Open Source Software) applications into the IDC Zitadel. We present to you our record of the FOSS (Free and Open Source Software) solutions that have been tested and configured in-house for seamless integration. 

Details regarding the successfully tested & integrated applications if available will be provided below.

Tested Applications:

Name Info Integration Method

Zitadel Config

+

App Config / Environment Variables

bookstack


OIDC, code auth

Bookstack Docker Environment Variables:

 

AUTH_METHOD=oidc
AUTH_AUTO_INITIATE=true
OIDC_NAME="Zitadel SSO" # This is how the login method will appear in the sign on box.
OIDC_DISPLAY_NAME_CLAIMS=name
OIDC_CLIENT_ID=<ClientID>
OIDC_CLIENT_SECRET=<ClientSecret>
OIDC_ISSUER=https://sso.prplanit.com
OIDC_END_SESSION_ENDPOINT=false
OIDC_ISSUER_DISCOVER=true
APP_THEME=custom
OIDC_DUMP_USER_DETAILS=false
OIDC_USER_TO_GROUPS=true
OIDC_GROUPS_CLAIM=groups
OIDC_ADDITIONAL_SCOPES=groups
OIDC_REMOVE_FROM_GROUPS=false

mealie


OIDC, code auth

netbird


OIDC, followed official guide

osticket

a widely-used open source support ticket system

OIDC, code auth

portainer


OIDC, codeauth

Plan to test soon:

Name Info Integration Method

Zitadel Config

+

App Config / Environment Variables

gitea




linkwarden


OIDC, follow official guide

openwebui




photoprism




FAILED TESTING:

Name Info Integration Method

Zitadel Config

+

App Config / Environment Variables

Proxmox VE
OIDC

Does not like that Zitadel returns more than one audience. Proxmox devs may be working on a fix.


These examples are just the beginning and provided with the sole intention to assist with verification of software compatibility; we encourage further exploration of our integrations to find the perfect solutions for your needs. We will try to provide best steps to assist with your implementation process, however it may require additional tweaking to reach your desired result.

Please check back regularly for updates as new applications may be added to this list and the steps will likely be updated based on ongoing testing and improvement efforts.

 

 

Note: Below this line we will include any resources we find in the present or future that we think may be helpful to those who are trying to find methods to integrate software that does not have a straightforward implementation flow. We are still new to Zitadel so this is currently a placeholder.

Docker Compose

Docker Compose

Netbox

My docker-compose:

version: "3.7"
services:
  netbox-postgres:
    image: postgres:15-alpine
    container_name: netbox_postgres
    hostname: netbox-postgres
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "pg_isready", "-q", "-d", "netbox", "-U", "netbox"]
      timeout: 45s
      interval: 10s
      retries: 10   
    volumes:
      - /mnt/app_data/Server/Web-App/_docker-stack/netbox/postgres:/var/lib/postgresql/data
    env_file: stack.env
    environment:
      - POSTGRES_DB=netbox
      - POSTGRES_USER=netbox
     
  netbox-redis:
    image: redis:7-alpine
    user: 1026:100
    command: redis-server
    container_name: netbox_redis
    hostname: netbox-redis
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping || exit 1"]
    restart: always
    volumes:
      - /mnt/app_data/Server/Web-App/_docker-stack/netbox/redis:/data
      
  netbox-server:
    image: lscr.io/linuxserver/netbox:latest
    container_name: netbox_server
    hostname: netbox-server
    env_file: stack.env
    environment:
      - PUID=1026
      - PGID=100
      - TZ=America/Los_Angeles
      - ALLOWED_HOSTS=['netbox.domain.com', 'netbox.domain.internal', '172.122.122.122', '127.0.0.1']
      - DB_NAME=netbox
      - DB_USER=netbox
      - DB_HOST=netbox-postgres
      - DB_PORT=5432
      - REDIS_HOST=netbox-redis
      - REDIS_PORT=6379
      - REDIS_DB_TASK=0
      - REDIS_DB_CACHE=1
    volumes:
      - /mnt/app_data/Server/Web-App/_docker-stack/netbox/config:/config
    ports:
      - 13031:8000
    depends_on:
      - netbox-postgres
      - netbox-redis
    restart: unless-stopped   

When I changed the IP addresses I expected to only need to change the hosts IP config in the compose however it was necessary here as below as well.

nano ~/netbox/config/configuration.py

#########################
#                       #
#   Required settings   #
#                       #
#########################

# This is a list of valid fully-qualified domain names (FQDNs) for the NetBox server. NetBox will not permit write
# access to the server via any other hostnames. The first FQDN in the list will be treated as the preferred name.
#
# Example: ALLOWED_HOSTS = ['netbox.example.com', 'netbox.internal.local']
ALLOWED_HOSTS = ['netbox.domain.com', 'netbox.domain.internal', '172.122.122.122', '127.0.0.1']

# PostgreSQL database configuration. See the Django documentation for a complete list of available parameters:
#   https://docs.djangoproject.com/en/stable/ref/settings/#databases
DATABASE = {
    'NAME': 'netbox',         # Database name
    'USER': 'netbox',               # PostgreSQL username
    'PASSWORD': '<redacted>',           # PostgreSQL password
    'HOST': 'netbox-postgres',      # Database server
    'PORT': '5432',               # Database port (leave blank for default)
    'CONN_MAX_AGE': 300,      # Max database connection age
}

# Redis database settings. Redis is used for caching and for queuing background tasks such as webhook events. A separate
# configuration exists for each. Full connection details are required in both sections, and it is strongly recommended
# to use two separate database IDs.
REDIS = {
    'tasks': {
        'HOST': 'netbox-redis',
        'PORT': 6379,
        # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel
        # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
        # 'SENTINEL_SERVICE': 'netbox',
        'PASSWORD': '',
        'DATABASE': 0,
        'SSL': False,
        # Set this to True to skip TLS certificate verification
        # This can expose the connection to attacks, be careful
        # 'INSECURE_SKIP_TLS_VERIFY': False,
    },
    'caching': {
        'HOST': 'netbox-redis',
        'PORT': 6379,
        # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel
        # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
        # 'SENTINEL_SERVICE': 'netbox',
        'PASSWORD': '',
        'DATABASE': 1,
        'SSL': False,
        # Set this to True to skip TLS certificate verification
        # This can expose the connection to attacks, be careful
        # 'INSECURE_SKIP_TLS_VERIFY': False,
    }
}

# This key is used for secure generation of random numbers and strings. It must never be exposed outside of this file.
# For optimal security, SECRET_KEY should be at least 50 characters in length and contain a mix of letters, numbers, and
# symbols. NetBox will not run without this defined. For more information, see
# https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-SECRET_KEY
SECRET_KEY = '<redacted>'


#########################
#                       #
#   Optional settings   #
#                       #
#########################

# Specify one or more name and email address tuples representing NetBox administrators. These people will be notified of
# application errors (assuming correct email settings are provided).
ADMINS = [
    # ('John Doe', 'jdoe@example.com'),
]

# URL schemes that are allowed within links in NetBox
ALLOWED_URL_SCHEMES = (
    'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp',
)

# Optionally display a persistent banner at the top and/or bottom of every page. HTML is allowed. To display the same
# content in both banners, define BANNER_TOP and set BANNER_BOTTOM = BANNER_TOP.
BANNER_TOP = ''
BANNER_BOTTOM = ''

# Text to include on the login page above the login form. HTML is allowed.
BANNER_LOGIN = ''

# Base URL path if accessing NetBox within a directory. For example, if installed at https://example.com/netbox/, set:
# BASE_PATH = 'netbox/'
BASE_PATH = ''

# Maximum number of days to retain logged changes. Set to 0 to retain changes indefinitely. (Default: 90)
CHANGELOG_RETENTION = 90

# API Cross-Origin Resource Sharing (CORS) settings. If CORS_ORIGIN_ALLOW_ALL is set to True, all origins will be
# allowed. Otherwise, define a list of allowed origins using either CORS_ORIGIN_WHITELIST or
# CORS_ORIGIN_REGEX_WHITELIST. For more information, see https://github.com/ottoyiu/django-cors-headers
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [
    # 'https://hostname.example.com',
]
CORS_ORIGIN_REGEX_WHITELIST = [
    # r'^(https?://)?(\w+\.)?example\.com$',
]

# Specify any custom validators here, as a mapping of model to a list of validators classes. Validators should be
# instances of or inherit from CustomValidator.
# from extras.validators import CustomValidator
CUSTOM_VALIDATORS = {
    # 'dcim.site': [
    #     CustomValidator({
    #         'name': {
    #             'min_length': 10,
    #             'regex': r'\d{3}$',
    #         }
    #     })
    # ],
}

# Set to True to enable server debugging. WARNING: Debugging introduces a substantial performance penalty and may reveal
# sensitive information about your installation. Only enable debugging while performing testing. Never enable debugging
# on a production system.
DEBUG = False

# Email settings
EMAIL = {
    'SERVER': 'localhost',
    'PORT': 25,
    'USERNAME': '',
    'PASSWORD': '',
    'USE_SSL': False,
    'USE_TLS': False,
    'TIMEOUT': 10,  # seconds
    'FROM_EMAIL': '',
}

# Enforcement of unique IP space can be toggled on a per-VRF basis. To enforce unique IP space within the global table
# (all prefixes and IP addresses not assigned to a VRF), set ENFORCE_GLOBAL_UNIQUE to True.
ENFORCE_GLOBAL_UNIQUE = False

# Exempt certain models from the enforcement of view permissions. Models listed here will be viewable by all users and
# by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models.
EXEMPT_VIEW_PERMISSIONS = [
    # 'dcim.site',
    # 'dcim.region',
    # 'ipam.prefix',
]

# Enable the GraphQL API
GRAPHQL_ENABLED = True

# HTTP proxies NetBox should use when sending outbound HTTP requests (e.g. for webhooks).
# HTTP_PROXIES = {
#     'http': 'http://10.10.1.10:3128',
#     'https': 'http://10.10.1.10:1080',
# }

# IP addresses recognized as internal to the system. The debugging toolbar will be available only to clients accessing
# NetBox from an internal IP.
INTERNAL_IPS = ('127.0.0.1', '::1')

# Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
#   https://docs.djangoproject.com/en/stable/topics/logging/
LOGGING = {}

# Automatically reset the lifetime of a valid session upon each authenticated request. Enables users to remain
# authenticated to NetBox indefinitely.
LOGIN_PERSISTENCE = False

# Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users
# are permitted to access most data in NetBox but not make any changes.
LOGIN_REQUIRED = False

# The length of time (in seconds) for which a user will remain logged into the web UI before being prompted to
# re-authenticate. (Default: 1209600 [14 days])
LOGIN_TIMEOUT = None

# Setting this to True will display a "maintenance mode" banner at the top of every page.
MAINTENANCE_MODE = False

# The URL to use when mapping physical addresses or GPS coordinates
MAPS_URL = 'https://maps.google.com/?q='

# An API consumer can request an arbitrary number of objects =by appending the "limit" parameter to the URL (e.g.
# "?limit=1000"). This setting defines the maximum limit. Setting it to 0 or None will allow an API consumer to request
# all objects by specifying "?limit=0".
MAX_PAGE_SIZE = 1000

# The file path where uploaded media such as image attachments are stored. A trailing slash is not needed. Note that
# the default value of this setting is derived from the installed location.
# MEDIA_ROOT = '/opt/netbox/netbox/media'

# By default uploaded media is stored on the local filesystem. Using Django-storages is also supported. Provide the
# class path of the storage driver in STORAGE_BACKEND and any configuration options in STORAGE_CONFIG. For example:
# STORAGE_BACKEND = 'storages.backends.s3boto3.S3Boto3Storage'
# STORAGE_CONFIG = {
#     'AWS_ACCESS_KEY_ID': 'Key ID',
#     'AWS_SECRET_ACCESS_KEY': 'Secret',
#     'AWS_STORAGE_BUCKET_NAME': 'netbox',
#     'AWS_S3_REGION_NAME': 'eu-west-1',
# }

# Expose Prometheus monitoring metrics at the HTTP endpoint '/metrics'
METRICS_ENABLED = False

# Credentials that NetBox will uses to authenticate to devices when connecting via NAPALM.
NAPALM_USERNAME = ''
NAPALM_PASSWORD = ''

# NAPALM timeout (in seconds). (Default: 30)
NAPALM_TIMEOUT = 30

# NAPALM optional arguments (see https://napalm.readthedocs.io/en/latest/support/#optional-arguments). Arguments must
# be provided as a dictionary.
NAPALM_ARGS = {}

# Determine how many objects to display per page within a list. (Default: 50)
PAGINATE_COUNT = 50

# Enable installed plugins. Add the name of each plugin to the list.
PLUGINS = []

# Plugins configuration settings. These settings are used by various plugins that the user may have installed.
# Each key in the dictionary is the name of an installed plugin and its value is a dictionary of settings.
# PLUGINS_CONFIG = {
#     'my_plugin': {
#         'foo': 'bar',
#         'buzz': 'bazz'
#     }
# }

# When determining the primary IP address for a device, IPv6 is preferred over IPv4 by default. Set this to True to
# prefer IPv4 instead.
PREFER_IPV4 = False

# Rack elevation size defaults, in pixels. For best results, the ratio of width to height should be roughly 10:1.
RACK_ELEVATION_DEFAULT_UNIT_HEIGHT = 22
RACK_ELEVATION_DEFAULT_UNIT_WIDTH = 220

# Remote authentication support
REMOTE_AUTH_ENABLED = False
REMOTE_AUTH_BACKEND = 'netbox.authentication.RemoteUserBackend'
REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
REMOTE_AUTH_AUTO_CREATE_USER = False
REMOTE_AUTH_DEFAULT_GROUPS = []
REMOTE_AUTH_DEFAULT_PERMISSIONS = {}

# This repository is used to check whether there is a new release of NetBox available. Set to None to disable the
# version check or use the URL below to check for release in the official NetBox repository.
RELEASE_CHECK_URL = None
# RELEASE_CHECK_URL = 'https://api.github.com/repos/netbox-community/netbox/releases'

# The file path where custom reports will be stored. A trailing slash is not needed. Note that the default value of
# this setting is derived from the installed location.
# REPORTS_ROOT = '/opt/netbox/netbox/reports'

# Maximum execution time for background tasks, in seconds.
RQ_DEFAULT_TIMEOUT = 300

# The file path where custom scripts will be stored. A trailing slash is not needed. Note that the default value of
# this setting is derived from the installed location.
SCRIPTS_ROOT = '/config/scripts'

# The name to use for the session cookie.
SESSION_COOKIE_NAME = 'sessionid'

# By default, NetBox will store session data in the database. Alternatively, a file path can be specified here to use
# local file storage instead. (This can be useful for enabling authentication on a standby instance with read-only
# database access.) Note that the user as which NetBox runs must have read and write permissions to this path.
SESSION_FILE_PATH = None

# Time zone (default: UTC)
TIME_ZONE = 'UTC'

# Date/time formatting. See the following link for supported formats:
# https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date
DATE_FORMAT = 'N j, Y'
SHORT_DATE_FORMAT = 'Y-m-d'
TIME_FORMAT = 'g:i a'
SHORT_TIME_FORMAT = 'H:i:s'
DATETIME_FORMAT = 'N j, Y g:i a'
SHORT_DATETIME_FORMAT = 'Y-m-d H:i'

 

Docker Compose

_Docker Daemon

These configs have stumped me one too many times.

Issue: Why is my docker host having trouble resolving DNS?
After enabling pi-hole or other dockerized DNS management app, lack of (systemd-resolved e.t.c. means that DNS is not available on a local level prior to docker to so much as pull pi-hole. (wonderful chick needs to lay its own egg scenario) A great solution I found to this issue is to set the DNS for docker explicitly.

Issue: Why aren't the nvidia drivers workable on my system.
Gotta love the oversight, better remember to request gpu here as well as in the compose. 🤦‍♀️

Issue: After creating about 40 stacks / docker containers ... I can no longer create new ones with unique ips...
As seen below we need to set/allow additional ranges of IP addresses for docker to use in addition to those available by default. You can use something like below or adjust to a set of IPs not taken elsewhere on your network.

{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    },

    "default-address-pools" : [
        {
            "base" : "172.50.0.0/12",
            "size" : 20
            },
        {
            "base" : "192.168.30.0/16",
            "size" : 24
        }
    ],
    "dns": ["<pihole#1>", "<pihole#2>", "1.1.1.1", "8.8.8.8"]
}

Note: 
Later when I describe how to setup pihole remind me to note that we need to turn off that below and update the dns for docker.

Pi-Hole
sudo systemctl stop systemd-resolved

Homelab History


Homelab History

Hardware Write-up

I did an exhaustive write up of my lab a few months ago and it died. This will be a trickle attempt to get it back in place. It was useful for referencing my hardware and showing how I have things setup. We do plan on doing it again. Especially cause we know at 9:00 PM tonight the server this is on will be flashed to a backup stockpile  🤣

Notes to self:
Todo ~ Import all hardware from ebay. Skipped most hard drive purchases on ebay (minus the ssds). Need to grab everything on Amazon. Try and summarize most of what is in the lab currently from offer up and craiglist.
Than obviously at some point will start to show how stuff is set up!

Hardware:


Part Name Purchase Cost / Date Purchase Method / Photos / Notes
The Rack Itself
Compaq 42U (9000?)





UPS

EEATON NETWORK M2 5PX3000RT2U UPS, 3000VA Rackmount, Good Condition, Tested.

$352.30 / Dec 02, 2024

~ (UPS Rails)

APC SC 870-1250B L / SC 870-1251B R Server Rackmount Sliding Rail Kit

$44.03 / Dec 04, 2024

image.png





Avocado
     

CPU:

2 x E5_2680 v3 "..." "..." ~ Came with Avocado chassis.

GPU:

Nvidia RTX A2000 12GB GPU Video Graphics NVIDIA Warranty 03/2025

$440.40 / Jul 01, 2024

image.png

NIC

SILICOM PE310G4SPI9L-XR-CX3 QUAD PORT 10GB SFP+ NETWORK ADAPTER

$40.78 / Nov 09, 2024

image.png

~ (NIC Bracket)

LOW BRACKET PLATE for PE310G4SPI9L

$4.35 / Nov 13, 2024


SSD (Ceph VM Data Pool):

Samsung 3.2TB V-NAND F320 NVMe MZ-PLK3T20 PCIe

$157.39 / Jun 20, 2024

image.png

Chassis:

SuperChassis 826BE1C-R920LPB
image.png
$630.87 / May 10, 2024

2U 12 Bay TruNas SAS3 12gbps Server Xeon 24 core 128GB w/SSD Boot 2x 920SQ PS

image.png

PSU: 

2 x Supermicro PWS-920P-SQ "..." "..." ~ Came with Avocado chassis.




Bamboo



CPU:

INTEL XEON E5-2680 V4 SR2N7 2.40GHZ Server Processor

 

INTEL SR2N7 E5-2680V4 2.40 GHz 35 MB SmartCache 120 W SKU 12162

$19.81 / Dec 23, 2024

$17.38 / Dec 30, 2024

image.png

image.png

CPU Passive Cooling

Supermicro SNK-P0048PS 11201517 Screw Down Heat Sink

$12.06 / Dec 30, 2024

image.png

Motherboard

Supermicro X10DRH-iT Dual LGA2011-3 Onboard 10GBe, 26xx v3/v4 CPU w/ I/O Shield

$131.02 / Dec 31, 2024

image.png

HBA:

LSI LENOVO 9240-8i 8-port SAS SATA ServerRAID Controller Card High Profile

$19.81 / Nov 02, 2024

image.png

NIC

SILICOM PE310G4SPI9L-XR-CX3 QUAD PORT 10GB SFP+ NETWORK ADAPTER

$40.78 / Nov 09, 2024

image.png

~ (NIC Bracket)

LOW BRACKET PLATE for PE310G4SPI9L

$4.35 / Nov 13, 2024


SSD (Ceph VM Data Pool):

Oracle 7317693 3.2TB V-NAND F320 NVMe Samsung MZPLK3T2HCJL-000U4 PCIe3x8

$167.63 / Oct 26, 2024

image.png

~ (SSD Bracket)

Low Profile Bracket for Samsung PM1725B PM1725A PM1735 983ZET

$2.75 / Nov 26, 2024

image.png

Backplane:

Supermicro 2U 6Gbps SAS-2 / SATA Expander Backplane 12 bay 3.5" CSE-826 CSE-847

$71.57 / May 23, 2024

image.png

Chassis: CSE 826 (Doesn't have 2 x 2.5" SSD slots in the back like Avocado and Bamboo)

$275 / Feb 12, 2022

(Included decommissioned Mobo+CPU+RAM) 

My first taste of Supermicro / Ewaste Old Enterprise Stuff.

image.png

PSU:

Lot of 2 Supermicro PWS-920P-SQ 920W 80PLUS Platinum Power Supply Super-Quiet

$75.18 / Nov 09, 2023

image.png





Cosmos



NIC:

Intel X520-DA2 Dual Port SFP PCIe Network Adapter Low Profile Dell P/N: 0942V6

$24.21/ Sep 21, 2023

image.png

Storage - SSD (Ceph VM Data Pool):

Samsung 3.2TB V-NAND F320 NVMe MZ-PLK3T20 PCIe

$157.39 / Jun 20, 2024

image.png

Chassis: 2U 12 Bay TruNas SAS3 12gbps Server Intel Xeon 3.2Ghz Total 16 Core 64GB RAM HBA $448.77 / Jan 04, 2025

image.png





Dragonfruit



CPU

AMD Ryzen 7 2700X Processor Wraith Prism LED Cooler - YD270XBGAFBOX

$309.89 + Fees / October 27, 2018 
image.png

image.png

RAM

Some old CL14 Samsung Bdie Kit I have laying around 3200MHZ non ECC. I think 16GB.



Motherboard

ASUS Prime X370-Pro AMD Ryzen AM4 DDR4 DP HDMI M.2 USB 3.1 ATX X370 Motherboard with Aura Sync RGB Lighting

$79.21 / October 21, 2018

image.png

NIC:

Silicom PE310G4SPI9L-XR-CX3 4-Port 10GB SFP+ PCIe Server Adapter Card

$38.52 / Oct 27, 2024

image.png

Chassis:

Rosewill 4U RSV-L4000U Rackmount Server Chassis | Carries up to 8 3.5" HDD | Inc

$209.18 / Sep 04, 2024

Photo don't do justice to how beat to hell it was...

image.png

Rails:

iStarUSA TC-RAIL-26 26" Sliding Rail Kit for Most Rackmount Chassis

$44.49 / Jul 22, 2024

image.png





Eggplant



HBA:

2 x Supermicro AOC-S3008L-L8E SAS3 12Gbps 8-Port Internal PCI-e 3.0 HBA Controller

$18.71 / Dec 20, 2024

image.png

HBA:

LSI SAS9207-8e 8 Ports HBA SAS SATA Host Bus Adapter 6Gb/s High Profile 9207-8e

$27.50 / Jun 05, 2024

image.png

Chassis

Supermicro 4U 36 Bay TRUNAS Storage Server Xeon 28 Core 64GB 12GBs SQ PS Rail

$527.38 / Dec 20, 2024

image.png

Storage (24 x 2.5" Flash Shelf)

Netapp DS2246 Storage Expansion Array 24 Bay 2.5" SAS Trays 2x IOM6 Controllers

$158.54 / May 21, 2024
(Now $89 😭🤣 - 02/26/2025)

image.png

~ (Rails for the Flash Shelf)

NetApp X5526A-R6 Universal Rackmount Rail Kit Bracket DS4243 DS4246 DS22xx Etc

$50.65 / May 24, 2024

image.png

Storage (Backups Disk 1/4):

Crucial - MX500 2TB Internal SSD SATA $176.47 / May 29, 2024 Bestbuy

Storage (ZFS ZIL)

Radian RMS-200/8G PCIe x8 Gen3 NVRAM Accelerator Card 800001-001

$57.00 / Jun 16, 2024

image.png





Glicynia (Gaming)



CPU:

AMD Ryzen 7 5800X3D Processor (4.5 GHz, 8 Cores, Socket AM4) Tray -...

$337.07 / Aug 30, 2024

image.png

RAM: 

64-128GB ECC DDR4 3200MHZ

GPU:

7900 XTX

PSU:

CORSAIR - HX Series - HX1200 1200W 80 Plus Platinum Fully Modular ATX Power Supply - Black $269.73 / Mar 11, 2022




Wisteria (Workstation)



CPU:

AMD - Ryzen 9 5950X 4th Gen 16-core, 32-threads $546.67 / Dec 23, 2022 Bestbuy

RAM:

64GB DDR4 (ECC) 3200MHZ
NEMIX (2X32GB) PC4-25600 2Rx8 1.2V CL22 288-PIN ECC
$402.60 / February 5, 2022 Amazon

GPU

3080 TI

GPU

1080 TI

PSU:

CORSAIR - RMe Series RM750e 80 PLUS Gold Fully Modular Low-Noise ATX 3.0 and PCIE 5.0 Power Supply PSU - Black $110.29 / Apr 16, 2023 Bestbuy

Keyboard (Main Wokstation Keyboard)

Corsair K95 RGB PLATINUM Cherry MX Speed CH-9127014-NA Wired Keyboard

$55.04 / Aug 11, 2024

image.png

Keyboard (USB Passthru to Glycenia)

Corsair K95 RGB lights Platinum Mechanical Keyboard Cherry MX Brown Switch iCUE

$88.07 / Aug 16, 2024






WaterLily







LeafBlower







 






Misc Lab



HBA Cables:

EMC Amphenol Mini-SAS SFF-8088 to SFF-8088 Molex 2 Meter Cable Black 038-003-787

$11.01 / May 23, 2024

image.png


2 Packs Internal Mini SAS Cable 36Pin SFF-8087 to SFF-8087 100Ohms 0.5 ~1 Meter

$19.44 / May 23, 2024

image.png


External SAS Cable QSFP SFF-8436 to SFF-8088 SAS Cable For NetApp DS4243 DS4246

$30.71 / Jun 08, 2024

image.png

HBA Adapter

Dual Ports Mini SAS SFF-8088 to SAS 36Pin SFF-8087 PCBA Adapter w/ PCI bracket

$28.60 / May 23, 2024

image.png

JBOD Powerboard for CSEXXX

Control Board CSE-PTJBOD-CB2 Power board for JBOD

$52.85 / May 23, 2024

image.png

Rails

2 x iStarUSA Sliding Rail Kit TC-RAIL-26, 26" sliding rails

$75.13 / Aug 11, 2024

image.png

Brackets:

HEIGHT BRACKET FACE PLATE for PE310G4SPI9L

$5.91 / Oct 27, 2024

image.png


Full height bracket for PM1725B PM1725A PM1735 983ZET PCIe SSD

$6.61 / Nov 26, 2024

image.png

HDD/SSD Caddy

SuperMicro SB16105 2.5" SAS/SATA Server Hard Drive Caddy/Trays

$10.13 / Dec 23, 2024

image.png


LOT of 10 SUPERMICRO 3.5" DRIVE TRAY CADDY CAGE

$32.97 / Dec 30, 2024

image.png

Some old photos I found on disk

20240729_073735.jpg

20240722_221448.jpg

20240716_171234.jpg

20240815_144044.jpg

20240729_073756.jpg

Homelab History

Dual System Workstation/Gaming Build: Write Up

I had a really extensive write up of my desktop setup detailing how I use the DisplayDriver wrapper I integrated into Sunshine and the hardware etc. I am offering this as a place holder while I am slowly rebuilding my lab after recovering from a Ceph nightmare (my fault) (I was still learning). I just want to make sure no more people reach dead links and at least know what happened. This is kind of a first world need and not necessary but I spent the last 20 minutes or so updating an adjacent dead link that documented a solution to an Ubuntu kernel issue. I will get back to this, it just may be awhile. I see your traffic my internet friends. You are valid and valuable to me I am sorry in the meantime!