Remove em dashes from the remaining English content

This commit is contained in:
Djeex
2026-08-31 23:39:19 +02:00
parent 4090203dc4
commit 9abee89478
15 changed files with 37 additions and 37 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
---
title: Welcome
description: Introduction to Docudjeex a personal homelab documentation site covering self-hosted services, Debian, and Docker infrastructure.
description: Introduction to Docudjeex, a personal homelab documentation site covering self-hosted services, Debian, and Docker infrastructure.
navigation:
icon: i-lucide-home
hideHeader: true
+1 -1
View File
@@ -53,7 +53,7 @@ __Warning:__ If you have multiple services to expose like `subdomain1.mydomain.c
Every time a device connects to your local network, your router assigns it an IP address using DHCP rules.
This IP is randomly selected from a predefined pool.
At every device reboot, the IP may change which is problematic if you're forwarding ports, as the target IP may no longer be valid.
At every device reboot, the IP may change, which is problematic if you're forwarding ports, as the target IP may no longer be valid.
To avoid this, use your router's DHCP server to assign a static IP address.
+2 -2
View File
@@ -88,7 +88,7 @@ sudo chmod 2775 /video
```
### Create the user
Now add a no-login user this user cannot log into the server but can access Samba.
Now add a no-login user: this user cannot log into the server but can access Samba.
```bash [Terminal]
sudo useradd -M -s /sbin/nologin sambauser
@@ -126,7 +126,7 @@ sudo apt install cifs-utils
### Create the Mount Destination
We will create a folder on our local machine where the remote `/video` folder will be mounted e.g., `/mnt/video`.
We will create a folder on our local machine where the remote `/video` folder will be mounted, e.g. `/mnt/video`.
```bash [Terminal]
sudo mkdir /mnt/video
+3 -3
View File
@@ -45,14 +45,14 @@ ZFS continuously checks that your stored data hasn't become corrupted. Every blo
### Built-in RAID
ZFS includes its own volume management system (vdevs). You can build a zpool using multiple diskssimilar to traditional [RAID](/general/storage/raid) setupsbut with more flexibility. For example:
ZFS includes its own volume management system (vdevs). You can build a zpool using multiple disks, similar to traditional [RAID](/general/storage/raid) setups, but with more flexibility. For example:
- **Z-mirror** → equivalent to RAID 1
- **RAIDZ1** → equivalent to RAID 5 (tolerates 1 disk failure)
- **RAIDZ2** → equivalent to RAID 6 (tolerates 2 disk failures)
- **RAIDZ3** → tolerates up to 3 disk failures
ZFS handles all this nativelyno external RAID software needed.
ZFS handles all this natively: no external RAID software needed.
::note
@@ -61,7 +61,7 @@ Check out the [article on RAID](/general/storage/raid) to find the right solutio
### Snapshots and Clones
ZFS allows you to create snapshotsinstantaneous images of a dataset's state. Snapshots take up minimal space and can be scheduled frequently. You can also create clones: writable copies of snapshots.
ZFS allows you to create snapshots: instantaneous images of a dataset's state. Snapshots take up minimal space and can be scheduled frequently. You can also create clones: writable copies of snapshots.
### Compression and Deduplication
+5 -5
View File
@@ -11,9 +11,9 @@ description: Overview of networking hardware for homelabs. Switches, NICs, cable
A computer network cannot exist without the hardware required to build it. Hardware determines the size of the network, communication speeds, and its overall performance. In this article, we will focus on the simplest types of networks, typically found in home environments.
## The Router
The __router__ is the central hub of your network. It directs __packets__the blocks of data that travel across your networkfrom the sender to the appropriate recipient. It manages the routing of data both within your local network and to/from external networks. In short, it enables devices to communicate with each other and with the internet.
The __router__ is the central hub of your network. It directs __packets__ (the blocks of data that travel across your network) from the sender to the appropriate recipient. It manages the routing of data both within your local network and to/from external networks. In short, it enables devices to communicate with each other and with the internet.
Everyone has a router at homeit's the __internet box__ provided by your ISP (Internet Service Provider).
Everyone has a router at home: it's the __internet box__ provided by your ISP (Internet Service Provider).
In general, a router consists of:
@@ -23,9 +23,9 @@ In general, a router consists of:
A router may also include _firewall_ capabilities, allowing you to restrict traffic from specific devices, as well as _[NAT (Network Address Translation)](/general/networking/nat)_ for port forwarding. It generally includes a _[DHCP (Dynamic Host Configuration Protocol)](/general/networking/nat#dhcp)_ server to automatically assign _IP addresses_ to devices connected to the network.
The router directly affects communication speeds between devices. The WAN port limits the maximum internet speed you can receive from your ISP. For example, if your subscription offers 5 Gb/s, youll need a WAN port that supports at least 5 Gb/s. Likewise, internal device-to-device communication is limited by the speed of the switch. If your devices communicate at 5 Gb/s, the routers switch must have 5 Gb/s ports. If you're using WiFi 7 equipment and want to enjoy its full speed, your router must support it as well. If youre using a separate WiFi access point, make sure its network port matches or exceeds the speed of the WiFi it broadcastsand that the router supports it too.
The router directly affects communication speeds between devices. The WAN port limits the maximum internet speed you can receive from your ISP. For example, if your subscription offers 5 Gb/s, youll need a WAN port that supports at least 5 Gb/s. Likewise, internal device-to-device communication is limited by the speed of the switch. If your devices communicate at 5 Gb/s, the routers switch must have 5 Gb/s ports. If you're using WiFi 7 equipment and want to enjoy its full speed, your router must support it as well. If youre using a separate WiFi access point, make sure its network port matches or exceeds the speed of the WiFi it broadcasts, and that the router supports it too.
Internet speed, number of devices, WiFi speed, and internal network speedthese are the four key factors to consider when choosing an internet box or buying your own router.
Internet speed, number of devices, WiFi speed, and internal network speed: these are the four key factors to consider when choosing an internet box or buying your own router.
::tip{icon=""}
__Tip:__
@@ -117,5 +117,5 @@ These let you connect different types of cables to your SFP/SFP+ ports. Variants
::warning
__Warning:__ RJ45 transceivers consume a lot of energy due to copper signal loss and can generate significant heat. Low-power models (under 2W) exist and are generally rated for longer cables (e.g., 80m instead of 30m). Surprisingly, these are preferred over short-distance models because they generate less heat and consume less energymaking them more compatible with sensitive devices. Using the wrong type can cause network degradation or even outages.
__Warning:__ RJ45 transceivers consume a lot of energy due to copper signal loss and can generate significant heat. Low-power models (under 2W) exist and are generally rated for longer cables (e.g., 80m instead of 30m). Surprisingly, these are preferred over short-distance models because they generate less heat and consume less energy, making them more compatible with sensitive devices. Using the wrong type can cause network degradation or even outages.
::
+2 -2
View File
@@ -118,7 +118,7 @@ Then go to `http://yourserverip:3555` in your browser to access the login page.
More info on [Dockge and how to use it](https://github.com/louislam/dockge)
And there you go Docker and a tool to easily manage your containers are ready!
And there you go! Docker and a tool to easily manage your containers are ready!
## [Watchtower](https://watchtower.nickfedor.com/), to auto-update containers
Watchtower is a container that checks for updates and pulls new images automatically, just by adding a label in your containers `compose.yml` files.
@@ -176,4 +176,4 @@ labels:
- com.centurylinklabs.watchtower.enable=true
```
Then restart the modified stacks. And that's it — you now have a solid base to start deploying the services you want!
Then restart the modified stacks. And that's it! You now have a solid base to start deploying the services you want!
+6 -6
View File
@@ -21,7 +21,7 @@ description: Set up SWAG as a reverse proxy with automatic SSL, expose your serv
::warning
SWAG is only useful for exposing your services to the interneti.e., accessing them via a public URL like `https://service.mydomain.com`. If you dont want to expose your services and prefer to always use a VPN to connect remotely, you can go [here instead](/serveex/security/wireguard).
SWAG is only useful for exposing your services to the internet, i.e. accessing them via a public URL like `https://service.mydomain.com`. If you dont want to expose your services and prefer to always use a VPN to connect remotely, you can go [here instead](/serveex/security/wireguard).
::
Below is an example exposing Dockge. We will install SWAG along with the dbip mod for geolocation-based blocking, and the dashboard mod for managing swag, fail2ban, and geolocation.
@@ -127,7 +127,7 @@ Fill out the variables as follows:
| `DOMAIN` | Your domain (covers all subdomains too) | `mydomain.com` |
| `DOMAINS` | Any additional domains | `myseconddomain.com` |
| `EMAIL` | Your email for generating the certificate | `your@email.com` |
| `PLUGIN` | Plugin for certificate generationdepends on your [DNS provider](https://docs.linuxserver.io/general/swag/) | `ovh`<br>`cloudflare` |
| `PLUGIN` | Plugin for certificate generation, depends on your [DNS provider](https://docs.linuxserver.io/general/swag/) | `ovh`<br>`cloudflare` |
Assuming your DNS zone is managed by OVH, deploy the stack once. The logs will show a failure in creating the SSL certificate due to a missing `ovh.ini` configuration. Stop the stack.
@@ -189,7 +189,7 @@ On the left, you'll see a list of currently "proxied" services (none yet). On th
## DBIP
DBIP allows you to block connections based on countries. It relies on the configuration file named `dbip.conf` located in `/docker/swag/config/nginx`. [More info here](https://virtualize.link/secure/).
In this example, well configure it to block a list of countries known to be the source of most malicious traffic. Well also configure a variable to allow internal server traffic, your boxs local network, and a potential VPN in the 10.x.x.x range to access your services but not the open internet.
In this example, well configure it to block a list of countries known to be the source of most malicious traffic. Well also configure a variable to allow internal server traffic, your boxs local network, and a potential VPN in the 10.x.x.x range to access your services, but not the open internet.
This configuration can be enabled or disabled per service (see the Dockge example below).
@@ -277,14 +277,14 @@ server {
## Exposing Dockge
::note
📋 __Prerequisite:__ <br/><br/>
We assume that you have created a subdomain like `dockge.mydomain.com` in your [DNS zone](/general/networking/dns), with a `CNAME` pointing to `mydomain.com` and — unless you're using [Cloudflare Zero Trust](/serveex/security/cloudflare) — that you've forwarded port `443` from your router to the server's `443` in [your NAT rules](/general/networking/nat).
We assume that you have created a subdomain like `dockge.mydomain.com` in your [DNS zone](/general/networking/dns), with a `CNAME` pointing to `mydomain.com`. Unless you're using [Cloudflare Zero Trust](/serveex/security/cloudflare), we also assume you've forwarded port `443` from your router to the server's `443` in [your NAT rules](/general/networking/nat).
::
Now it's time to expose Dockge on the internet so you can access and manage your containers remotely. We assume you've set up the subdomain `dockge.mydomain.com` with a `CNAME` pointing to `mydomain.com`.
::warning
Dockge does not support multi-factor authentication. Exposing it online could compromise all connected machines. Only do this if you're using an MFA solution like [Authentik](/serveex/security/authentik/). Otherwise, dont expose it with SWAG — use a VPN like [Wireguard](/serveex/security/wireguard) instead.
Dockge does not support multi-factor authentication. Exposing it online could compromise all connected machines. Only do this if you're using an MFA solution like [Authentik](/serveex/advanced/authentik/). Otherwise, dont expose it with SWAG. Use a VPN like [Wireguard](/serveex/security/wireguard) instead.
::
Open the `dockge.subdomain.conf` file:
@@ -367,7 +367,7 @@ We assume the Dockge network is named `dockge_default`. You can verify the setup
Redeploy the SWAG stack.
Wait a moment, then visit `https://dockge.mydomain.com` in your browser — you should be redirected to Dockge. You can also check the service status from the dashboard (`http://yourserverip:81` on your local network).
Wait a moment, then visit `https://dockge.mydomain.com` in your browser. You should be redirected to Dockge. You can also check the service status from the dashboard (`http://yourserverip:81` on your local network).
## Exposing Another Service with SWAG
SWAG includes templates for most known services, named `servicename.subdomain.conf.sample`. Just create the subdomain in your registrar's DNS zone (like OVH), point it to your main domain via a CNAME, then copy and rename the sample file:
+1 -1
View File
@@ -1,6 +1,6 @@
---
title: Introduction
description: Introduction to Stockeex a personal project for stock and inventory management. Documentation coming soon.
description: Introduction to Stockeex, a personal project for stock and inventory management. Documentation coming soon.
navigation:
icon: i-lucide-bookmark
---
@@ -1,6 +1,6 @@
---
title: Nvidia Stock Bot
description: A Python bot that monitors GPU stock availability in real time and sends Discord alerts built during the RTX 5000 series launch shortage.
description: A Python bot that monitors GPU stock availability in real time and sends Discord alerts, built during the RTX 5000 series launch shortage.
---
@@ -11,7 +11,7 @@ For the past four years, the electronics hardware shortage has been relentless.
Four years later and with 5,000 members on the server, the RTX 5000 series is being released. Yet, no working stock bot seems to exist. Not to mention a certain “influencer” who charges users for access to a bot that doesnt even work. He manually copies alerts from other servers like ours, which have already solved the issue.
Anyway, eager to get an RTX 5090 for my AI-dedicated machine, I decided it was time to dive into Pythonwith a little help from ChatGPT. Along with another member, KevOut, who helped guide me through the APIs and initial architecture, I ended up building a clean and functional bot that sends different kinds of Discord alertsall deployable in a simple Docker container.
Anyway, eager to get an RTX 5090 for my AI-dedicated machine, I decided it was time to dive into Python, with a little help from ChatGPT. Along with another member, KevOut, who helped guide me through the APIs and initial architecture, I ended up building a clean and functional bot that sends different kinds of Discord alerts, all deployable in a simple Docker container.
After many setbacks, I went from this:
@@ -7,11 +7,11 @@ description: A Python script to sync AdGuard Home CIDR allowlists automatically,
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# 🤖 Adguard CIDRE Sync
Adguard Home is a fantastic solution for DNS-level ad blocking and rewriting requestsperfect for removing ISP DNS trackers or intrusive ads.
Adguard Home is a fantastic solution for DNS-level ad blocking and rewriting requests, perfect for removing ISP DNS trackers or intrusive ads.
It works great locally, but if you want all your devices (even on the go) to benefit, youll need to expose Adguard to the internet. Unfortunately, that means anyone can use it, potentially overloading your €1/month remote VPS.
Adguard allows whitelisting or blacklisting clients. The problem? To whitelist a client, you need their IPbut for mobile phones, that IP changes often. Instead of trying to whitelist ever-changing IPs, the better approach is to block broader IP ranges by region.
Adguard allows whitelisting or blacklisting clients. The problem? To whitelist a client, you need their IP, but for mobile phones, that IP changes often. Instead of trying to whitelist ever-changing IPs, the better approach is to block broader IP ranges by region.
CIDRE is a tool that syncs geo-targeted IP ranges with firewalls. Instead of running CIDRE with a full firewall stack on the remote server, I figured I could just import those regularly updated IP ranges into Adguards blocklist.
+5 -5
View File
@@ -1,6 +1,6 @@
---
title: Lumeex
description: Lumeex is a static photo gallery site generator built with Python minimalist, lightweight, and fully customizable without a CMS.
description: Lumeex is a static photo gallery site generator built with Python, minimalist, lightweight, and fully customizable without a CMS.
---
@@ -17,13 +17,13 @@ description: Lumeex is a static photo gallery site generator built with Python
---
Amateur photographer that I am, I spent several weeks looking for a framework with a photo gallery that could outshine Instagram. I wanted something that showcased the photos rather than the author, and that made every visit unique by loading the images in random orderwhile still allowing filtering and sorting by tag or combinations of tags.
Amateur photographer that I am, I spent several weeks looking for a framework with a photo gallery that could outshine Instagram. I wanted something that showcased the photos rather than the author, and that made every visit unique by loading the images in random order, while still allowing filtering and sorting by tag or combinations of tags.
In the end, I found nothing that did exactly what I wanted. And when something came close, it was always through heavy, bloated CMS platforms. So I decided to make a static site by hand, the old-school way, with Notepad++. Being fairly comfortable with HTML/CSS and a bit of JavaScript, I quickly came up with something nice during my vacation, between beach sessions. After all, a good craftsman should have good toolsand theres no better tool than one you make yourself.
In the end, I found nothing that did exactly what I wanted. And when something came close, it was always through heavy, bloated CMS platforms. So I decided to make a static site by hand, the old-school way, with Notepad++. Being fairly comfortable with HTML/CSS and a bit of JavaScript, I quickly came up with something nice during my vacation, between beach sessions. After all, a good craftsman should have good tools, and theres no better tool than one you make yourself.
Then I thought it might be a good idea to automate certain taskslike generating favicon formats, resizing and converting images, creating the gallery automatically instead of entering everything by hand, and generating `robots.txt` and `sitemap` files… so I turned back to Python.
Then I thought it might be a good idea to automate certain tasks, like generating favicon formats, resizing and converting images, creating the gallery automatically instead of entering everything by hand, and generating `robots.txt` and `sitemap` files… so I turned back to Python.
Eventually, after getting good results, I figured I might as well go all the way: build a complete framework for generating a static site photo gallery, where all you need to do is fill in your sites information in a config file and tweak the visuals a bitwithout touching the code.
Eventually, after getting good results, I figured I might as well go all the way: build a complete framework for generating a static site photo gallery, where all you need to do is fill in your sites information in a config file and tweak the visuals a bit, without touching the code.
Thats how **Lum[eex]{style="color: #1ad6ff"}** was born.
@@ -9,7 +9,7 @@ description: A bash script to detect and fix duplicate media files in Sonarr and
Six months after downloading terabytes of media, I realized that Sonarr and Radarr were copying them into my Plex library instead of creating hardlinks. This happens due to a counterintuitive mechanism: if you mount multiple folders in Sonarr/Radarr, it sees them as different filesystems and thus cannot create hardlinks. Thats why you should mount only one parent folder containing all child folders (like `downloads`, `movies`, `tvseries` inside a `media` parent folder).
So I restructured my directories, manually updated every path in Qbittorrent, Plex, and others. The last challenge was finding a way to detect existing duplicates, delete them, and automatically create hardlinks insteadto save space.
So I restructured my directories, manually updated every path in Qbittorrent, Plex, and others. The last challenge was finding a way to detect existing duplicates, delete them, and automatically create hardlinks instead, to save space.
My directory structure:
@@ -37,7 +37,7 @@ Yes, I asked ChatGPT and Qwen3 (which I host on a dedicated AI machine). Natural
In the end, I only needed to find `.mkv` files, and duplicates have the exact same name as the originals, which simplifies things a lot. A simple Bash script would do the job.
Spare you the endless Q&A with ChatGPTI was disappointed. Qwen3 was much cleaner. ChatGPT kept pushing awk-based solutions, which fail on paths with spaces. With Qwens help and dropping awk, the results improved significantly.
Spare you the endless Q&A with ChatGPT, I was disappointed. Qwen3 was much cleaner. ChatGPT kept pushing awk-based solutions, which fail on paths with spaces. With Qwens help and dropping awk, the results improved significantly.
To test, I first asked for a script that only lists and compares:
@@ -83,9 +83,9 @@ With `awk`, it wouldve stopped at `/media/seedbox/sonarr/Serie`. Im far fr
Once I verified the output, I asked for a complete script: compare, delete duplicates, create hardlinks.
Again, ChatGPT disappointed. Despite my requests, it created hardlinks *before* deleting the duplicateseffectively linking and then deleting the link (though the original is kept). Not helpful.
Again, ChatGPT disappointed. Despite my requests, it created hardlinks *before* deleting the duplicates, effectively linking and then deleting the link (though the original is kept). Not helpful.
Quick stopover to Qwen3, RTX 5090 in overdrive, and bammuch better result. Yes, it kept ChatGPT-style emojis, but here it is:
Quick stopover to Qwen3, RTX 5090 in overdrive, and bam, much better result. Yes, it kept ChatGPT-style emojis, but here it is:
```bash [Terminal]
#!/bin/bash
+1 -1
View File
@@ -33,7 +33,7 @@ The installer also lets you configure various parameters:
| `DISCORD_WEBHOOK` | Discord webhook URL for notifications | _Required_ |
It also runs another script that configures **logrotate** with the parameters defined above.
Finally, the installer can even be executed directly via a simple `curl` command followed by one last setup script perfect for the laziest of us.
Finally, the installer can even be executed directly via a simple `curl` command followed by one last setup script, perfect for the laziest of us.
I also had to handle several tricky cases: running as root without sudo, using sudo directly, running as a non-sudo user, missing dependencies, permission issues, file creation errors, disk data reading errors, and more.
@@ -1,6 +1,6 @@
---
title: Backrest Docker Stop
description: A bash script that stops Docker containers before a Backrest backup runs and restarts them after ensuring safe database backups without complex dumps.
description: A bash script that stops Docker containers before a Backrest backup runs and restarts them after, ensuring safe database backups without complex dumps.
---
+1 -1
View File
@@ -1,6 +1,6 @@
---
title: Home
description: Homelab documentation by Djeex self-hosting guides for Debian, Docker, networking, storage, and more.
description: Homelab documentation by Djeex, self-hosting guides for Debian, Docker, networking, storage, and more.
---
:ellipsis{right=0px width=75% blur=150px zIndex=60}