Compare commits
9 Commits
main
...
394d5200ad
| Author | SHA1 | Date | |
|---|---|---|---|
| 394d5200ad | |||
| 1790aa771a | |||
| 34aadae03a | |||
| 29333fbe0a | |||
| afae561e7e | |||
| 6e67c2b0b1 | |||
| 01981e0610 | |||
| a689d8203a | |||
|
|
64df4b8cfb |
89
03-opensource/alternatives/freshrss.md
Normal file
89
03-opensource/alternatives/freshrss.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# FreshRSS — Self-Hosted RSS Reader
|
||||
|
||||
## Problem
|
||||
|
||||
RSS is the best way to follow websites, blogs, and podcasts without algorithmic feeds, engagement bait, or data harvesting. But hosted RSS services like Feedly gate features behind subscriptions and still have access to your reading habits. Google killed Google Reader in 2013 and has been trying to kill RSS ever since.
|
||||
|
||||
## Solution
|
||||
|
||||
[FreshRSS](https://freshrss.org) is a self-hosted RSS aggregator. It fetches and stores your feeds on your own server, presents a clean reading interface, and syncs with mobile apps via standard APIs (Fever, Google Reader, Nextcloud News). No subscription, no tracking, no feed limits.
|
||||
|
||||
---
|
||||
|
||||
## Deployment (Docker)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
freshrss:
|
||||
image: freshrss/freshrss:latest
|
||||
container_name: freshrss
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8086:80"
|
||||
volumes:
|
||||
- ./freshrss/data:/var/www/FreshRSS/data
|
||||
- ./freshrss/extensions:/var/www/FreshRSS/extensions
|
||||
environment:
|
||||
- TZ=America/New_York
|
||||
- CRON_MIN=*/15 # fetch feeds every 15 minutes
|
||||
```
|
||||
|
||||
### Caddy reverse proxy
|
||||
|
||||
```
|
||||
rss.yourdomain.com {
|
||||
reverse_proxy localhost:8086
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Initial Setup
|
||||
|
||||
1. Browse to your FreshRSS URL and run through the setup wizard
|
||||
2. Create an admin account
|
||||
3. Go to **Settings → Authentication** — enable API access if you want mobile app sync
|
||||
4. Start adding feeds under **Subscriptions → Add a feed**
|
||||
|
||||
---
|
||||
|
||||
## Mobile App Sync
|
||||
|
||||
FreshRSS exposes a Google Reader-compatible API that most RSS apps support:
|
||||
|
||||
| App | Platform | Protocol |
|
||||
|---|---|---|
|
||||
| NetNewsWire | iOS / macOS | Fever or GReader |
|
||||
| Reeder | iOS / macOS | GReader |
|
||||
| ReadYou | Android | GReader |
|
||||
| FeedMe | Android | GReader / Fever |
|
||||
|
||||
**API URL format:** `https://rss.yourdomain.com/api/greader.php`
|
||||
|
||||
Enable the API in FreshRSS: **Settings → Authentication → Allow API access**
|
||||
|
||||
---
|
||||
|
||||
## Feed Auto-Refresh
|
||||
|
||||
The `CRON_MIN=*/15` environment variable runs feed fetching every 15 minutes inside the container. For more control, add a host-level cron job:
|
||||
|
||||
```bash
|
||||
# Fetch all feeds every 10 minutes
|
||||
*/10 * * * * docker exec freshrss php /var/www/FreshRSS/app/actualize_script.php
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Why RSS Over Social Media
|
||||
|
||||
- **You control the feed** — no algorithm decides what you see or in what order
|
||||
- **No engagement optimization** — content ranked by publish date, not outrage potential
|
||||
- **Portable** — OPML export lets you move your subscriptions to any reader
|
||||
- **Works forever** — RSS has been around since 1999 and isn't going anywhere
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#freshrss #rss #self-hosting #docker #linux #alternatives #privacy
|
||||
95
03-opensource/alternatives/gitea.md
Normal file
95
03-opensource/alternatives/gitea.md
Normal file
@@ -0,0 +1,95 @@
|
||||
# Gitea — Self-Hosted Git
|
||||
|
||||
## Problem
|
||||
|
||||
GitHub is the default home for code, but it's a Microsoft-owned centralized service. Your repositories, commit history, issues, and CI/CD pipelines are all under someone else's control. For personal projects and private infrastructure, there's no reason to depend on it.
|
||||
|
||||
## Solution
|
||||
|
||||
[Gitea](https://gitea.com) is a lightweight, self-hosted Git service. It provides the full GitHub-style workflow — repositories, branches, pull requests, webhooks, and a web UI — in a single binary or Docker container that runs comfortably on low-spec hardware.
|
||||
|
||||
---
|
||||
|
||||
## Deployment (Docker)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
gitea:
|
||||
image: docker.gitea.com/gitea:latest
|
||||
container_name: gitea
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3002:3000"
|
||||
- "222:22" # SSH git access
|
||||
volumes:
|
||||
- ./gitea:/data
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- GITEA__database__DB_TYPE=sqlite3
|
||||
```
|
||||
|
||||
SQLite is fine for personal use. For team use, swap in PostgreSQL or MySQL.
|
||||
|
||||
### Caddy reverse proxy
|
||||
|
||||
```
|
||||
git.yourdomain.com {
|
||||
reverse_proxy localhost:3002
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Initial Setup
|
||||
|
||||
1. Browse to your Gitea URL — the first-run wizard handles configuration
|
||||
2. Set the server URL to your public domain
|
||||
3. Create an admin account
|
||||
4. Configure SSH access if you want `git@git.yourdomain.com` cloning
|
||||
|
||||
---
|
||||
|
||||
## Webhooks
|
||||
|
||||
Gitea's webhook system is how automated pipelines get triggered on push. Example use case — auto-deploy a MkDocs wiki on every push:
|
||||
|
||||
1. Go to repo → **Settings → Webhooks → Add Webhook**
|
||||
2. Set the payload URL to your webhook endpoint (e.g. `https://notes.yourdomain.com/webhook`)
|
||||
3. Set content type to `application/json`
|
||||
4. Select **Push events**
|
||||
|
||||
The webhook fires on every `git push`, allowing the receiving server to pull and rebuild automatically. See [MajorWiki Setup & Pipeline](../../05-troubleshooting/majwiki-setup-and-pipeline.md) for a complete example.
|
||||
|
||||
---
|
||||
|
||||
## Migrating from GitHub
|
||||
|
||||
Gitea can mirror GitHub repos and import them directly:
|
||||
|
||||
```bash
|
||||
# Clone from GitHub, push to Gitea
|
||||
git clone --mirror https://github.com/user/repo.git
|
||||
cd repo.git
|
||||
git remote set-url origin https://git.yourdomain.com/user/repo.git
|
||||
git push --mirror
|
||||
```
|
||||
|
||||
Or use the Gitea web UI: **+ → New Migration → GitHub**
|
||||
|
||||
---
|
||||
|
||||
## Why Not Just Use GitHub?
|
||||
|
||||
For public open source — GitHub is fine, the network effects are real. For private infrastructure code, personal projects, and anything you'd rather not hand to Microsoft:
|
||||
|
||||
- Full control over your data and access
|
||||
- No rate limits, no storage quotas on your own hardware
|
||||
- Webhooks and integrations without paying for GitHub Actions minutes
|
||||
- Works entirely over Tailscale — no public exposure required
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#gitea #git #self-hosting #docker #linux #alternatives #vcs
|
||||
88
03-opensource/alternatives/searxng.md
Normal file
88
03-opensource/alternatives/searxng.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# SearXNG — Private Self-Hosted Search
|
||||
|
||||
## Problem
|
||||
|
||||
Every search query sent to Google, Bing, or DuckDuckGo is logged, profiled, and used to build an advertising model of you. Even "private" search engines are still third-party services with their own data retention policies.
|
||||
|
||||
## Solution
|
||||
|
||||
[SearXNG](https://github.com/searxng/searxng) is a self-hosted metasearch engine. It queries multiple search engines simultaneously on your behalf — without sending any identifying information — and aggregates the results. The search engines see a request from your server, not from you.
|
||||
|
||||
Your queries stay on your infrastructure.
|
||||
|
||||
---
|
||||
|
||||
## Deployment (Docker)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
searxng:
|
||||
image: searxng/searxng:latest
|
||||
container_name: searxng
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8090:8080"
|
||||
volumes:
|
||||
- ./searxng:/etc/searxng
|
||||
environment:
|
||||
- SEARXNG_BASE_URL=https://search.yourdomain.com/
|
||||
```
|
||||
|
||||
SearXNG requires a `settings.yml` in the mounted config directory. Generate one from the default:
|
||||
|
||||
```bash
|
||||
docker run --rm searxng/searxng cat /etc/searxng/settings.yml > ./searxng/settings.yml
|
||||
```
|
||||
|
||||
Key settings to configure in `settings.yml`:
|
||||
|
||||
```yaml
|
||||
server:
|
||||
secret_key: "generate-a-random-string-here"
|
||||
bind_address: "0.0.0.0"
|
||||
|
||||
search:
|
||||
safe_search: 0
|
||||
default_lang: "en"
|
||||
|
||||
engines:
|
||||
# Enable/disable specific engines here
|
||||
```
|
||||
|
||||
### Caddy reverse proxy
|
||||
|
||||
```
|
||||
search.yourdomain.com {
|
||||
reverse_proxy localhost:8090
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Using SearXNG as an AI Search Backend
|
||||
|
||||
SearXNG integrates directly with Open WebUI as a web search provider, giving your local AI access to current web results without any third-party API keys:
|
||||
|
||||
**Open WebUI → Settings → Web Search:**
|
||||
- Enable web search
|
||||
- Set provider to `searxng`
|
||||
- Set URL to `http://searxng:8080` (internal Docker network) or your Tailscale/local address
|
||||
|
||||
This is how MajorTwin gets current web context — queries go through SearXNG, not Google.
|
||||
|
||||
---
|
||||
|
||||
## Why Not DuckDuckGo?
|
||||
|
||||
DDG is better than Google for privacy, but it's still a centralized third-party service. SearXNG:
|
||||
|
||||
- Runs on your own hardware
|
||||
- Has no account, no cookies, no session tracking
|
||||
- Lets you choose which upstream engines to use and weight
|
||||
- Can be kept entirely off the public internet (Tailscale-only)
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#searxng #search #privacy #self-hosting #docker #linux #alternatives
|
||||
102
03-opensource/dev-tools/rsync.md
Normal file
102
03-opensource/dev-tools/rsync.md
Normal file
@@ -0,0 +1,102 @@
|
||||
# rsync — Fast, Resumable File Transfers
|
||||
|
||||
## Problem
|
||||
|
||||
Copying large files or directory trees between drives or servers is slow, fragile, and unresumable with `cp`. A dropped connection or a single error means starting over. You also want to skip files that already exist at the destination without re-copying them.
|
||||
|
||||
## Solution
|
||||
|
||||
`rsync` is a file synchronization tool that only transfers what has changed, preserves metadata, and can resume interrupted transfers. It works locally and over SSH.
|
||||
|
||||
### Installation (Fedora)
|
||||
|
||||
```bash
|
||||
sudo dnf install rsync
|
||||
```
|
||||
|
||||
### Basic Local Copy
|
||||
|
||||
```bash
|
||||
rsync -av /source/ /destination/
|
||||
```
|
||||
|
||||
- `-a` — archive mode: preserves permissions, timestamps, symlinks, ownership
|
||||
- `-v` — verbose: shows what's being transferred
|
||||
|
||||
**Trailing slash on source matters:**
|
||||
- `/source/` — copy the *contents* of source into destination
|
||||
- `/source` — copy the source *directory itself* into destination
|
||||
|
||||
### Resume an Interrupted Transfer
|
||||
|
||||
```bash
|
||||
rsync -av --partial --progress /source/ /destination/
|
||||
```
|
||||
|
||||
- `--partial` — keeps partially transferred files so they can be resumed
|
||||
- `--progress` — shows per-file progress and speed
|
||||
|
||||
### Skip Already-Transferred Files
|
||||
|
||||
```bash
|
||||
rsync -av --ignore-existing /source/ /destination/
|
||||
```
|
||||
|
||||
Useful when restarting a migration — skips anything already at the destination regardless of timestamp comparison.
|
||||
|
||||
### Dry Run First
|
||||
|
||||
Always preview what rsync will do before committing:
|
||||
|
||||
```bash
|
||||
rsync -av --dry-run /source/ /destination/
|
||||
```
|
||||
|
||||
No files are moved. Output shows exactly what would happen.
|
||||
|
||||
### Transfer Over SSH
|
||||
|
||||
```bash
|
||||
rsync -av -e ssh /source/ user@remotehost:/destination/
|
||||
```
|
||||
|
||||
Or with a non-standard port:
|
||||
|
||||
```bash
|
||||
rsync -av -e "ssh -p 2222" /source/ user@remotehost:/destination/
|
||||
```
|
||||
|
||||
### Exclude Patterns
|
||||
|
||||
```bash
|
||||
rsync -av --exclude='*.tmp' --exclude='.Trash*' /source/ /destination/
|
||||
```
|
||||
|
||||
### Real-World Use
|
||||
|
||||
Migrating ~286 files from `/majorRAID` to `/majorstorage` during a RAID dissolution project:
|
||||
|
||||
```bash
|
||||
rsync -av --partial --progress --ignore-existing \
|
||||
/majorRAID/ /majorstorage/ \
|
||||
2>&1 | tee /root/raid_migrate.log
|
||||
```
|
||||
|
||||
Run inside a `tmux` or `screen` session so it survives SSH disconnects:
|
||||
|
||||
```bash
|
||||
tmux new-session -d -s rsync-migrate \
|
||||
"rsync -av --partial --progress /majorRAID/ /majorstorage/ | tee /root/raid_migrate.log"
|
||||
```
|
||||
|
||||
### Check Progress on a Running Transfer
|
||||
|
||||
```bash
|
||||
tail -f /root/raid_migrate.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#rsync #linux #storage #file-transfer #sysadmin #dev-tools
|
||||
76
03-opensource/dev-tools/screen.md
Normal file
76
03-opensource/dev-tools/screen.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# screen — Simple Persistent Terminal Sessions
|
||||
|
||||
## Problem
|
||||
|
||||
Same problem as tmux: SSH sessions die, jobs get killed, long-running tasks need to survive disconnects. screen is the older, simpler alternative to tmux — universally available and gets the job done with minimal setup.
|
||||
|
||||
## Solution
|
||||
|
||||
`screen` creates detachable terminal sessions. It's installed by default on many systems, making it useful when tmux isn't available.
|
||||
|
||||
### Installation (Fedora)
|
||||
|
||||
```bash
|
||||
sudo dnf install screen
|
||||
```
|
||||
|
||||
### Core Workflow
|
||||
|
||||
```bash
|
||||
# Start a named session
|
||||
screen -S mysession
|
||||
|
||||
# Detach (keeps running)
|
||||
Ctrl+a, d
|
||||
|
||||
# List sessions
|
||||
screen -list
|
||||
|
||||
# Reattach
|
||||
screen -r mysession
|
||||
|
||||
# If session shows as "Attached" (stuck)
|
||||
screen -d -r mysession
|
||||
```
|
||||
|
||||
### Start a Background Job Directly
|
||||
|
||||
```bash
|
||||
screen -dmS mysession bash -c "long-running-command 2>&1 | tee /root/output.log"
|
||||
```
|
||||
|
||||
- `-d` — start detached
|
||||
- `-m` — create new session even if already inside screen
|
||||
- `-S` — name the session
|
||||
|
||||
### Capture Current Output Without Attaching
|
||||
|
||||
```bash
|
||||
screen -S mysession -X hardcopy /tmp/screen_output.txt
|
||||
cat /tmp/screen_output.txt
|
||||
```
|
||||
|
||||
### Send a Command to a Running Session
|
||||
|
||||
```bash
|
||||
screen -S mysession -X stuff "tail -f /root/output.log\n"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## screen vs tmux
|
||||
|
||||
| Feature | screen | tmux |
|
||||
|---|---|---|
|
||||
| Availability | Installed by default on most systems | Usually needs installing |
|
||||
| Split panes | Basic (Ctrl+a, S) | Better (Ctrl+b, ") |
|
||||
| Scripting | Limited | More capable |
|
||||
| Config complexity | Simple | More options |
|
||||
|
||||
Use screen when it's already there or for quick throwaway sessions. Use tmux for anything more complex. See [tmux](tmux.md).
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#screen #terminal #linux #ssh #productivity #dev-tools
|
||||
93
03-opensource/dev-tools/tmux.md
Normal file
93
03-opensource/dev-tools/tmux.md
Normal file
@@ -0,0 +1,93 @@
|
||||
# tmux — Persistent Terminal Sessions
|
||||
|
||||
## Problem
|
||||
|
||||
SSH sessions die when your connection drops, your laptop closes, or you walk away. Long-running jobs — storage migrations, file scans, downloads — get killed mid-run. You need a way to detach from a session, come back later, and pick up exactly where you left off.
|
||||
|
||||
## Solution
|
||||
|
||||
`tmux` is a terminal multiplexer. It runs sessions that persist independently of your SSH connection. You can detach, disconnect, reconnect from a different machine, and reattach to find everything still running.
|
||||
|
||||
### Installation (Fedora)
|
||||
|
||||
```bash
|
||||
sudo dnf install tmux
|
||||
```
|
||||
|
||||
### Core Workflow
|
||||
|
||||
```bash
|
||||
# Start a named session
|
||||
tmux new-session -s mysession
|
||||
|
||||
# Detach from a session (keeps it running)
|
||||
Ctrl+b, d
|
||||
|
||||
# List running sessions
|
||||
tmux ls
|
||||
|
||||
# Reattach to a session
|
||||
tmux attach -t mysession
|
||||
|
||||
# Kill a session when done
|
||||
tmux kill-session -t mysession
|
||||
```
|
||||
|
||||
### Start a Background Job Directly
|
||||
|
||||
Skip the interactive session entirely — start a job in a new detached session in one command:
|
||||
|
||||
```bash
|
||||
tmux new-session -d -s rmlint2 "rmlint /majorstorage// /mnt/usb// /majorRAID 2>&1 | tee /majorRAID/rmlint_scan2.log"
|
||||
```
|
||||
|
||||
The job runs immediately in the background. Attach later to check progress:
|
||||
|
||||
```bash
|
||||
tmux attach -t rmlint2
|
||||
```
|
||||
|
||||
### Capture Output Without Attaching
|
||||
|
||||
Read the current state of a session without interrupting it:
|
||||
|
||||
```bash
|
||||
tmux capture-pane -t rmlint2 -p
|
||||
```
|
||||
|
||||
### Split Panes
|
||||
|
||||
Monitor multiple things in one terminal window:
|
||||
|
||||
```bash
|
||||
# Horizontal split (top/bottom)
|
||||
Ctrl+b, "
|
||||
|
||||
# Vertical split (left/right)
|
||||
Ctrl+b, %
|
||||
|
||||
# Switch between panes
|
||||
Ctrl+b, arrow keys
|
||||
```
|
||||
|
||||
### Real-World Use
|
||||
|
||||
On **majorhome**, all long-running storage operations run inside named tmux sessions so they survive SSH disconnects:
|
||||
|
||||
```bash
|
||||
tmux new-session -d -s rmlint2 "rmlint ..." # dedup scan
|
||||
tmux new-session -d -s rsync-migrate "rsync ..." # file migration
|
||||
tmux ls # check what's running
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## tmux vs screen
|
||||
|
||||
Both work. tmux has better split-pane support and scripting. screen is simpler and more universally installed. I use both — tmux for new jobs, screen for legacy ones. See the [screen](screen.md) article for reference.
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#tmux #terminal #linux #ssh #productivity #dev-tools
|
||||
@@ -2,14 +2,21 @@
|
||||
|
||||
A curated collection of my favorite open-source tools and privacy-respecting alternatives to mainstream software.
|
||||
|
||||
## 🔄 Alternatives
|
||||
- [SearXNG: Private Self-Hosted Search](alternatives/searxng.md)
|
||||
- [FreshRSS: Self-Hosted RSS Reader](alternatives/freshrss.md)
|
||||
- [Gitea: Self-Hosted Git](alternatives/gitea.md)
|
||||
|
||||
## 🚀 Productivity
|
||||
- [rmlint: Duplicate File Scanning](productivity/rmlint-duplicate-scanning.md)
|
||||
|
||||
## 🛠️ Development Tools
|
||||
- *Coming soon*
|
||||
- [tmux: Persistent Terminal Sessions](dev-tools/tmux.md)
|
||||
- [screen: Simple Persistent Sessions](dev-tools/screen.md)
|
||||
- [rsync: Fast, Resumable File Transfers](dev-tools/rsync.md)
|
||||
|
||||
## 🎨 Media & Creative
|
||||
- *Coming soon*
|
||||
- [yt-dlp: Video Downloading](media-creative/yt-dlp.md)
|
||||
|
||||
## 🔐 Privacy & Security
|
||||
- *Coming soon*
|
||||
- [Vaultwarden: Self-Hosted Password Manager](privacy-security/vaultwarden.md)
|
||||
|
||||
131
03-opensource/media-creative/yt-dlp.md
Normal file
131
03-opensource/media-creative/yt-dlp.md
Normal file
@@ -0,0 +1,131 @@
|
||||
# yt-dlp — Video Downloading
|
||||
|
||||
## What It Is
|
||||
|
||||
`yt-dlp` is a feature-rich command-line video downloader, forked from youtube-dl with active maintenance and significantly better performance. It supports YouTube, Twitch, and hundreds of other sites.
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
### Fedora
|
||||
```bash
|
||||
sudo dnf install yt-dlp
|
||||
# or latest via pip:
|
||||
sudo pip install yt-dlp --break-system-packages
|
||||
```
|
||||
|
||||
### Update
|
||||
```bash
|
||||
sudo pip install -U yt-dlp --break-system-packages
|
||||
# or if installed as standalone binary:
|
||||
yt-dlp -U
|
||||
```
|
||||
|
||||
Keep it current — YouTube pushes extractor changes frequently and old versions break.
|
||||
|
||||
---
|
||||
|
||||
## Basic Usage
|
||||
|
||||
```bash
|
||||
# Download a single video (best quality)
|
||||
yt-dlp https://www.youtube.com/watch?v=VIDEO_ID
|
||||
|
||||
# Download to a specific directory with title as filename
|
||||
yt-dlp -o "/path/to/output/%(title)s.%(ext)s" URL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Plex-Optimized Download
|
||||
|
||||
For Plex direct play, you want H.264 video in an MP4 container with embedded subtitles:
|
||||
|
||||
```bash
|
||||
yt-dlp -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio' \
|
||||
--merge-output-format mp4 \
|
||||
-o "/plex/plex/%(title)s.%(ext)s" \
|
||||
--write-auto-subs --embed-subs \
|
||||
URL
|
||||
```
|
||||
|
||||
- `-f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/...'` — prefer MP4 video + M4A audio; fall back to best available
|
||||
- `--merge-output-format mp4` — merge streams into MP4 container (requires ffmpeg)
|
||||
- `--write-auto-subs --embed-subs` — download auto-generated subtitles and bake them in
|
||||
|
||||
---
|
||||
|
||||
## Playlists and Channels
|
||||
|
||||
```bash
|
||||
# Download a full playlist
|
||||
yt-dlp -o "%(playlist_index)s - %(title)s.%(ext)s" PLAYLIST_URL
|
||||
|
||||
# Download only videos not already present
|
||||
yt-dlp --download-archive archive.txt PLAYLIST_URL
|
||||
```
|
||||
|
||||
`--download-archive` maintains a file of completed video IDs — re-running the command skips already-downloaded videos automatically.
|
||||
|
||||
---
|
||||
|
||||
## Format Selection
|
||||
|
||||
```bash
|
||||
# List all available formats for a video
|
||||
yt-dlp --list-formats URL
|
||||
|
||||
# Download best video + best audio, merge to mp4
|
||||
yt-dlp -f 'bestvideo+bestaudio' --merge-output-format mp4 URL
|
||||
|
||||
# Download audio only (MP3)
|
||||
yt-dlp -x --audio-format mp3 URL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Config File
|
||||
|
||||
Persist your preferred flags so you don't repeat them every command:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.config/yt-dlp
|
||||
cat > ~/.config/yt-dlp/config << 'EOF'
|
||||
-f bestvideo[ext=mp4]+bestaudio[ext=m4a]/bestvideo+bestaudio
|
||||
--merge-output-format mp4
|
||||
--write-auto-subs
|
||||
--embed-subs
|
||||
--remote-components ejs:github
|
||||
EOF
|
||||
```
|
||||
|
||||
After this, a bare `yt-dlp URL` uses all your preferred settings automatically.
|
||||
|
||||
---
|
||||
|
||||
## Running Long Downloads in the Background
|
||||
|
||||
For large downloads or playlists, run inside `screen` or `tmux` so they survive SSH disconnects:
|
||||
|
||||
```bash
|
||||
screen -dmS yt-download bash -c \
|
||||
"yt-dlp -o '/plex/plex/%(title)s.%(ext)s' PLAYLIST_URL 2>&1 | tee ~/yt-download.log"
|
||||
|
||||
# Check progress
|
||||
screen -r yt-download
|
||||
# or
|
||||
tail -f ~/yt-download.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
For YouTube JS challenge errors, missing formats, and n-challenge failures on Fedora — see [yt-dlp YouTube JS Challenge Fix](../../05-troubleshooting/yt-dlp-fedora-js-challenge.md).
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#yt-dlp #youtube #video #plex #linux #media #dev-tools
|
||||
95
03-opensource/privacy-security/vaultwarden.md
Normal file
95
03-opensource/privacy-security/vaultwarden.md
Normal file
@@ -0,0 +1,95 @@
|
||||
# Vaultwarden — Self-Hosted Password Manager
|
||||
|
||||
## Problem
|
||||
|
||||
Password managers are a necessity, but handing your credentials to a third-party cloud service is a trust problem. Bitwarden is open source and privacy-respecting, but if you're already running a homelab, there's no reason to depend on their servers.
|
||||
|
||||
## Solution
|
||||
|
||||
[Vaultwarden](https://github.com/dani-garcia/vaultwarden) is an unofficial, lightweight Bitwarden-compatible server written in Rust. It exposes the same API that all official Bitwarden clients speak — desktop apps, browser extensions, mobile apps — so you get the full Bitwarden UX pointed at your own hardware.
|
||||
|
||||
Your passwords never leave your network.
|
||||
|
||||
---
|
||||
|
||||
## Deployment (Docker + Caddy)
|
||||
|
||||
### docker-compose.yml
|
||||
|
||||
```yaml
|
||||
services:
|
||||
vaultwarden:
|
||||
image: vaultwarden/server:latest
|
||||
container_name: vaultwarden
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- DOMAIN=https://vault.yourdomain.com
|
||||
- SIGNUPS_ALLOWED=false # disable after creating your account
|
||||
volumes:
|
||||
- ./vw-data:/data
|
||||
ports:
|
||||
- "8080:80"
|
||||
```
|
||||
|
||||
Start it:
|
||||
|
||||
```bash
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
### Caddy reverse proxy
|
||||
|
||||
```
|
||||
vault.yourdomain.com {
|
||||
reverse_proxy localhost:8080
|
||||
}
|
||||
```
|
||||
|
||||
Caddy handles TLS automatically. No extra cert config needed.
|
||||
|
||||
---
|
||||
|
||||
## Initial Setup
|
||||
|
||||
1. Browse to `https://vault.yourdomain.com` and create your account
|
||||
2. Set `SIGNUPS_ALLOWED=false` in the compose file and restart the container
|
||||
3. Install any official Bitwarden client (browser extension, desktop, mobile)
|
||||
4. In the client, set the **Server URL** to `https://vault.yourdomain.com` before logging in
|
||||
|
||||
That's it. The client has no idea it's not talking to Bitwarden's servers.
|
||||
|
||||
---
|
||||
|
||||
## Access Model
|
||||
|
||||
On MajorInfrastructure, Vaultwarden runs on **majorlab** and is accessible:
|
||||
|
||||
- **Internally** — via Caddy on the local network
|
||||
- **Remotely** — via Tailscale; vault is reachable from any device on the tailnet without exposing it to the public internet
|
||||
|
||||
This means the Caddy vhost does not need to be publicly routable. You can choose to expose it publicly (Let's Encrypt works fine) or keep it Tailscale-only.
|
||||
|
||||
---
|
||||
|
||||
## Backup
|
||||
|
||||
Vaultwarden stores everything in a single SQLite database at `./vw-data/db.sqlite3`. Back it up like any file:
|
||||
|
||||
```bash
|
||||
# Simple copy (stop container first for consistency, or use sqlite backup mode)
|
||||
sqlite3 /path/to/vw-data/db.sqlite3 ".backup '/path/to/backup/vw-backup-$(date +%F).sqlite3'"
|
||||
```
|
||||
|
||||
Or include the `vw-data/` directory in your regular rsync backup run.
|
||||
|
||||
---
|
||||
|
||||
## Why Not Bitwarden (Official)?
|
||||
|
||||
The official Bitwarden server is also open source but requires significantly more resources (multiple services, SQL Server). Vaultwarden runs in a single container on minimal RAM and handles everything a personal or family vault needs.
|
||||
|
||||
---
|
||||
|
||||
## Tags
|
||||
|
||||
#vaultwarden #bitwarden #passwords #privacy #self-hosting #docker #linux
|
||||
@@ -31,7 +31,7 @@ DNS record and Caddy entry have been removed.
|
||||
|
||||
## Content
|
||||
|
||||
- 23 articles across 5 domains
|
||||
- 36 articles across 5 domains
|
||||
- Source of truth: `MajorVault/20-Projects/MajorTwin/08-Wiki/`
|
||||
- Deployed via Gitea webhook (push from MajorAir → auto-pull on majorlab)
|
||||
|
||||
@@ -78,4 +78,16 @@ git push
|
||||
|
||||
Gitea receives the push → fires webhook → majorlab pulls → MkDocs rebuilds → `notes.majorshouse.com` updates automatically.
|
||||
|
||||
## 📋 Wiki Maintenance Protocol
|
||||
|
||||
Every time a new article is added, the following **MUST** be updated to maintain index integrity:
|
||||
|
||||
1. **`SUMMARY.md`**: Add the article to the navigation tree.
|
||||
2. **Category Index**: Update the `index.md` within the specific domain folder (e.g., `05-troubleshooting/index.md`).
|
||||
3. **Main `index.md`**:
|
||||
- Update the **Article count**.
|
||||
- Add the article to the domain section.
|
||||
- Add the article to the **Recently Updated** table.
|
||||
4. **Root `README.md`**: Sync with the main `index.md` (Article count, domain lists, and Recently Updated).
|
||||
|
||||
> [!note] The rsync one-liner in the Update Workflow section above was a one-off during initial setup. It is no longer the canonical method.
|
||||
|
||||
62
README.md
62
README.md
@@ -2,18 +2,18 @@
|
||||
|
||||
> A growing reference of Linux, self-hosting, open source, streaming, and troubleshooting guides. Written by MajorLinux. Used by MajorTwin.
|
||||
>
|
||||
> **Last updated:** 2026-03-12
|
||||
> **Article count:** 22
|
||||
**Last updated:** 2026-03-13
|
||||
**Article count:** 36
|
||||
|
||||
## Domains
|
||||
|
||||
| Domain | Folder | Articles |
|
||||
|---|---|---|
|
||||
| 🐧 Linux & Sysadmin | `01-linux/` | 8 |
|
||||
| 🐧 Linux & Sysadmin | `01-linux/` | 9 |
|
||||
| 🏠 Self-Hosting & Homelab | `02-selfhosting/` | 8 |
|
||||
| 🔓 Open Source Tools | `03-opensource/` | 0 |
|
||||
| 🔓 Open Source Tools | `03-opensource/` | 9 |
|
||||
| 🎙️ Streaming & Podcasting | `04-streaming/` | 1 |
|
||||
| 🔧 General Troubleshooting | `05-troubleshooting/` | 5 |
|
||||
| 🔧 General Troubleshooting | `05-troubleshooting/` | 9 |
|
||||
|
||||
---
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
- [Ansible Getting Started](01-linux/shell-scripting/ansible-getting-started.md) — inventory, ad-hoc commands, playbooks, handlers, roles
|
||||
- [Bash Scripting Patterns](01-linux/shell-scripting/bash-scripting-patterns.md) — set -euo pipefail, logging, error handling, argument parsing, common patterns
|
||||
|
||||
### Storage
|
||||
- [SnapRAID & MergerFS Storage Setup](01-linux/storage/snapraid-mergerfs-setup.md) — Pooling mismatched drives and adding parity on Linux
|
||||
|
||||
### Distro-Specific
|
||||
- [Linux Distro Guide for Beginners](01-linux/distro-specific/linux-distro-guide-beginners.md) — Ubuntu recommendation, distro comparison, desktop environments
|
||||
- [WSL2 Instance Migration to Fedora 43](01-linux/distro-specific/wsl2-instance-migration-fedora43.md) — moving WSL2 VHDX from C: to another drive
|
||||
@@ -67,7 +70,24 @@
|
||||
|
||||
## 🔓 Open Source Tools
|
||||
|
||||
*(Articles coming)*
|
||||
### Alternatives
|
||||
- [SearXNG: Private Self-Hosted Search](03-opensource/alternatives/searxng.md) — metasearch engine that queries multiple engines without exposing your identity
|
||||
- [FreshRSS: Self-Hosted RSS Reader](03-opensource/alternatives/freshrss.md) — algorithm-free feed aggregator with mobile app sync
|
||||
- [Gitea: Self-Hosted Git](03-opensource/alternatives/gitea.md) — lightweight GitHub alternative, webhooks, single Docker container
|
||||
|
||||
### Productivity
|
||||
- [rmlint: Duplicate File Scanning](03-opensource/productivity/rmlint-duplicate-scanning.md) — extremely fast duplicate file finding and storage reclamation
|
||||
|
||||
### Development Tools
|
||||
- [tmux: Persistent Terminal Sessions](03-opensource/dev-tools/tmux.md) — detachable sessions for long-running jobs over SSH
|
||||
- [screen: Simple Persistent Sessions](03-opensource/dev-tools/screen.md) — lightweight terminal multiplexer, universally available
|
||||
- [rsync: Fast, Resumable File Transfers](03-opensource/dev-tools/rsync.md) — incremental file sync locally and over SSH, survives interruptions
|
||||
|
||||
### Privacy & Security
|
||||
- [Vaultwarden: Self-Hosted Password Manager](03-opensource/privacy-security/vaultwarden.md) — Bitwarden-compatible server in a single Docker container, passwords stay on your hardware
|
||||
|
||||
### Media & Creative
|
||||
- [yt-dlp: Video Downloading](03-opensource/media-creative/yt-dlp.md) — download from YouTube and hundreds of other sites, Plex-optimized format selection
|
||||
|
||||
---
|
||||
|
||||
@@ -80,10 +100,13 @@
|
||||
|
||||
## 🔧 General Troubleshooting
|
||||
|
||||
- [Apache Outage: Fail2ban Self-Ban + Missing iptables Rules](05-troubleshooting/networking/fail2ban-self-ban-apache-outage.md) — diagnosing and fixing Apache outages caused by missing firewall rules and Fail2ban self-bans
|
||||
- [Docker & Caddy Recovery After Reboot (Fedora + SELinux)](05-troubleshooting/docker-caddy-selinux-post-reboot-recovery.md) — fixing docker.socket, SELinux port blocks, and httpd_can_network_connect after reboot
|
||||
- [ISP SNI Filtering with Caddy](05-troubleshooting/isp-sni-filtering-caddy.md) — troubleshooting why wiki.majorshouse.com was blocked by Google Fiber
|
||||
- [Obsidian Cache Hang Recovery](05-troubleshooting/obsidian-cache-hang-recovery.md) — resolving "Loading cache" hang in Obsidian by cleaning Electron app data and ML artifacts
|
||||
- [yt-dlp JS Challenge Fix on Fedora](05-troubleshooting/yt-dlp-fedora-js-challenge.md) — fixing YouTube JS challenge solver errors and missing formats on Fedora
|
||||
- [Qwen2.5-14B OOM on RTX 3080 Ti (12GB)](05-troubleshooting/gpu-display/qwen-14b-oom-3080ti.md) — fixes and alternatives when hitting VRAM limits during fine-tuning
|
||||
- [yt-dlp YouTube JS Challenge Fix on Fedora](05-troubleshooting/yt-dlp-fedora-js-challenge.md) — fixing YouTube JS challenge solver errors and missing formats on Fedora
|
||||
- [Gemini CLI Manual Update](05-troubleshooting/gemini-cli-manual-update.md) — how to manually update the Gemini CLI when automatic updates fail
|
||||
- [MajorWiki Setup & Pipeline](05-troubleshooting/majwiki-setup-and-pipeline.md) — setting up MajorWiki and the Obsidian → Gitea → MkDocs publishing pipeline
|
||||
|
||||
---
|
||||
@@ -92,20 +115,15 @@
|
||||
|
||||
| Date | Article | Domain |
|
||||
|---|---|---|
|
||||
| 2026-03-12 | [Docker & Caddy Recovery After Reboot](05-troubleshooting/docker-caddy-selinux-post-reboot-recovery.md) | Troubleshooting |
|
||||
| 2026-03-11 | [MajorWiki Setup & Pipeline](05-troubleshooting/majwiki-setup-and-pipeline.md) | Troubleshooting |
|
||||
| 2026-03-11 | [Obsidian Cache Hang Recovery](05-troubleshooting/obsidian-cache-hang-recovery.md) | Troubleshooting |
|
||||
| 2026-03-11 | [yt-dlp JS Challenge Fix on Fedora](05-troubleshooting/yt-dlp-fedora-js-challenge.md) | Troubleshooting |
|
||||
| 2026-03-08 | [OBS Studio Setup & Encoding](04-streaming/obs/obs-studio-setup-encoding.md) | Streaming |
|
||||
| 2026-03-08 | [Linux File Permissions](01-linux/files-permissions/linux-file-permissions.md) | Linux |
|
||||
| 2026-03-08 | [rsync Backup Patterns](02-selfhosting/storage-backup/rsync-backup-patterns.md) | Self-Hosting |
|
||||
| 2026-03-08 | [Tailscale for Homelab Remote Access](02-selfhosting/dns-networking/tailscale-homelab-remote-access.md) | Self-Hosting |
|
||||
| 2026-03-08 | [Package Management Reference](01-linux/packages/package-management-reference.md) | Linux |
|
||||
| 2026-03-08 | [Bash Scripting Patterns](01-linux/shell-scripting/bash-scripting-patterns.md) | Linux |
|
||||
| 2026-03-08 | [Setting Up Caddy as a Reverse Proxy](02-selfhosting/reverse-proxy/setting-up-caddy-reverse-proxy.md) | Self-Hosting |
|
||||
| 2026-03-08 | [SSH Config & Key Management](01-linux/networking/ssh-config-key-management.md) | Linux |
|
||||
| 2026-03-08 | [Ansible Getting Started](01-linux/shell-scripting/ansible-getting-started.md) | Linux |
|
||||
| 2026-03-08 | [Self-Hosting Starter Guide](02-selfhosting/docker/self-hosting-starter-guide.md) | Self-Hosting |
|
||||
| 2026-03-14 | [SearXNG: Private Self-Hosted Search](03-opensource/alternatives/searxng.md) | Open Source |
|
||||
| 2026-03-14 | [FreshRSS: Self-Hosted RSS Reader](03-opensource/alternatives/freshrss.md) | Open Source |
|
||||
| 2026-03-14 | [Gitea: Self-Hosted Git](03-opensource/alternatives/gitea.md) | Open Source |
|
||||
| 2026-03-14 | [yt-dlp: Video Downloading](03-opensource/media-creative/yt-dlp.md) | Open Source |
|
||||
| 2026-03-13 | [Vaultwarden: Self-Hosted Password Manager](03-opensource/privacy-security/vaultwarden.md) | Open Source |
|
||||
| 2026-03-13 | [Gemini CLI Manual Update](05-troubleshooting/gemini-cli-manual-update.md) | Troubleshooting |
|
||||
| 2026-03-13 | [rmlint: Duplicate File Scanning](03-opensource/productivity/rmlint-duplicate-scanning.md) | Open Source |
|
||||
| 2026-03-13 | [SnapRAID & MergerFS Storage Setup](01-linux/storage/snapraid-mergerfs-setup.md) | Linux |
|
||||
| 2026-03-13 | [Qwen2.5-14B OOM on RTX 3080 Ti (12GB)](05-troubleshooting/gpu-display/qwen-14b-oom-3080ti.md) | Troubleshooting |
|
||||
|
||||
---
|
||||
|
||||
@@ -113,10 +131,8 @@
|
||||
|
||||
| Topic | Domain | Priority | From Gap? |
|
||||
|---|---|---|---|
|
||||
| KeePassXC self-hosted password management | Open Source | High | No |
|
||||
| Docker Compose networking deep dive | Self-Hosting | High | No |
|
||||
| Troubleshooting NVIDIA on Linux | Troubleshooting | Medium | No |
|
||||
| Pi-hole setup and local DNS | Self-Hosting | Medium | No |
|
||||
| OBS audio routing on Linux (PipeWire) | Streaming | Medium | No |
|
||||
| Nextcloud setup with Docker | Self-Hosting | Medium | No |
|
||||
| tmux basics | Linux | Low | No |
|
||||
|
||||
41
SUMMARY.md
41
SUMMARY.md
@@ -1,18 +1,41 @@
|
||||
* [Home](index.md)
|
||||
* [Linux & Sysadmin](01-linux/index.md)
|
||||
* [Storage: SnapRAID & MergerFS Setup](01-linux/storage/snapraid-mergerfs-setup.md)
|
||||
* [Self-Hosting](02-selfhosting/index.md)
|
||||
* [Introduction](02-selfhosting/index.md)
|
||||
* [Linux File Permissions](01-linux/files-permissions/linux-file-permissions.md)
|
||||
* [Managing Linux Services with systemd](01-linux/process-management/managing-linux-services-systemd-ansible.md)
|
||||
* [SSH Config & Key Management](01-linux/networking/ssh-config-key-management.md)
|
||||
* [Package Management Reference](01-linux/packages/package-management-reference.md)
|
||||
* [Ansible Getting Started](01-linux/shell-scripting/ansible-getting-started.md)
|
||||
* [Bash Scripting Patterns](01-linux/shell-scripting/bash-scripting-patterns.md)
|
||||
* [SnapRAID & MergerFS Storage Setup](01-linux/storage/snapraid-mergerfs-setup.md)
|
||||
* [Linux Distro Guide for Beginners](01-linux/distro-specific/linux-distro-guide-beginners.md)
|
||||
* [WSL2 Instance Migration to Fedora 43](01-linux/distro-specific/wsl2-instance-migration-fedora43.md)
|
||||
* [Self-Hosting & Homelab](02-selfhosting/index.md)
|
||||
* [Self-Hosting Starter Guide](02-selfhosting/docker/self-hosting-starter-guide.md)
|
||||
* [Docker vs VMs for the Homelab](02-selfhosting/docker/docker-vs-vms-homelab.md)
|
||||
* [Debugging Broken Docker Containers](02-selfhosting/docker/debugging-broken-docker-containers.md)
|
||||
* [Setting Up Caddy as a Reverse Proxy](02-selfhosting/reverse-proxy/setting-up-caddy-reverse-proxy.md)
|
||||
* [Tailscale for Homelab Remote Access](02-selfhosting/dns-networking/tailscale-homelab-remote-access.md)
|
||||
* [rsync Backup Patterns](02-selfhosting/storage-backup/rsync-backup-patterns.md)
|
||||
* [Tuning Netdata Web Log Alerts](02-selfhosting/monitoring/tuning-netdata-web-log-alerts.md)
|
||||
* [Linux Server Hardening Checklist](02-selfhosting/security/linux-server-hardening-checklist.md)
|
||||
* [Open Source & Alternatives](03-opensource/index.md)
|
||||
* [SearXNG: Private Self-Hosted Search](03-opensource/alternatives/searxng.md)
|
||||
* [FreshRSS: Self-Hosted RSS Reader](03-opensource/alternatives/freshrss.md)
|
||||
* [Gitea: Self-Hosted Git](03-opensource/alternatives/gitea.md)
|
||||
* [rmlint: Duplicate File Scanning](03-opensource/productivity/rmlint-duplicate-scanning.md)
|
||||
* [Streaming](04-streaming/index.md)
|
||||
* [Introduction](04-streaming/index.md)
|
||||
* [tmux: Persistent Terminal Sessions](03-opensource/dev-tools/tmux.md)
|
||||
* [screen: Simple Persistent Sessions](03-opensource/dev-tools/screen.md)
|
||||
* [rsync: Fast, Resumable File Transfers](03-opensource/dev-tools/rsync.md)
|
||||
* [Vaultwarden: Self-Hosted Password Manager](03-opensource/privacy-security/vaultwarden.md)
|
||||
* [yt-dlp: Video Downloading](03-opensource/media-creative/yt-dlp.md)
|
||||
* [Streaming & Podcasting](04-streaming/index.md)
|
||||
* [OBS Studio Setup & Encoding](04-streaming/obs/obs-studio-setup-encoding.md)
|
||||
* [Troubleshooting](05-troubleshooting/index.md)
|
||||
* [ISP SNI Filtering & Caddy](05-troubleshooting/isp-sni-filtering-caddy.md)
|
||||
* [yt-dlp YouTube JS Challenge Fix](05-troubleshooting/yt-dlp-fedora-js-challenge.md)
|
||||
* [Docker & Caddy Recovery After Reboot (Fedora + SELinux)](05-troubleshooting/docker-caddy-selinux-post-reboot-recovery.md)
|
||||
* [Apache Outage: Fail2ban Self-Ban + Missing iptables Rules](05-troubleshooting/networking/fail2ban-self-ban-apache-outage.md)
|
||||
* [Docker & Caddy Recovery After Reboot (Fedora + SELinux)](05-troubleshooting/docker-caddy-selinux-post-reboot-recovery.md)
|
||||
* [ISP SNI Filtering with Caddy](05-troubleshooting/isp-sni-filtering-caddy.md)
|
||||
* [Obsidian Vault Recovery — Loading Cache Hang](05-troubleshooting/obsidian-cache-hang-recovery.md)
|
||||
* [Gemini CLI Manual Update](05-troubleshooting/gemini-cli-manual-update.md)
|
||||
* [Qwen2.5-14B OOM on RTX 3080 Ti (12GB)](05-troubleshooting/gpu-display/qwen-14b-oom-3080ti.md)
|
||||
* [yt-dlp YouTube JS Challenge Fix on Fedora](05-troubleshooting/yt-dlp-fedora-js-challenge.md)
|
||||
* [Gemini CLI Manual Update](05-troubleshooting/gemini-cli-manual-update.md)
|
||||
* [MajorWiki Setup & Publishing Pipeline](05-troubleshooting/majwiki-setup-and-pipeline.md)
|
||||
|
||||
38
index.md
38
index.md
@@ -3,7 +3,7 @@
|
||||
> A growing reference of Linux, self-hosting, open source, streaming, and troubleshooting guides. Written by MajorLinux. Used by MajorTwin.
|
||||
>
|
||||
> **Last updated:** 2026-03-13
|
||||
> **Article count:** 27
|
||||
> **Article count:** 36
|
||||
|
||||
## Domains
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
|---|---|---|
|
||||
| 🐧 Linux & Sysadmin | `01-linux/` | 9 |
|
||||
| 🏠 Self-Hosting & Homelab | `02-selfhosting/` | 8 |
|
||||
| 🔓 Open Source Tools | `03-opensource/` | 1 |
|
||||
| 🔓 Open Source Tools | `03-opensource/` | 9 |
|
||||
| 🎙️ Streaming & Podcasting | `04-streaming/` | 1 |
|
||||
| 🔧 General Troubleshooting | `05-troubleshooting/` | 8 |
|
||||
| 🔧 General Troubleshooting | `05-troubleshooting/` | 9 |
|
||||
|
||||
---
|
||||
|
||||
@@ -70,9 +70,25 @@
|
||||
|
||||
## 🔓 Open Source Tools
|
||||
|
||||
### Alternatives
|
||||
- [SearXNG: Private Self-Hosted Search](03-opensource/alternatives/searxng.md) — metasearch engine that queries multiple engines without exposing your identity
|
||||
- [FreshRSS: Self-Hosted RSS Reader](03-opensource/alternatives/freshrss.md) — algorithm-free feed aggregator with mobile app sync
|
||||
- [Gitea: Self-Hosted Git](03-opensource/alternatives/gitea.md) — lightweight GitHub alternative, webhooks, single Docker container
|
||||
|
||||
### Productivity
|
||||
- [rmlint: Duplicate File Scanning](03-opensource/productivity/rmlint-duplicate-scanning.md) — extremely fast duplicate file finding and storage reclamation
|
||||
|
||||
### Development Tools
|
||||
- [tmux: Persistent Terminal Sessions](03-opensource/dev-tools/tmux.md) — detachable sessions for long-running jobs over SSH
|
||||
- [screen: Simple Persistent Sessions](03-opensource/dev-tools/screen.md) — lightweight terminal multiplexer, universally available
|
||||
- [rsync: Fast, Resumable File Transfers](03-opensource/dev-tools/rsync.md) — incremental file sync locally and over SSH, survives interruptions
|
||||
|
||||
### Privacy & Security
|
||||
- [Vaultwarden: Self-Hosted Password Manager](03-opensource/privacy-security/vaultwarden.md) — Bitwarden-compatible server in a single Docker container, passwords stay on your hardware
|
||||
|
||||
### Media & Creative
|
||||
- [yt-dlp: Video Downloading](03-opensource/media-creative/yt-dlp.md) — download from YouTube and hundreds of other sites, Plex-optimized format selection
|
||||
|
||||
---
|
||||
|
||||
## 🎙️ Streaming & Podcasting
|
||||
@@ -89,7 +105,8 @@
|
||||
- [ISP SNI Filtering with Caddy](05-troubleshooting/isp-sni-filtering-caddy.md) — troubleshooting why wiki.majorshouse.com was blocked by Google Fiber
|
||||
- [Obsidian Cache Hang Recovery](05-troubleshooting/obsidian-cache-hang-recovery.md) — resolving "Loading cache" hang in Obsidian by cleaning Electron app data and ML artifacts
|
||||
- [Qwen2.5-14B OOM on RTX 3080 Ti (12GB)](05-troubleshooting/gpu-display/qwen-14b-oom-3080ti.md) — fixes and alternatives when hitting VRAM limits during fine-tuning
|
||||
- [yt-dlp JS Challenge Fix on Fedora](05-troubleshooting/yt-dlp-fedora-js-challenge.md) — fixing YouTube JS challenge solver errors and missing formats on Fedora
|
||||
- [yt-dlp YouTube JS Challenge Fix on Fedora](05-troubleshooting/yt-dlp-fedora-js-challenge.md) — fixing YouTube JS challenge solver errors and missing formats on Fedora
|
||||
- [Gemini CLI Manual Update](05-troubleshooting/gemini-cli-manual-update.md) — how to manually update the Gemini CLI when automatic updates fail
|
||||
- [MajorWiki Setup & Pipeline](05-troubleshooting/majwiki-setup-and-pipeline.md) — setting up MajorWiki and the Obsidian → Gitea → MkDocs publishing pipeline
|
||||
|
||||
---
|
||||
@@ -98,14 +115,15 @@
|
||||
|
||||
| Date | Article | Domain |
|
||||
|---|---|---|
|
||||
| 2026-03-14 | [SearXNG: Private Self-Hosted Search](03-opensource/alternatives/searxng.md) | Open Source |
|
||||
| 2026-03-14 | [FreshRSS: Self-Hosted RSS Reader](03-opensource/alternatives/freshrss.md) | Open Source |
|
||||
| 2026-03-14 | [Gitea: Self-Hosted Git](03-opensource/alternatives/gitea.md) | Open Source |
|
||||
| 2026-03-14 | [yt-dlp: Video Downloading](03-opensource/media-creative/yt-dlp.md) | Open Source |
|
||||
| 2026-03-13 | [Vaultwarden: Self-Hosted Password Manager](03-opensource/privacy-security/vaultwarden.md) | Open Source |
|
||||
| 2026-03-13 | [Gemini CLI Manual Update](05-troubleshooting/gemini-cli-manual-update.md) | Troubleshooting |
|
||||
| 2026-03-13 | [rmlint: Duplicate File Scanning](03-opensource/productivity/rmlint-duplicate-scanning.md) | Open Source |
|
||||
| 2026-03-13 | [SnapRAID & MergerFS Storage Setup](01-linux/storage/snapraid-mergerfs-setup.md) | Linux |
|
||||
| 2026-03-13 | [Qwen2.5-14B OOM on RTX 3080 Ti (12GB)](05-troubleshooting/gpu-display/qwen-14b-oom-3080ti.md) | Troubleshooting |
|
||||
| 2026-03-13 | [Apache Outage: Fail2ban Self-Ban + Missing iptables Rules](05-troubleshooting/networking/fail2ban-self-ban-apache-outage.md) | Troubleshooting |
|
||||
| 2026-03-12 | [Docker & Caddy Recovery After Reboot](05-troubleshooting/docker-caddy-selinux-post-reboot-recovery.md) | Troubleshooting |
|
||||
| 2026-03-11 | [MajorWiki Setup & Pipeline](05-troubleshooting/majwiki-setup-and-pipeline.md) | Troubleshooting |
|
||||
| 2026-03-11 | [Obsidian Cache Hang Recovery](05-troubleshooting/obsidian-cache-hang-recovery.md) | Troubleshooting |
|
||||
| 2026-03-11 | [yt-dlp JS Challenge Fix on Fedora](05-troubleshooting/yt-dlp-fedora-js-challenge.md) | Troubleshooting |
|
||||
|
||||
---
|
||||
|
||||
@@ -113,9 +131,7 @@
|
||||
|
||||
| Topic | Domain | Priority | From Gap? |
|
||||
|---|---|---|---|
|
||||
| KeePassXC self-hosted password management | Open Source | High | No |
|
||||
| Docker Compose networking deep dive | Self-Hosting | High | No |
|
||||
| Troubleshooting NVIDIA on Linux | Troubleshooting | Medium | No |
|
||||
| Pi-hole setup and local DNS | Self-Hosting | Medium | No |
|
||||
| Nextcloud setup with Docker | Self-Hosting | Medium | No |
|
||||
| tmux basics | Linux | Low | No |
|
||||
|
||||
Reference in New Issue
Block a user