diff --git a/content/en/2.general/1.summary.md b/content/en/2.general/1.summary.md index b89c76e..c1bf297 100644 --- a/content/en/2.general/1.summary.md +++ b/content/en/2.general/1.summary.md @@ -66,3 +66,23 @@ Switches, NICs, and cabling A budget N100 home server build :: :: + +### Linux tips for dummies + +:::div{class="relative"} +:ellipsis{left=0px width=40rem top=10rem blur=140px} +::: + +::card-group +::card{icon="i-lucide-terminal" title="Command Line Basics" to="/general/linux/cli-basics"} +How a command is built, and the ones you'll actually use +:: + +::card{icon="i-lucide-folder-tree" title="Folders and Partitions" to="/general/linux/filesystem"} +What lives where on Debian, and the habits that keep it tidy +:: + +::card{icon="i-lucide-wrench" title="Handy CLI Tools" to="/general/linux/handy-tools"} +Terminal tools worth installing, and how to set them up +:: +:: diff --git a/content/en/2.general/5.linux/.navigation.yml b/content/en/2.general/5.linux/.navigation.yml new file mode 100644 index 0000000..fefbb06 --- /dev/null +++ b/content/en/2.general/5.linux/.navigation.yml @@ -0,0 +1,2 @@ +title: Linux tips for dummies +icon: i-lucide-terminal diff --git a/content/en/2.general/5.linux/1.cli-basics.md b/content/en/2.general/5.linux/1.cli-basics.md new file mode 100644 index 0000000..17da8fc --- /dev/null +++ b/content/en/2.general/5.linux/1.cli-basics.md @@ -0,0 +1,255 @@ +--- +title: Command line basics +description: Understand how a Linux command is built, learn the essential terminal commands, what their names mean, and get a cheat sheet to keep at hand. +--- + + +:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} + +A server has no desktop, no icons and no mouse. Everything happens in a terminal, and that black window with a blinking cursor is the single thing that puts people off self-hosting. It shouldn't: the terminal is just a conversation. You type one line, the machine does exactly that and answers. Nothing more magic than a search bar, except it does far more and never hides an option behind three menus. + +The good news is that you don't need to know a hundred commands. Ten of them cover almost everything you'll do on a home server, and they all follow the same pattern. Learn the pattern first, and every command you meet later becomes readable, even the ones you've never seen. + +## How a command is built + +Every command line, without exception, is the same sentence: **what to run**, **how to run it**, **what to run it on**. + +```text [Anatomy of a command] +sudo apt install -y nano +│ │ │ │ └─ argument: what the command works on +│ │ │ └──── option: changes how it behaves +│ │ └──────────── subcommand: what the program should do +│ └──────────────── the program you're running +└───────────────────── run it with administrator rights +``` + +Read out loud, that line says "as an administrator, ask the package manager to install the nano package, and don't ask me to confirm". Spaces are what separate the pieces, which is why a folder named `My Backups` has to be quoted (`cd "My Backups"`) or the shell reads it as two different things. + +### Options, short and long + +Options change how a command behaves. They come in two flavours, and most commands accept both: + +- **Short**, a single dash and a single letter: `ls -a`. They can be stacked, so `ls -l -a -h` is usually written `ls -lah`. +- **Long**, two dashes and a whole word: `ls --all`. Longer to type, but you can still tell what it does six months later, which is why they're the better choice in a script. + +Some options expect a value right after them: `ssh-keygen -t ed25519` (`-t` for type), `rsync --exclude @eaDir`. And case matters, always. In `ls`, `-r` reverses the sort order while `-R` walks into subfolders. Two different things, one letter apart. + +### Arguments and paths + +The argument is the target: a file, a folder, a package name, an address. Many commands accept several at once, separated by spaces, which is what makes the terminal fast: `rm file1.txt file2.txt file3.txt` deletes three files in one go. + +When the target is a place on the disk, you write it as a path, and there are a few shortcuts worth knowing: + +| Path | Means | +| --- | --- | +| `/` | the root of the whole system, everything lives under it | +| `~` | your own home folder, `/home/username` | +| `.` | the folder you're currently in | +| `..` | the folder just above | +| `/var/log` | an **absolute** path, same result from anywhere | +| `logs/today` | a **relative** path, understood from where you currently stand | + +Which folder holds what is a subject of its own, covered in [folders and partitions](/general/linux/filesystem). + +The prompt itself tells you where you are: in `username@serveex:~/docker$`, you're logged in as `username` on the machine named `serveex`, inside the `docker` folder of your home. That final `$` means a normal user. If it ever shows `#`, you're root and every typo counts double. + +### Getting help + +Two habits make you independent from tutorials. `command --help` prints a quick summary of every option, and `man command` opens the full manual (`man` for *manual*), which you leave by pressing :kbd{value="Q"}. + +::tip{icon=""} +✨ __Tip:__ three keyboard habits that change everything: :kbd{value="Tab"} completes the file or folder name you started typing, so you almost never type a full path; the :kbd{value="Up"} arrow brings back your previous commands, which saves retyping a long line for one character; and :kbd{value="Ctrl"} + :kbd{value="C"} stops whatever is currently running. +:: + +### Chaining commands + +Once the pattern clicks, commands can be plugged into each other: + +- `&&` runs the next one only if the previous one succeeded: `sudo apt update && sudo apt full-upgrade` +- `|`, the pipe, feeds the output of one command into another: `ls -l | grep backup` lists the folder, then keeps only the lines containing "backup" +- `>` writes the output into a file instead of the screen, and `>>` adds to the end of that file: `df -h > disk-report.txt` + +## The commands you'll actually use + +Most command names are abbreviations of an English phrase. Once you know what they stand for, they stop looking like keyboard noise. + +### pwd, print working directory + +Tells you where you are. It changes nothing, it just answers the question. + +```bash [Terminal] +pwd +``` + +```console [Output] +/home/username/docker +``` + +### ls, list + +Lists what's in the current folder. On its own it prints bare names, so it's almost always used with options: `-l` for the long format with sizes, dates and permissions, `-a` to also show hidden files (the ones starting with a dot), `-h` for sizes in K/M/G instead of raw bytes. + +```bash [Terminal] +ls -lah +``` + +```console [Output] +total 20K +drwxr-xr-x 4 username username 4.0K Sep 5 10:12 . +drwxr-xr-x 18 username username 4.0K Sep 4 21:03 .. +-rw-r--r-- 1 username username 512 Sep 5 10:12 .env +-rw-r--r-- 1 username username 1.2K Sep 5 09:58 compose.yaml +drwxr-xr-x 3 username username 4.0K Sep 2 18:44 immich +``` + +The first column is the permissions, `d` at the very start meaning it's a folder. Then the owner, the size, the date of the last change, and the name. + +### cd, change directory + +Moves you around. With a path it goes there, with `..` it goes up one level, and with nothing at all it takes you back home. + +```console [Terminal] +username@serveex:~/docker$ cd /var/log +username@serveex:/var/log$ cd .. +username@serveex:/$ cd +username@serveex:~$ +``` + +Notice the prompt following you around: it always shows where you currently stand, so you rarely need `pwd` in practice. + +### mkdir, make directory + +Creates a folder. Several at once if you list them, and `-p` creates the whole chain of parents in one shot, which is the version you'll actually use. + +```bash [Terminal] +mkdir backups +mkdir -p docker/immich/config +``` + +```console [Output] + +``` + +Nothing. That's not a bug, it's the rule: most commands say nothing when they succeed and only speak up when something goes wrong. Silence is good news, and `ls` confirms the folder is there. + +### cp and mv, copy and move + +`cp` copies, `mv` moves. Same shape both times: first the source, then the destination. Copying a folder needs `-r`, for *recursive*, since a folder means everything inside it too. `mv` doubles as the rename command, because renaming a file is just moving it to a new name. + +```bash [Terminal] +cp compose.yaml compose.yaml.bak +cp -r config/ config-backup/ +mv old-name.txt new-name.txt +ls +``` + +```console [Output] +compose.yaml compose.yaml.bak config config-backup new-name.txt +``` + +Three silent commands, and `ls` showing the result: the copy sits next to the original, the folder was duplicated, and `old-name.txt` is gone because moving it to another name is exactly what renaming means. + +### rm, remove + +Deletes. There is no recycle bin, no undo, no confirmation dialog. `-r` deletes a folder and its contents, `-f` forces without asking. + +::warning +`rm -rf` is the command that wipes homelabs. It doesn't check, doesn't warn, and doesn't stop. Read the path twice before pressing :kbd{value="Enter"}, especially when the line starts with `sudo` and contains a `/` or a `*`. +:: + +### cat and nano, read and edit + +`cat` (short for *concatenate*) dumps a whole file to the screen, perfect for a short config. For anything longer, `less` scrolls through it (named as a joke on `more`, the older pager it replaced), and you quit it with :kbd{value="Q"}. + +To actually change a file, `nano` opens a simple editor: arrows to move, :kbd{value="Ctrl"} + :kbd{value="O"} to save, :kbd{value="Ctrl"} + :kbd{value="X"} to leave. + +```bash [Terminal] +cat .env +``` + +```properties [Output] +PUID=1000 +PGID=1000 +TZ=Europe/Paris +``` + +### grep, search inside files + +`grep` stands for *global regular expression print*, which is a mouthful for "find me this text". You give it what to look for and where, and it prints every matching line. `-r` searches a whole folder, `-i` ignores upper and lower case, `-n` shows line numbers. + +```bash [Terminal] +grep -rin "password" /home/username/docker +``` + +```console [Output] +/home/username/docker/immich/.env:6:DB_PASSWORD=changeme +/home/username/docker/vaultwarden/compose.yaml:14: ADMIN_PASSWORD=hunter2 +``` + +Each line is the file, then the line number inside it, then the matching line itself. Very handy for the day you can't remember which stack holds a setting. + +### sudo, run as administrator + +*Substitute user do*. A normal user can't touch the system's files, which is exactly what protects you from wrecking the machine by accident. Prefixing a command with `sudo` runs that single command with administrator rights, and asks for your password the first time. + +```bash [Terminal] +nano /etc/ssh/sshd_config +``` + +```console [Output] +Error writing /etc/ssh/sshd_config: Permission denied +``` + +```bash [Terminal] +sudo nano /etc/ssh/sshd_config +``` + +```console [Output] +[sudo] password for username: +``` + +::note +If a command answers `Permission denied`, that's usually the whole problem: it needed `sudo`. Resist the reflex of putting `sudo` on everything though, a file created as root will keep annoying you afterwards because your normal user no longer owns it. +:: + +## Cheat sheet + +The ones worth keeping at hand, and where their names come from. + +| Command | Short for | What it does | +| --- | --- | --- | +| `pwd` | print working directory | Shows where you are | +| `ls` | list | Lists files and folders | +| `cd` | change directory | Moves you somewhere else | +| `mkdir` | make directory | Creates a folder | +| `touch` | plain English | Creates an empty file, or refreshes its date | +| `cp` | copy | Copies a file or folder | +| `mv` | move | Moves or renames | +| `rm` | remove | Deletes, permanently | +| `cat` | concatenate | Prints a file to the screen | +| `less` | a pun on `more` | Scrolls through a long file | +| `nano` | the editor replacing Pico | Edits a file | +| `grep` | global regular expression print | Searches for text | +| `find` | plain English | Searches for files by name, size or date | +| `man` | manual | Opens a command's full documentation | +| `df` | disk free | Shows free space per partition | +| `lsblk` | list block devices | Draws the tree of disks and partitions | +| `du` | disk usage | Shows what a folder weighs | +| `ps` | process status | Lists running processes | +| `htop` | Hisham's `top` | Live view of CPU, RAM and processes | +| `kill` | plain English | Stops a process by its number | +| `chmod` | change mode | Changes a file's permissions | +| `chown` | change owner | Changes who owns a file | +| `sudo` | substitute user do | Runs one command as administrator | +| `apt` | advanced package tool | Installs, updates and removes packages | +| `systemctl` | control systemd | Starts, stops and enables services | +| `ssh` | secure shell | Opens a session on a remote machine | +| `scp` | secure copy | Copies files over SSH | +| `tar` | tape archive | Packs and unpacks archives | +| `wget` | web get | Downloads a file from a URL | +| `curl` | client URL | Sends a request to a URL | +| `history` | plain English | Lists the commands you typed before | + +::tip{icon=""} +✨ __Tip:__ nobody memorises this. You'll look up the same three options for weeks, then one day realise you're typing them without thinking. Until then, `--help` and this table are perfectly legitimate. +:: diff --git a/content/en/2.general/5.linux/2.filesystem.md b/content/en/2.general/5.linux/2.filesystem.md new file mode 100644 index 0000000..5f37d6d --- /dev/null +++ b/content/en/2.general/5.linux/2.filesystem.md @@ -0,0 +1,59 @@ +--- +title: Folders and partitions +description: How the Debian filesystem is organised, what each top-level folder holds, how partitions differ from folders, and the habits that keep a server tidy. +--- + + +:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} + +Windows gives every disk its own letter. Linux doesn't: there is exactly one tree, it starts at `/`, and everything else hangs off it, including your other disks. A second drive isn't `D:`, it's *mounted* at a folder of the tree, `/mnt/data` for example, and from that point on it looks like any other folder. Odd at first, very practical afterwards, since a program never has to care which physical disk it's writing to. + +## The tree + +That tree isn't arbitrary either. Every Debian install has the same folders in the same places, which is why a tutorial written for someone else's server applies to yours. + +| Folder | What's in it | +| --- | --- | +| `/home` | Users' files. Yours is `/home/username`, also written `~` | +| `/root` | The root account's own home, not to be confused with `/` | +| `/etc` | System configuration, all of it plain text files | +| `/var` | Data that grows: logs in `/var/log`, Docker in `/var/lib/docker` | +| `/tmp` | Temporary files, emptied at every reboot | +| `/usr` | The installed programs themselves, managed by `apt` | +| `/opt` | Software installed outside the package manager | +| `/mnt` and `/media` | Where extra disks get mounted, `/media` for removable ones | +| `/boot` | The kernel and the bootloader, on a small partition of its own | +| `/dev` | Your hardware, exposed as files (`/dev/sda` is a disk) | +| `/proc` and `/sys` | The kernel's live state, invented on the fly, not real files | + +## Folders are not partitions + +Partitions are a different question from folders. A minimal Debian install typically creates two, one for `/` and one for swap, so every folder above except `/boot` lives on the same partition and shares the same free space. Two commands to see the reality of it: `lsblk` draws the tree of disks and partitions, `df -h` shows how full each one is. + +```bash [Terminal] +lsblk +``` + +```console [Output] +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS +sda 8:0 0 465.8G 0 disk +├─sda1 8:1 0 512M 0 part /boot/efi +├─sda2 8:2 0 461.3G 0 part / +└─sda3 8:3 0 4G 0 part [SWAP] +sdb 8:16 0 3.6T 0 disk +└─sdb1 8:17 0 3.6T 0 part /mnt/data +``` + +## A few habits worth taking + +- **Give your Docker stacks one home, and keep them there.** `/srv` is the folder the standard reserves for data served by the machine, which makes it the tidiest choice for compose files and their bind mounts. [Serveex](/serveex/introduction) puts everything in `/srv/docker`, one folder per stack. What matters is picking one place and staying there, rather than scattering half of them into your home folder. +- **Your own files go in your home.** Scripts in `~/bin`, notes, downloads, anything personal. `/root` is the root account's home, not a convenient place to drop things. +- **Never edit anything under `/usr` or `/bin` by hand.** `apt` owns those, and your changes disappear at the next upgrade. What you're allowed to configure lives in `/etc`. +- **In `/etc`, prefer a drop-in file over editing the main one.** Many services read every `.conf` in a `something.d/` folder next to their main config, `/etc/ssh/sshd_config.d/` for instance. Your file then survives a package upgrade that rewrites the original. +- **Mount data disks by UUID, not by `/dev/sdb`.** Device letters are assigned in the order the kernel finds the disks, so they can swap after a reboot or a new drive. `lsblk -f` gives you the UUID to put in `/etc/fstab`. +- **Keep an eye on `/var`.** Docker images, container logs and system logs all pile up there, on the same partition as the rest. `du -sh /var/lib/docker` tells you what the containers weigh, `df -h` whether you should worry. +- **Don't create your files with `sudo` when you don't have to.** A file created as root inside your home stays owned by root, and you'll be fighting permission errors over it for weeks. + +::note{to="/general/linux/cli-basics"} +Everything here assumes you can already move around a terminal. If `cd`, `ls` and `sudo` don't mean much yet, start with the **command line basics**. +:: diff --git a/content/en/2.general/5.linux/3.handy-tools.md b/content/en/2.general/5.linux/3.handy-tools.md new file mode 100644 index 0000000..11f9f75 --- /dev/null +++ b/content/en/2.general/5.linux/3.handy-tools.md @@ -0,0 +1,200 @@ +--- +title: Handy CLI tools +description: A handful of terminal tools worth installing on a home server, what each one replaces, and step-by-step instructions to install and use them. +--- + + +:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} + +A minimal Debian install ships with the strict minimum, which means the tools you get are the ones from 1995. They work, but reading `df` output or hunting for what filled a disk with `du` is needlessly painful when better versions exist and cost nothing to install. + +Everything below except the last one comes straight from Debian's repositories, so there's no third-party source to trust and `apt` keeps them updated along with the rest of the system. + +::note{to="/general/linux/cli-basics"} +Every command here is typed in a terminal over SSH. If `sudo`, `apt` and `cd` don't mean much yet, start with the **command line basics**. +:: + +## The short version + +| Tool | Replaces | What for | +| --- | --- | --- | +| `btop` | `top`, `htop` | Watching CPU, RAM and processes | +| `duf` | `df -h` | Free space, readable | +| `ncdu` | `du -sh` | Finding what filled the disk | +| `tldr` | `man` | The five commands you actually need | +| `lazydocker` | `docker ps` and friends | Managing containers over SSH | + +## The impatient version + +One line installs all the packaged ones, and each section below explains what you just got. + +```bash [Terminal] +sudo apt update +sudo apt install btop duf ncdu tealdeer +``` + +## btop, watching what the machine is doing + +The modern replacement for `top` and `htop`: CPU, RAM, disks, network and processes on one screen, with graphs, colors and a working mouse. This is what you open when something feels slow. + +::steps{level="4"} +#### Install it + +```bash [Terminal] +sudo apt install btop +``` + +#### Run it + +```bash [Terminal] +sudo btop +``` + +![btop showing CPU, memory, disks, network and processes](/img/global/linux/btop.png) + +Click a process to select it, :kbd{value="Esc"} opens the menu, :kbd{value="Q"} quits. The `+` and `-` keys fold and unfold the panels if the screen feels crowded. + +#### Done ! +:: + +## duf, disk space that reads like a table + +`df -h` prints every loop device Docker ever created and leaves you squinting at the columns. `duf` shows the same information grouped, aligned and colored, with a usage bar per filesystem. + +::steps{level="4"} +#### Install it + +```bash [Terminal] +sudo apt install duf +``` + +#### Run it + +```bash [Terminal] +sudo duf +``` + +![duf listing local, network and special filesystems](/img/global/linux/duf.png) + +Local disks, network shares and system mounts are grouped separately. Add `--only local` to hide the pseudo-filesystems Docker leaves behind. + +#### Done ! +:: + +## ncdu, finding what ate the disk + +When `duf` tells you the disk is full, `ncdu` tells you why. It walks a folder, sorts everything by real size, and lets you drill down with the arrow keys instead of running `du -sh *` twenty times. + +::steps{level="4"} +#### Install it + +```bash [Terminal] +sudo apt install ncdu +``` + +#### Point it at a folder + +```bash [Terminal] +sudo ncdu /srv/docker +``` + +Arrows to move, :kbd{value="Enter"} to open a folder, :kbd{value="D"} to delete the selected item, :kbd{value="Q"} to quit. On a big disk the first scan takes a moment, it's reading everything. + +::warning +:kbd{value="D"} deletes immediately, with a single confirmation and no recycle bin. Run `ncdu` without `sudo` when you're only looking, so a mistyped key can't touch anything the system owns. +:: + +#### Done ! +:: + +## tldr, the manual without the 400 lines + +`man tar` is exhaustive and unreadable. `tldr tar` gives you the five commands people actually type, with a one-line explanation each. It's community-maintained examples rather than a substitute for the real manual, and on Debian the client is packaged as `tealdeer`. + +::steps{level="4"} +#### Install it + +```bash [Terminal] +sudo apt install tealdeer +``` + +#### Download the page cache + +```bash [Terminal] +tldr --update +``` + +The examples are fetched once and stored locally, so the command works offline afterwards. Run it again every few months. + +#### Ask it something + +```bash [Terminal] +tldr rsync +``` + +#### Done ! +:: + +## lazydocker, managing containers from the terminal + +The one exception: it isn't packaged by Debian. It's a full text interface for Docker, containers, images, volumes and logs in one screen, with keys to restart, stop or follow the logs of anything. Handy when you're already in SSH and don't feel like opening Dockge. + +::steps{level="4"} +#### Download the latest release + +```bash [Terminal] +curl -Lo /tmp/lazydocker.tar.gz "https://github.com/jesseduffield/lazydocker/releases/latest/download/lazydocker_0.25.2_Linux_x86_64.tar.gz" +``` + +Check the [releases page](https://github.com/jesseduffield/lazydocker/releases) for the current version number, and take `arm64` instead of `x86_64` if the server is a Raspberry Pi or similar. + +#### Install the binary + +```bash [Terminal] +sudo tar -xzf /tmp/lazydocker.tar.gz -C /usr/local/bin lazydocker +rm /tmp/lazydocker.tar.gz +``` + +`/usr/local/bin` is the folder meant for software you install yourself, which is why `apt` never touches it. + +#### Check it landed + +```bash [Terminal] +lazydocker --version +``` + +#### Run it + +```bash [Terminal] +sudo lazydocker +``` + +![lazydocker showing services, containers, images, volumes and a container's config](/img/global/linux/lazydocker.png) + +It needs access to the Docker socket, hence the `sudo` unless your user is in the `docker` group. The keys worth knowing: + +| Key | What it does | +| --- | --- | +| `1` to `6` | Jump to a panel: projects, services, containers, images, volumes, networks | +| Arrows | Move inside the panel, the right side follows the selection | +| :kbd{value="Enter"} | Focus the main panel on the right, :kbd{value="Esc"} comes back | +| `x` | Open the menu of everything you can do with what's selected | +| `m` | Follow the logs | +| `s` / `r` / `p` | Stop, restart, pause the selected container | +| `E` | Open a shell inside the container | +| `d` | Remove it | +| `b` | Bulk commands, pruning images and volumes among others | +| `/` | Filter the list | +| `+` and `_` | Grow or shrink the panels | +| `q` | Quit | + +Case matters: `E` opens a shell in the container, `e` hides the stopped ones. + +The [full list](https://github.com/jesseduffield/lazydocker/blob/master/docs/keybindings/Keybindings_en.md) is in the project's documentation. + +::note +Being outside `apt` also means it won't be updated by `apt full-upgrade`. Repeat these steps when you want a newer version. +:: + +#### Done ! +:: diff --git a/content/en/3.serveex/2.core/1.installation.md b/content/en/3.serveex/2.core/1.installation.md index b40fb71..bb17271 100644 --- a/content/en/3.serveex/2.core/1.installation.md +++ b/content/en/3.serveex/2.core/1.installation.md @@ -14,8 +14,8 @@ The other reason is that it stays out of your way. Appliance systems like Unraid ## Installation -::note{icon="" to="https://www.iamtimsmith.com/blog/getting-started-with-the-linux-cli" target="_blank"} -📋 __Prerequisite:__ everything past this point happens in a terminal, so you should be comfortable with the basics: moving around with `cd`, listing with `ls`, editing a file with `nano`, and reading what a command tells you when it fails. If any of that is new, **start with the Linux CLI** and come back. +::note{icon="" to="/general/linux/cli-basics"} +📋 __Prerequisite:__ everything past this point happens in a terminal, so you should be comfortable with the basics: moving around with `cd`, listing with `ls`, editing a file with `nano`, and reading what a command tells you when it fails. If any of that is new, **start with the command line basics** and come back. :: ### BIOS setup @@ -342,13 +342,12 @@ Some essential apps you’ll likely need at some point, so might as well install ```bash [Terminal] sudo apt update sudo apt upgrade -sudo apt install nano btop ranger git duf neofetch samba cifs-utils tree unzip +sudo apt install nano btop ranger git duf samba cifs-utils tree unzip ``` -Additionally: - -- [gping](https://www.linode.com/docs/guides/how-to-use-gping-on-linux/) - Graphical ping tool -- [lazydocker](https://github.com/jesseduffield/lazydocker) - CLI Docker container manager +::note{to="/general/linux/handy-tools"} +What each of these does, plus a few more worth adding like `ncdu` and `lazydocker`, is detailed in **handy CLI tools**. +:: ## Useful Features ### Firewall diff --git a/content/en/3.serveex/2.core/2.docker.md b/content/en/3.serveex/2.core/2.docker.md index 54bf37c..0389a25 100644 --- a/content/en/3.serveex/2.core/2.docker.md +++ b/content/en/3.serveex/2.core/2.docker.md @@ -49,9 +49,9 @@ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin ::note -From here on, we assume the stacks are installed in the `/docker` folder, created using the command: +From here on, we assume the stacks are installed in the `/srv/docker` folder, created using the command: ```bash [Terminal] -sudo mkdir /docker +sudo mkdir /srv/docker ``` :: @@ -67,9 +67,10 @@ sudo mkdir /docker label: File structure we will create tree: /: - - docker: - - dockge: - - compose.yml + - srv: + - docker: + - dockge: + - compose.yml --- :: @@ -77,14 +78,14 @@ tree: #### Create the stack folder ```bash [Terminal] -cd /docker +cd /srv/docker sudo mkdir dockge ``` #### Create the compose file ```bash [Terminal] -cd /docker/dockge +cd /srv/docker/dockge sudo nano compose.yml ``` Paste the following: @@ -101,10 +102,10 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock - - /docker/dockge/data:/app/data - - /docker:/docker + - /srv/docker/dockge/data:/app/data + - /srv/docker:/srv/docker environment: - - DOCKGE_STACKS_DIR=/docker + - DOCKGE_STACKS_DIR=/srv/docker ``` Press :kbd{value="Ctrl+O"}, then :kbd{value="Enter"} to save, and :kbd{value="Ctrl+X"} to exit. @@ -112,7 +113,7 @@ Press :kbd{value="Ctrl+O"}, then :kbd{value="Enter"} to save, and :kbd{value="Ct #### Launch the container ```bash [Terminal] -cd /docker/dockge +cd /srv/docker/dockge sudo docker compose up -d ``` diff --git a/content/en/3.serveex/2.core/3.wireguard.md b/content/en/3.serveex/2.core/3.wireguard.md index b9fb643..768f1bc 100644 --- a/content/en/3.serveex/2.core/3.wireguard.md +++ b/content/en/3.serveex/2.core/3.wireguard.md @@ -57,12 +57,13 @@ __Warning__: If your IP is not static, use a Dynamic DNS service ([DynDNS](https --- tree: /: - - docker: - - wg-easy: - - config: - - etc_wireguard/ - - compose.yaml - - .env + - srv: + - docker: + - wg-easy: + - config: + - etc_wireguard/ + - compose.yaml + - .env --- :: @@ -191,11 +192,12 @@ We assume the client server runs Linux with Docker installed. --- tree: /: - - docker: - - wireguard: - - config: - - wg_confs/ - - compose.yaml + - srv: + - docker: + - wireguard: + - config: + - wg_confs/ + - compose.yaml --- :: @@ -203,7 +205,7 @@ tree: ### Create the folder ```bash [Terminal] -sudo mkdir -p /docker/wireguard/config/wg_confs +sudo mkdir -p /srv/docker/wireguard/config/wg_confs ``` ::tip{icon="" to="/serveex/files/file-browser-quantum"} @@ -213,7 +215,7 @@ sudo mkdir -p /docker/wireguard/config/wg_confs ### Create the wg0.conf file ```bash [Terminal] -sudo nano /docker/wireguard/config/wg_confs/wg0.conf +sudo nano /srv/docker/wireguard/config/wg_confs/wg0.conf ``` Paste the downloaded configuration, then save with :kbd{value="Ctrl+O"}, :kbd{value="Enter"}, and exit with :kbd{value="Ctrl+X"}. @@ -221,13 +223,13 @@ Paste the downloaded configuration, then save with :kbd{value="Ctrl+O"}, :kbd{va ::tip{icon=""} ✨ **Alternative method:** Transfer the file via SFTP and move it: ```bash [Terminal] -sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs +sudo cp ~/wg0.conf /srv/docker/wireguard/config/wg_confs ``` :: ### Create the compose file -Create the `compose.yaml` file in `/docker/wireguard`: +Create the `compose.yaml` file in `/srv/docker/wireguard`: ```yaml [compose.yaml] --- @@ -242,7 +244,7 @@ services: environment: - TZ=Europe/Paris volumes: - - /docker/wireguard/config:/config + - /srv/docker/wireguard/config:/config - /lib/modules:/lib/modules restart: unless-stopped ``` @@ -250,7 +252,7 @@ services: ### Start the container ```bash [Terminal] -cd /docker/wireguard +cd /srv/docker/wireguard sudo docker compose up -d ``` diff --git a/content/en/3.serveex/2.core/4.swag.md b/content/en/3.serveex/2.core/4.swag.md index c8cd331..91f27f3 100644 --- a/content/en/3.serveex/2.core/4.swag.md +++ b/content/en/3.serveex/2.core/4.swag.md @@ -31,18 +31,19 @@ This tutorial assumes you have a domain name pointing to your server, and that y label: File structure to modify tree: /: - - docker: - - swag: - - config: - - dns-conf: - - ovh.ini - - nginx: - - dbip.conf - - nginx.conf - - proxy-confs: - - dockge.subdomain.conf - - compose.yml - - .env + - srv: + - docker: + - swag: + - config: + - dns-conf: + - ovh.ini + - nginx: + - dbip.conf + - nginx.conf + - proxy-confs: + - dockge.subdomain.conf + - compose.yml + - .env --- :: @@ -71,7 +72,7 @@ services: - EMAIL=${EMAIL} - DOCKER_MODS=linuxserver/mods:swag-dbip|linuxserver/mods:swag-dashboard|linuxserver/mods:swag-auto-reload volumes: - - /docker/swag/config:/config + - /srv/docker/swag/config:/config ports: - 80:80 - 443:443 @@ -131,7 +132,7 @@ You can use **File Browser Quantum** to browse and edit files instead of using t :: ```bash [Terminal] -sudo nano /docker/swag/config/dns-conf/ovh.ini +sudo nano /srv/docker/swag/config/dns-conf/ovh.ini ``` You should see: @@ -163,7 +164,7 @@ Save with :kbd{value="Ctrl+O"}, then :kbd{value="Enter"}, and exit with :kbd{val Now configure swag to access DBIP, the geolocation-based access control module. Open the `nginx.conf` file: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/nginx.conf +sudo nano /srv/docker/swag/config/nginx/nginx.conf ``` Add the following line below the `http` section: @@ -184,7 +185,7 @@ On the left, you'll see a list of currently "proxied" services (none yet). On th ![picture](https://www.linuxserver.io/user/pages/03.blog/introducing-swag-dashboard/example.png) ## 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/). +DBIP allows you to block connections based on countries. It relies on the configuration file named `dbip.conf` located in `/srv/docker/swag/config/nginx`. [More info here](https://virtualize.link/secure/). In this example, we’ll configure it to block a list of countries known to be the source of most malicious traffic. We’ll also configure a variable to allow internal server traffic, your box’s local network, and a potential VPN in the 10.x.x.x range to access your services, but not the open internet. @@ -194,7 +195,7 @@ This configuration can be enabled or disabled per service (see the Dockge exampl ### Open dbip.conf ```bash [Terminal] -sudo nano /docker/swag/config/nginx/dbip.conf +sudo nano /srv/docker/swag/config/nginx/dbip.conf ``` ### Make your changes @@ -298,7 +299,7 @@ Dockge does not support multi-factor authentication. Exposing it online could co Open the `dockge.subdomain.conf` file: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf ``` Configure it like this: @@ -389,7 +390,7 @@ Wait a moment, then visit `https://dockge.mydomain.com` in your browser. You sho 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: ```bash [Terminal] -cd /docker/swag/config/proxy-confs +cd /srv/docker/swag/config/proxy-confs sudo cp servicename.subdomain.conf.sample servicename.subdomain.conf ``` diff --git a/content/en/3.serveex/3.security/2.cloudflare.md b/content/en/3.serveex/3.security/2.cloudflare.md index 6ce39a4..db4448e 100644 --- a/content/en/3.serveex/3.security/2.cloudflare.md +++ b/content/en/3.serveex/3.security/2.cloudflare.md @@ -83,7 +83,7 @@ Create a file `tunnelconfig.yml` to reference in your SWAG `compose.yaml`. :: ```bash [Terminal] -sudo nano /docker/swag/config/tunnelconfig.yml +sudo nano /srv/docker/swag/config/tunnelconfig.yml ``` Paste: @@ -108,7 +108,7 @@ Now configure _Cloudflare Real IP_. Open the `nginx.conf` file: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/nginx.conf +sudo nano /srv/docker/swag/config/nginx/nginx.conf ``` Add the following at the end of the `http` section: @@ -157,8 +157,8 @@ services: ports: - 81:81 volumes: - - /docker/swag/config:/config - - /docker/swag/config/fail2ban/fail2ban.sqlite3:/dashboard/fail2ban.sqlite3:ro + - /srv/docker/swag/config:/config + - /srv/docker/swag/config/fail2ban/fail2ban.sqlite3:/dashboard/fail2ban.sqlite3:ro restart: unless-stopped ``` diff --git a/content/en/3.serveex/3.security/3.tinyauth.md b/content/en/3.serveex/3.security/3.tinyauth.md index 1d28283..c1d5e78 100644 --- a/content/en/3.serveex/3.security/3.tinyauth.md +++ b/content/en/3.serveex/3.security/3.tinyauth.md @@ -21,11 +21,12 @@ It supports a simple local username/password login out of the box, which is what --- tree: /: - - docker: - - tinyauth: - - compose.yaml - - .env - - data/ + - srv: + - docker: + - tinyauth: + - compose.yaml + - .env + - data/ --- :: @@ -33,7 +34,7 @@ tree: ### Create the data folder ```bash [Terminal] -sudo mkdir -p /docker/tinyauth/data +sudo mkdir -p /srv/docker/tinyauth/data ``` ### Generate a password hash @@ -61,7 +62,7 @@ services: env_file: - .env volumes: - - /docker/tinyauth/data:/data + - /srv/docker/tinyauth/data:/data ports: - 3000:3000 ``` @@ -180,7 +181,7 @@ In the Swag folders, create the file `tinyauth.subdomain.conf`: :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/tinyauth.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/tinyauth.subdomain.conf ``` Paste the following configuration: @@ -230,7 +231,7 @@ Swag doesn't ship a ready-made include file for TinyAuth, so we'll add the forwa ### Open the app's subdomain.conf file ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf ``` ### Add the forward-auth check diff --git a/content/en/3.serveex/3.security/4.pocket-id.md b/content/en/3.serveex/3.security/4.pocket-id.md index 0f2cbe8..6a8ce8a 100644 --- a/content/en/3.serveex/3.security/4.pocket-id.md +++ b/content/en/3.serveex/3.security/4.pocket-id.md @@ -21,11 +21,12 @@ This makes it a good fit if you just need a simple, fast SSO backend, for exampl --- tree: /: - - docker: - - pocket-id: - - compose.yaml - - .env - - data/ + - srv: + - docker: + - pocket-id: + - compose.yaml + - .env + - data/ --- :: @@ -33,7 +34,7 @@ tree: ### Create the data folder ```bash [Terminal] -sudo mkdir -p /docker/pocket-id/data +sudo mkdir -p /srv/docker/pocket-id/data ``` ### Generate an encryption key @@ -58,7 +59,7 @@ services: env_file: - .env volumes: - - /docker/pocket-id/data:/app/data + - /srv/docker/pocket-id/data:/app/data ports: - 1411:1411 healthcheck: @@ -159,7 +160,7 @@ In the Swag folders, create the file `id.subdomain.conf`: :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/id.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/id.subdomain.conf ``` Paste the following configuration: @@ -243,7 +244,7 @@ https://tinyauth.mydomain.com/api/oauth/callback/pocketid Copy the __Client ID__ and __Client Secret__ Pocket ID gives you, then edit TinyAuth's `.env` file: ```bash [Terminal] -sudo nano /docker/tinyauth/.env +sudo nano /srv/docker/tinyauth/.env ``` Add the following: diff --git a/content/en/3.serveex/4.monitoring/1.uptime-kuma.md b/content/en/3.serveex/4.monitoring/1.uptime-kuma.md index 5e59c38..611e74b 100644 --- a/content/en/3.serveex/4.monitoring/1.uptime-kuma.md +++ b/content/en/3.serveex/4.monitoring/1.uptime-kuma.md @@ -14,10 +14,11 @@ description: Install Uptime-Kuma to monitor your self-hosted services uptime, se --- tree: /: - - docker: - - uptime-kuma: - - data/ - - compose.yaml + - srv: + - docker: + - uptime-kuma: + - data/ + - compose.yaml --- :: @@ -33,7 +34,7 @@ services: image: louislam/uptime-kuma:2-slim container_name: uptime-kuma volumes: - - /docker/uptime-kuma/uptime-kuma-data:/app/data + - /srv/docker/uptime-kuma/uptime-kuma-data:/app/data ports: - 3200:3001 # : restart: always @@ -87,7 +88,7 @@ you can use **File Browser Quantum** to browse and edit your files instead of us :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/stats.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/stats.subdomain.conf ``` Paste the following config: @@ -184,7 +185,7 @@ That's it! Uptime-Kuma is now exposed, and you can access it via `https://stats. ### Open the subdomain.conf file ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/stats.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/stats.subdomain.conf ``` ### Add the forward-auth check and public paths diff --git a/content/en/3.serveex/4.monitoring/2.dozzle.md b/content/en/3.serveex/4.monitoring/2.dozzle.md index 16bfb57..965e67f 100644 --- a/content/en/3.serveex/4.monitoring/2.dozzle.md +++ b/content/en/3.serveex/4.monitoring/2.dozzle.md @@ -17,11 +17,12 @@ description: Install Dozzle to monitor Docker container logs in real time from a --- tree: /: - - docker: - - dozzle: - - compose.yaml - - .env - - data/ + - srv: + - docker: + - dozzle: + - compose.yaml + - .env + - data/ --- :: @@ -125,7 +126,7 @@ In the Swag folder, create the `dozzle.subdomain.conf` file. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/dozzle.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/dozzle.subdomain.conf ``` Paste the configuration below: diff --git a/content/en/3.serveex/4.monitoring/3.speedtest-tracker.md b/content/en/3.serveex/4.monitoring/3.speedtest-tracker.md index abecce9..6cf8054 100644 --- a/content/en/3.serveex/4.monitoring/3.speedtest-tracker.md +++ b/content/en/3.serveex/4.monitoring/3.speedtest-tracker.md @@ -20,12 +20,13 @@ We will use the Docker image maintained by **LinuxServer.io** --- tree: /: - - docker: - - speedtest-tracker: - - compose.yaml - - .env - - data: - - config/ + - srv: + - docker: + - speedtest-tracker: + - compose.yaml + - .env + - data: + - config/ --- :: @@ -61,7 +62,7 @@ services: - DB_CONNECTION=sqlite - SPEEDTEST_SCHEDULE=${SCHEDULE} volumes: - - /docker/speedtest-tracker/data/config:/config + - /srv/docker/speedtest-tracker/data/config:/config ``` ### Set your environment variables @@ -110,7 +111,7 @@ Speedtest Tracker does not use multi-factor authentication. Exposing it on the i Open the `speedtest.subdomain.conf` file: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/speedtest.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/speedtest.subdomain.conf ``` Configure it like this: diff --git a/content/en/3.serveex/4.monitoring/4.beszel.md b/content/en/3.serveex/4.monitoring/4.beszel.md index d88f762..cf073c4 100644 --- a/content/en/3.serveex/4.monitoring/4.beszel.md +++ b/content/en/3.serveex/4.monitoring/4.beszel.md @@ -18,12 +18,13 @@ Beszel includes a hub with a web UI and an agent that collects data from your se --- tree: /: - - docker: - - beszel: - - compose.yaml - - .env - - data/ - - socket/ + - srv: + - docker: + - beszel: + - compose.yaml + - .env + - data/ + - socket/ --- :: @@ -195,7 +196,7 @@ In Swag’s config folders, create `beszel.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/beszel.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/beszel.subdomain.conf ``` Paste: diff --git a/content/en/3.serveex/4.monitoring/5.upsnap.md b/content/en/3.serveex/4.monitoring/5.upsnap.md index ab53768..f16d98c 100644 --- a/content/en/3.serveex/4.monitoring/5.upsnap.md +++ b/content/en/3.serveex/4.monitoring/5.upsnap.md @@ -16,11 +16,12 @@ description: Install UpSnap to remotely wake up machines on your local network v --- tree: /: - - docker: - - upsnap: - - compose.yaml - - .env - - data/ + - srv: + - docker: + - upsnap: + - compose.yaml + - .env + - data/ --- :: @@ -38,7 +39,7 @@ services: network_mode: host restart: unless-stopped volumes: - - /docker/upsnap/data:/app/pb_data + - /srv/docker/upsnap/data:/app/pb_data environment: - TZ=Europe/Paris - UPSNAP_SCAN_RANGE=${SCAN_RANGE} @@ -137,7 +138,7 @@ In the Swag folders, create the file `upsnap.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/upsnap.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/upsnap.subdomain.conf ``` And paste the following configuration: diff --git a/content/en/3.serveex/5.media/1.jellyfin.md b/content/en/3.serveex/5.media/1.jellyfin.md index 5039803..63b5a32 100644 --- a/content/en/3.serveex/5.media/1.jellyfin.md +++ b/content/en/3.serveex/5.media/1.jellyfin.md @@ -25,11 +25,12 @@ Unlike Plex, Jellyfin has no cloud relay: to access your server outside your loc --- tree: /: - - docker: - - jellyfin: - - compose.yaml - - .env - - config/ + - srv: + - docker: + - jellyfin: + - compose.yaml + - .env + - config/ - media: - tvseries/ - movies/ @@ -61,7 +62,7 @@ services: - PGID=${GUID} - TZ=Europe/Paris volumes: - - /docker/jellyfin/config:/config + - /srv/docker/jellyfin/config:/config - /media:/media restart: unless-stopped devices: diff --git a/content/en/3.serveex/5.media/2.qbittorrent.md b/content/en/3.serveex/5.media/2.qbittorrent.md index cfb1041..f2d668a 100644 --- a/content/en/3.serveex/5.media/2.qbittorrent.md +++ b/content/en/3.serveex/5.media/2.qbittorrent.md @@ -26,13 +26,14 @@ Here’s the system we’ll set up: --- tree: /: - - docker: - - seedbox: - - qbittorrent: - - config/ - - gluetun/ - - compose.yaml - - .env + - srv: + - docker: + - seedbox: + - qbittorrent: + - config/ + - gluetun/ + - compose.yaml + - .env - "media # linked to Jellyfin and Qbittorrent": - "downloads/ # generic downloads, selected in settings" - "movies/ # used for downloading movies" @@ -72,7 +73,7 @@ services: - GSP_QBT_USERNAME=${ID} - GSP_QBT_PASSWORD=${PW} volumes: - - /docker/seedbox/qbittorrent/config:/config + - /srv/docker/seedbox/qbittorrent/config:/config - /media:/media depends_on: - gluetun @@ -83,7 +84,7 @@ services: restart: unless-stopped mem_limit: 4g volumes: - - /docker/gluetun/config.toml:/gluetun/auth/config.toml:ro + - /srv/docker/gluetun/config.toml:/gluetun/auth/config.toml:ro devices: - /dev/net/tun:/dev/net/tun ports: @@ -133,16 +134,16 @@ Open a terminal to generate the authentication key: sudo docker run --rm qmcgaw/gluetun genkey ``` -Note the key, then create the `/docker/gluetun` folder: +Note the key, then create the `/srv/docker/gluetun` folder: ```bash [Terminal] -sudo mkdir /docker/gluetun +sudo mkdir /srv/docker/gluetun ``` Create the `config.toml` file: ```bash [Terminal] -sudo nano /docker/gluetun/config.toml +sudo nano /srv/docker/gluetun/config.toml ``` Enter: @@ -272,7 +273,7 @@ Now create/edit `seedbox.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf ``` Paste the following config (check the port): diff --git a/content/en/3.serveex/5.media/3.servarr.md b/content/en/3.serveex/5.media/3.servarr.md index 2570c50..656e232 100644 --- a/content/en/3.serveex/5.media/3.servarr.md +++ b/content/en/3.serveex/5.media/3.servarr.md @@ -23,21 +23,22 @@ We’ll start by deploying the stack and then proceed to configure each app and --- tree: /: - - docker: - - jellyfin: - - compose.yml - - .env - - config/ - - sonarr: - - config/ - - radarr: - - config/ - - bazarr: - - config/ - - prowlarr: - - config/ - - seerr: - - config/ + - srv: + - docker: + - jellyfin: + - compose.yml + - .env + - config/ + - sonarr: + - config/ + - radarr: + - config/ + - bazarr: + - config/ + - prowlarr: + - config/ + - seerr: + - config/ - media: - downloads/ - tvseries/ @@ -66,7 +67,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/jellyfin/config:/config + - /srv/docker/jellyfin/config:/config - ${MEDIA_PATH}:/media restart: unless-stopped devices: @@ -82,7 +83,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/sonarr/config:/config + - /srv/docker/sonarr/config:/config - ${MEDIA_PATH}:/media ports: - 8989:8989 @@ -96,7 +97,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/radarr/config:/config + - /srv/docker/radarr/config:/config - ${MEDIA_PATH}:/media ports: - 7878:7878 @@ -110,7 +111,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/prowlarr/data:/config + - /srv/docker/prowlarr/data:/config ports: - 9696:9696 restart: unless-stopped @@ -122,7 +123,7 @@ services: - LOG_LEVEL=info - TZ=Europe/Paris volumes: - - /docker/seerr/config:/app/config + - /srv/docker/seerr/config:/app/config ports: - 5055:5055 restart: unless-stopped @@ -136,7 +137,7 @@ services: - PGID=1000 - TZ=Europe/Paris volumes: - - /docker/bazarr/config:/config + - /srv/docker/bazarr/config:/config - ${MEDIA_PATH}:/media ports: - 6767:6767 @@ -173,10 +174,10 @@ MEDIA_PATH= ::note -Unlike the other containers here, Seerr's image doesn't use `PUID`/`PGID`; it always runs as UID `1000`. Make sure `/docker/seerr/config` is owned by that user, or Seerr won't be able to write to it: +Unlike the other containers here, Seerr's image doesn't use `PUID`/`PGID`; it always runs as UID `1000`. Make sure `/srv/docker/seerr/config` is owned by that user, or Seerr won't be able to write to it: ```bash [Terminal] -sudo chown -R 1000:1000 /docker/seerr/config +sudo chown -R 1000:1000 /srv/docker/seerr/config ``` :: @@ -434,7 +435,7 @@ Create and edit the file `films.subdomain.conf`: :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/films.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/films.subdomain.conf ``` Paste the following: diff --git a/content/en/3.serveex/6.cloud/1.immich.md b/content/en/3.serveex/6.cloud/1.immich.md index 8f81850..1fefa9e 100644 --- a/content/en/3.serveex/6.cloud/1.immich.md +++ b/content/en/3.serveex/6.cloud/1.immich.md @@ -16,11 +16,12 @@ description: Install Immich, a self-hosted alternative to Google Photos and iClo --- tree: /: - - docker: - - immich: - - library/ - - compose.yaml - - .env + - srv: + - docker: + - immich: + - library/ + - compose.yaml + - .env --- :: @@ -100,7 +101,7 @@ In the SWAG folders, create a file named `immich.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/immich.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/immich.subdomain.conf ``` Then paste the following configuration: diff --git a/content/en/3.serveex/6.cloud/2.nextcloud.md b/content/en/3.serveex/6.cloud/2.nextcloud.md index d078293..02e5970 100644 --- a/content/en/3.serveex/6.cloud/2.nextcloud.md +++ b/content/en/3.serveex/6.cloud/2.nextcloud.md @@ -20,12 +20,13 @@ We'll be using the Docker image maintained by **LinuxServer.io** --- tree: /: - - docker: - - nextcloud: - - config/ - - data/ - - compose.yaml - - .env + - srv: + - docker: + - nextcloud: + - config/ + - data/ + - compose.yaml + - .env --- :: @@ -45,8 +46,8 @@ services: - PGID=${GUID} - TZ=Etc/UTC volumes: - - /docker/nextcloud/config:/config - - /docker/nextcloud/data:/data + - /srv/docker/nextcloud/config:/config + - /srv/docker/nextcloud/data:/data ports: - ${PORT}:443 restart: unless-stopped @@ -54,7 +55,7 @@ services: ::note{to="/general/networking/samba"} -If you’re using a NAS or network-shared drive via **Samba**, replace `/docker/nextcloud/data` with the path to your shared folder. +If you’re using a NAS or network-shared drive via **Samba**, replace `/srv/docker/nextcloud/data` with the path to your shared folder. :: ### Set your environment variables @@ -129,7 +130,7 @@ In Nextcloud’s files, edit the `config.php` file: :: ```bash [Terminal] -sudo nano /docker/nextcloud/config/www/nextcloud/config/config.php +sudo nano /srv/docker/nextcloud/config/www/nextcloud/config/config.php ``` Paste the following before the final `);`: @@ -157,7 +158,7 @@ Press :kbd{value="Ctrl+O"}, then :kbd{value="Enter"} to save, and :kbd{value="Ct In Swag’s folders, create the file `nextcloud.subdomain.conf`: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/nextcloud.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/nextcloud.subdomain.conf ``` Paste the following: diff --git a/content/en/3.serveex/7.files/1.file-browser-quantum.md b/content/en/3.serveex/7.files/1.file-browser-quantum.md index c2f5a01..69bca9c 100644 --- a/content/en/3.serveex/7.files/1.file-browser-quantum.md +++ b/content/en/3.serveex/7.files/1.file-browser-quantum.md @@ -16,12 +16,13 @@ description: Install File Browser Quantum, a modernized fork of File Browser, to --- tree: /: - - docker: - - filebrowser-quantum: - - compose.yaml - - data: - - config.yaml - - filebrowser.sqlite + - srv: + - docker: + - filebrowser-quantum: + - compose.yaml + - data: + - config.yaml + - filebrowser.sqlite --- :: @@ -31,13 +32,13 @@ tree: Create the data folder: ```bash [Terminal] -sudo mkdir -p /docker/filebrowser-quantum/data +sudo mkdir -p /srv/docker/filebrowser-quantum/data ``` Create the `config.yaml` file: ```bash [Terminal] -sudo nano /docker/filebrowser-quantum/data/config.yaml +sudo nano /srv/docker/filebrowser-quantum/data/config.yaml ``` Paste the following, adding one `sources` entry per folder you want to browse: @@ -46,7 +47,7 @@ Paste the following, adding one `sources` entry per folder you want to browse: server: cacheDir: /home/filebrowser/data/tmp sources: - - path: /docker + - path: /srv/docker config: defaultEnabled: true - path: /media @@ -68,16 +69,16 @@ services: image: gtstef/filebrowser:beta restart: unless-stopped volumes: - - /docker:/docker + - /srv/docker:/srv/docker - /media:/media - - /docker/filebrowser-quantum/data:/home/filebrowser/data + - /srv/docker/filebrowser-quantum/data:/home/filebrowser/data ports: - 8020:80 ``` ::note -Mount every folder you listed under `sources` in `config.yaml` at the same path inside the container (here `/docker` and `/media`), otherwise File Browser Quantum won't find them. +Mount every folder you listed under `sources` in `config.yaml` at the same path inside the container (here `/srv/docker` and `/media`), otherwise File Browser Quantum won't find them. :: ::tip{icon=""} @@ -151,7 +152,7 @@ Restart the stack by clicking "deploy" and wait for SWAG to fully initialize. In the Swag folders, create the file `fbq.subdomain.conf`. ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/fbq.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/fbq.subdomain.conf ``` And paste the following configuration: diff --git a/content/en/3.serveex/7.files/2.pingvin.md b/content/en/3.serveex/7.files/2.pingvin.md index fdceb67..9f5082c 100644 --- a/content/en/3.serveex/7.files/2.pingvin.md +++ b/content/en/3.serveex/7.files/2.pingvin.md @@ -27,9 +27,9 @@ services: ports: - 3600:3000 volumes: - - /docker/pingvin/data:/opt/app/backend/data - - /docker/pingvin/data/img:/opt/app/frontend/public/img - - /docker/pingvin/uploads:/opt/app/backend/uploads # path to the folder where you want to store files uploaded to pingvin. Change to your preference. + - /srv/docker/pingvin/data:/opt/app/backend/data + - /srv/docker/pingvin/data/img:/opt/app/frontend/public/img + - /srv/docker/pingvin/uploads:/opt/app/backend/uploads # path to the folder where you want to store files uploaded to pingvin. Change to your preference. depends_on: clamav: condition: service_healthy @@ -121,7 +121,7 @@ In the Swag folders, create the `pingvin.subdomain.conf` file. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/pingvin.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/pingvin.subdomain.conf ``` Paste the configuration below: diff --git a/content/en/3.serveex/8.development/1.code-server.md b/content/en/3.serveex/8.development/1.code-server.md index 52aad64..311995e 100644 --- a/content/en/3.serveex/8.development/1.code-server.md +++ b/content/en/3.serveex/8.development/1.code-server.md @@ -29,11 +29,12 @@ For this setup, we’ll use the **image maintained by LinuxServer.io**. --- tree: /: - - docker: - - code-server: - - compose.yaml - - .env - - config/ + - srv: + - docker: + - code-server: + - compose.yaml + - .env + - config/ - (any folder you want to mount in VS Code)/ --- :: @@ -55,7 +56,7 @@ services: - TZ=Etc/UTC - HASHED_PASSWORD=${PW} volumes: - - /docker/code-server/config:/config + - /srv/docker/code-server/config:/config # add folders to mount in VS Code # - /path/to/folder:/folder ports: @@ -172,7 +173,7 @@ Inside the Swag config folders, create the file `code.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/code.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/code.subdomain.conf ``` Paste the following configuration: diff --git a/content/en/3.serveex/8.development/2.forgejo.md b/content/en/3.serveex/8.development/2.forgejo.md index 828eebd..0a20b55 100644 --- a/content/en/3.serveex/8.development/2.forgejo.md +++ b/content/en/3.serveex/8.development/2.forgejo.md @@ -17,11 +17,12 @@ description: Install Forgejo, a lightweight self-hosted Git service to manage yo --- tree: /: - - docker: - - forgejo: - - compose.yaml - - .env - - data/ + - srv: + - docker: + - forgejo: + - compose.yaml + - .env + - data/ --- :: @@ -118,7 +119,7 @@ Inside the Swag folders, create the file `forgejo.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/forgejo.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/forgejo.subdomain.conf ``` Paste the configuration below: @@ -186,7 +187,7 @@ Press :kbd{value="Ctrl+O"}, then :kbd{value="Enter"} to save, and :kbd{value="Ct Now open the `app.ini` file from the container's file system: ```bash [Terminal] -sudo nano /docker/forgejo/data/gitea/conf/app.ini +sudo nano /srv/docker/forgejo/data/gitea/conf/app.ini ``` Then modify the server section with your domain information: diff --git a/content/en/3.serveex/8.development/3.it-tools.md b/content/en/3.serveex/8.development/3.it-tools.md index ba5671d..cec03d2 100644 --- a/content/en/3.serveex/8.development/3.it-tools.md +++ b/content/en/3.serveex/8.development/3.it-tools.md @@ -102,7 +102,7 @@ Inside the Swag folders, create the file `tools.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/tools.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/tools.subdomain.conf ``` Paste the configuration below: diff --git a/content/en/3.serveex/9.apps/1.adguard.md b/content/en/3.serveex/9.apps/1.adguard.md index 4539b01..77e0438 100644 --- a/content/en/3.serveex/9.apps/1.adguard.md +++ b/content/en/3.serveex/9.apps/1.adguard.md @@ -35,18 +35,19 @@ This is how ads and malicious domains are blocked: Adguard blocks only the bad d --- tree: /: - - docker: - - adguard: - - confdir/ - - workdir/ - - compose.yaml - - .env + - srv: + - docker: + - adguard: + - confdir/ + - workdir/ + - compose.yaml + - .env --- :: ::note -We will also mount the `/docker/swag/config/etc/letsencrypt` folder to access Swag's SSL certificate. +We will also mount the `/srv/docker/swag/config/etc/letsencrypt` folder to access Swag's SSL certificate. :: ::steps{level="3"} @@ -70,9 +71,9 @@ services: - 853:853/tcp - 3000:3000/tcp volumes: - - /docker/adguardhome/confdir:/opt/adguardhome/conf - - /docker/adguardhome/workdir:/opt/adguardhome/work - - /docker/swag/config/etc/letsencrypt:/swag-ssl:ro + - /srv/docker/adguardhome/confdir:/opt/adguardhome/conf + - /srv/docker/adguardhome/workdir:/opt/adguardhome/work + - /srv/docker/swag/config/etc/letsencrypt:/swag-ssl:ro ``` ::tip{icon=""} @@ -149,7 +150,7 @@ You can use **File Browser Quantum** to browse and edit files instead of using t :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/adguard.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/adguard.subdomain.conf ``` Paste the configuration below: diff --git a/content/en/3.serveex/9.apps/2.vaultwarden.md b/content/en/3.serveex/9.apps/2.vaultwarden.md index d9d2706..eed3fce 100644 --- a/content/en/3.serveex/9.apps/2.vaultwarden.md +++ b/content/en/3.serveex/9.apps/2.vaultwarden.md @@ -18,11 +18,12 @@ Vaultwarden is a fork of [Bitwarden](https://bitwarden.com/fr-fr/help/). --- tree: /: - - docker: - - vaultwarden: - - data/ - - compose.yaml - - .env + - srv: + - docker: + - vaultwarden: + - data/ + - compose.yaml + - .env --- :: @@ -152,7 +153,7 @@ In SWAG's config folder, create the file `vault.subdomain.conf`: :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/vault.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/vault.subdomain.conf ``` And paste the following configuration: @@ -267,7 +268,7 @@ https://vault.yourdomain.com/identity/connect/oidc-signin Edit Vaultwarden's `.env` file: ```bash [Terminal] -sudo nano /docker/vaultwarden/.env +sudo nano /srv/docker/vaultwarden/.env ``` Add the following: diff --git a/content/en/3.serveex/91.advanced/1.authentik.md b/content/en/3.serveex/91.advanced/1.authentik.md index 304cd16..d25ed73 100644 --- a/content/en/3.serveex/91.advanced/1.authentik.md +++ b/content/en/3.serveex/91.advanced/1.authentik.md @@ -39,14 +39,15 @@ Both modes can be configured on a per-application basis. --- tree: /: - - docker: - - authentik: - - .env - - compose.yml - - media/ - - certs/ - - custom-template/ - - ssh/ + - srv: + - docker: + - authentik: + - .env + - compose.yml + - media/ + - certs/ + - custom-template/ + - ssh/ --- :: @@ -54,12 +55,12 @@ tree: ### Create the folders ```bash [Terminal] -sudo mkdir -p /docker/authentik/media /docker/authentik/certs /docker/authentik/custom-template /docker/authentik/ssh +sudo mkdir -p /srv/docker/authentik/media /srv/docker/authentik/certs /srv/docker/authentik/custom-template /srv/docker/authentik/ssh ``` ### Generate secrets -Navigate to the `authentik` folder via `cd /docker/authentik` and generate a password and secret key to include in the `.env` file: +Navigate to the `authentik` folder via `cd /srv/docker/authentik` and generate a password and secret key to include in the `.env` file: ```bash [Terminal] sudo echo "PG_PASS=$(openssl rand 36 | base64)" >> .env @@ -70,7 +71,7 @@ sudo echo "AUTHENTIK_SECRET_KEY=$(openssl rand 60 | base64)" >> .env To generate the keys, we created the folders ahead of deployment using Dockge. Dockge will prevent you from creating a stack with the same name in these folders unless a `compose.yml` file exists. So, create an empty `compose.yml` so it appears as an inactive stack: ```bash [Terminal] - sudo nano /docker/authentik/compose.yml + sudo nano /srv/docker/authentik/compose.yml ``` :: @@ -216,7 +217,7 @@ You can use **File Browser Quantum** to navigate and edit files instead of using :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/authentik-server.conf +sudo nano /srv/docker/swag/config/nginx/authentik-server.conf ``` Verify that the following variables are set correctly: @@ -233,7 +234,7 @@ If not, make the necessary changes, then save with :kbd{value="Ctrl+O"}, :kbd{va Create the `auth.subdomain.conf` file: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/auth.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/auth.subdomain.conf ``` Paste the following configuration: @@ -356,7 +357,7 @@ Why do this when Dockge already has authentication? Because Dockge uses weak HTT Edit the file `dockge.mydomain.com`: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/dockge.subdomain.conf ``` Uncomment the two lines `#include /config/nginx/authentik-server.conf;` @@ -437,10 +438,10 @@ We assume you’ve already installed [Docker](/serveex/core/docker) and [SWAG](/ On your remote machine, use [Dockge](/serveex/core/docker/#installer-dockge-pour-gérer-et-déployer-les-conteneurs) to create a stack named `authentik-outpost`. -If you haven’t installed [Dockge](/serveex/core/docker/#installer-dockge-pour-gérer-et-déployer-les-conteneurs), create a folder `/docker/authentik-outpost`, or directly via command line: +If you haven’t installed [Dockge](/serveex/core/docker/#installer-dockge-pour-gérer-et-déployer-les-conteneurs), create a folder `/srv/docker/authentik-outpost`, or directly via command line: ```bash [Terminal] -sudo mkdir -P /docker/authentik-outpost +sudo mkdir -P /srv/docker/authentik-outpost ``` ::tip{icon="" to="/serveex/files/file-browser-quantum"} @@ -455,7 +456,7 @@ Create the `compose.yaml` file or paste the configuration directly into Dockge i Via command line: ```bash [Terminal] -sudo nano /docker/authentik-outpost/compose.yaml +sudo nano /srv/docker/authentik-outpost/compose.yaml ``` Paste the following configuration, updating the version in `{AUTHENTIK_TAG:proxy:2024.2.3}`{lang=properties} to match your Authentik server version. @@ -485,7 +486,7 @@ services: Go to the SWAG stack on the remote machine (or edit directly using Dockge) and add the authentik-outpost network in the configuration file like this (see `networks` section): ```bash [Terminal] -sudo nano /docker/swag/compose.yaml +sudo nano /srv/docker/swag/compose.yaml ``` ```yaml [compose.yaml] @@ -519,7 +520,7 @@ If using [Dockge](/serveex/core/docker/#installer-dockge-pour-gérer-et-déploye Otherwise, via terminal: ```bash [Terminal] -cd /docker/swag/ +cd /srv/docker/swag/ sudo docker compose up -d ``` @@ -530,7 +531,7 @@ Create (or fill using Dockge) the `.env` file in the `authentik-outpost` directo Via command line: ```bash [Terminal] -sudo nano /docker/authentik-outpost/.env +sudo nano /srv/docker/authentik-outpost/.env ``` Paste the following configuration: @@ -556,7 +557,7 @@ If using Dockge, deploy the stack. Otherwise, via terminal: ```bash [Terminal] -cd /docker/authentik-outpost/ +cd /srv/docker/authentik-outpost/ sudo docker compose up -d ``` @@ -569,7 +570,7 @@ Now, let’s configure SWAG. Open the `authentik-server.conf` file: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/authentik-server.conf +sudo nano /srv/docker/swag/config/nginx/authentik-server.conf ``` In the file, change `authentik-server` to `authentik-outpost` as shown: diff --git a/content/en/3.serveex/91.advanced/2.arcane.md b/content/en/3.serveex/91.advanced/2.arcane.md index f106389..7cd28ba 100644 --- a/content/en/3.serveex/91.advanced/2.arcane.md +++ b/content/en/3.serveex/91.advanced/2.arcane.md @@ -29,11 +29,12 @@ Arcane needs access to the Docker socket to manage containers, which is effectiv --- tree: /: - - docker: - - arcane: - - compose.yaml - - .env - - data/ + - srv: + - docker: + - arcane: + - compose.yaml + - .env + - data/ --- :: @@ -61,7 +62,7 @@ services: env_file: - .env volumes: - - /docker/arcane/data:/app/data + - /srv/docker/arcane/data:/app/data networks: - arcane-internal ports: @@ -200,7 +201,7 @@ In the Swag folders, create the file `arcane.subdomain.conf`: :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/arcane.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/arcane.subdomain.conf ``` Paste the following configuration: @@ -275,7 +276,7 @@ services: - MANAGER_API_URL=http://10.8.0.3:3552 volumes: - /var/run/docker.sock:/var/run/docker.sock - - /docker/arcane-agent/data:/app/data + - /srv/docker/arcane-agent/data:/app/data ``` ::note diff --git a/content/en/6.recycled/2.deprecated/1.wireguard-14.md b/content/en/6.recycled/2.deprecated/1.wireguard-14.md index dbd863a..b6d99f4 100644 --- a/content/en/6.recycled/2.deprecated/1.wireguard-14.md +++ b/content/en/6.recycled/2.deprecated/1.wireguard-14.md @@ -60,12 +60,13 @@ __Warning:__ This guide uses version `14` of **wg-easy**. Version `15` introduce --- tree: /: - - docker: - - wg-easy: - - config: - - etc_wireguard/ - - compose.yaml - - .env + - srv: + - docker: + - wg-easy: + - config: + - etc_wireguard/ + - compose.yaml + - .env --- :: @@ -98,7 +99,7 @@ services: image: ghcr.io/wg-easy/wg-easy:14 container_name: wg-easy volumes: - - /docker/wg_easy/config/etc_wireguard:/etc/wireguard + - /srv/docker/wg_easy/config/etc_wireguard:/etc/wireguard restart: unless-stopped cap_add: - NET_ADMIN @@ -175,25 +176,26 @@ Assumes the client is a Linux server with Docker installed --- tree: /: - - docker: - - wireguard: - - config: - - wg_confs/ - - compose.yaml + - srv: + - docker: + - wireguard: + - config: + - wg_confs/ + - compose.yaml --- :: ::steps{level="3"} ### Create the config folder -Create the folder `/docker/wireguard/config/wg_confs`: +Create the folder `/srv/docker/wireguard/config/wg_confs`: ::tip{icon="" to="/serveex/files/file-browser-quantum"} ✨ __Tip:__ Use **File Browser** to browse and edit files without terminal :: ```bash [Terminal] -sudo mkdir -p /docker/wireguard/config/wg_confs +sudo mkdir -p /srv/docker/wireguard/config/wg_confs ``` ### Copy the configuration file @@ -204,16 +206,16 @@ Copy the `wg0.conf` file downloaded earlier: ✨ __Tip:__ Easiest way is to transfer the file via SFTP to `/home/youruser`, then move it: ```bash [Terminal] -sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs +sudo cp ~/wg0.conf /srv/docker/wireguard/config/wg_confs ``` :: ### Deploy the container -Create `compose.yaml` in `/docker/wireguard`: +Create `compose.yaml` in `/srv/docker/wireguard`: ```bash [Terminal] -sudo nano /docker/wireguard/compose.yaml +sudo nano /srv/docker/wireguard/compose.yaml ``` Paste: @@ -231,7 +233,7 @@ services: environment: - TZ=Europe/Paris volumes: - - /docker/wireguard/config:/config + - /srv/docker/wireguard/config:/config - /lib/modules:/lib/modules #optional restart: unless-stopped ``` @@ -241,7 +243,7 @@ Press :kbd{value="Ctrl+O"}, then :kbd{value="Enter"} to save, and :kbd{value="Ct Start the container: ```bash [Terminal] -cd /docker/wireguard +cd /srv/docker/wireguard sudo docker compose up -d ``` diff --git a/content/en/6.recycled/2.deprecated/2.file-browser.md b/content/en/6.recycled/2.deprecated/2.file-browser.md index 5cf9807..fe2febf 100644 --- a/content/en/6.recycled/2.deprecated/2.file-browser.md +++ b/content/en/6.recycled/2.deprecated/2.file-browser.md @@ -28,8 +28,8 @@ services: filebrowser: container_name: filebrowser volumes: - - /docker/filebrowser/config:/config/ - - /path/to/your/folders:/yourfolders #add your folders to browse as /docker:/docker for exemple + - /srv/docker/filebrowser/config:/config/ + - /path/to/your/folders:/yourfolders #add your folders to browse as /srv/docker:/srv/docker for exemple ports: - 8010:80 image: filebrowser/filebrowser:s6 @@ -106,7 +106,7 @@ Restart the stack by clicking "deploy" and wait for SWAG to fully initialize. In the Swag folders, create the file `files.subdomain.conf`. ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/files.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/files.subdomain.conf ``` And paste the following configuration: diff --git a/content/en/6.recycled/3.alternatives/1.plex.md b/content/en/6.recycled/3.alternatives/1.plex.md index 23f1ba9..56b0e06 100644 --- a/content/en/6.recycled/3.alternatives/1.plex.md +++ b/content/en/6.recycled/3.alternatives/1.plex.md @@ -33,14 +33,15 @@ You’ll need to create a *Plex.tv* account. You don’t need to expose your Ple --- tree: /: - - docker: - - plex: - - compose.yml - - .env - - config/ - - transcode/ - - tautulli: - - config/ + - srv: + - docker: + - plex: + - compose.yml + - .env + - config/ + - transcode/ + - tautulli: + - config/ - media: - tvseries/ - movies/ @@ -75,8 +76,8 @@ services: - TZ=Europe/Paris - VERSION=docker volumes: - - /docker/plex/config:/config - - /docker/plex/transcode:/transcode + - /srv/docker/plex/config:/config + - /srv/docker/plex/transcode:/transcode - /media:/media restart: unless-stopped mem_limit: 4096m @@ -92,7 +93,7 @@ services: - PGID=${GUID} - TZ=Europe/Paris volumes: - - /docker/tautulli/config:/config + - /srv/docker/tautulli/config:/config ports: - 8181:8181 restart: unless-stopped @@ -220,8 +221,8 @@ Copy and rename the file `tautulli.subdomain.conf.sample` to `tautulli.subdomain :: ```bash [Terminal] -sudo cp /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf.sample /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf -sudo nano /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf +sudo cp /srv/docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf.sample /srv/docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf ``` Ensure the configuration matches the following, and edit it if needed: diff --git a/content/en/6.recycled/3.alternatives/2.qbittorrent for plex.md b/content/en/6.recycled/3.alternatives/2.qbittorrent for plex.md index 1816ded..d48a5e4 100644 --- a/content/en/6.recycled/3.alternatives/2.qbittorrent for plex.md +++ b/content/en/6.recycled/3.alternatives/2.qbittorrent for plex.md @@ -31,13 +31,14 @@ Here’s the system we’ll set up: --- tree: /: - - docker: - - seedbox: - - qbittorrent: - - config/ - - gluetun/ - - compose.yaml - - .env + - srv: + - docker: + - seedbox: + - qbittorrent: + - config/ + - gluetun/ + - compose.yaml + - .env - "media # linked to Plex and Qbittorrent": - "downloads/ # generic downloads, selected in settings" - "movies/ # used for downloading movies" @@ -77,7 +78,7 @@ services: - GSP_QBT_USERNAME=${ID} - GSP_QBT_PASSWORD=${PW} volumes: - - /docker/seedbox/qbittorrent/config:/config + - /srv/docker/seedbox/qbittorrent/config:/config - /media:/media depends_on: - gluetun @@ -88,7 +89,7 @@ services: restart: unless-stopped mem_limit: 4g volumes: - - /docker/gluetun/config.toml:/gluetun/auth/config.toml:ro + - /srv/docker/gluetun/config.toml:/gluetun/auth/config.toml:ro devices: - /dev/net/tun:/dev/net/tun ports: @@ -138,16 +139,16 @@ Open a terminal to generate the authentication key: sudo docker run --rm qmcgaw/gluetun genkey ``` -Note the key, then create the `/docker/gluetun` folder: +Note the key, then create the `/srv/docker/gluetun` folder: ```bash [Terminal] -sudo mkdir /docker/gluetun +sudo mkdir /srv/docker/gluetun ``` Create the `config.toml` file: ```bash [Terminal] -sudo nano /docker/gluetun/config.toml +sudo nano /srv/docker/gluetun/config.toml ``` Enter: @@ -273,7 +274,7 @@ Now create/edit `seedbox.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/seedbox.subdomain.conf ``` Paste the following config (check the port): diff --git a/content/en/6.recycled/3.alternatives/3.servarr for plex.md b/content/en/6.recycled/3.alternatives/3.servarr for plex.md index 1736f84..77694ed 100644 --- a/content/en/6.recycled/3.alternatives/3.servarr for plex.md +++ b/content/en/6.recycled/3.alternatives/3.servarr for plex.md @@ -28,23 +28,24 @@ We’ll start by deploying the stack and then proceed to configure each app and --- tree: /: - - docker: - - plex: - - compose.yml - - config/ - - transcode/ - - tautulli: - - config/ - - sonarr: - - config/ - - radarr: - - config/ - - bazarr: - - config/ - - prowlarr: - - config/ - - overseerr: - - config/ + - srv: + - docker: + - plex: + - compose.yml + - config/ + - transcode/ + - tautulli: + - config/ + - sonarr: + - config/ + - radarr: + - config/ + - bazarr: + - config/ + - prowlarr: + - config/ + - overseerr: + - config/ - media: - downloads/ - tvseries/ @@ -78,8 +79,8 @@ services: - VERSION=docker - PLEX_CLAIM= #optional volumes: - - /docker/plex/config:/config - - /docker/plex/transcode:/transcode #optional + - /srv/docker/plex/config:/config + - /srv/docker/plex/transcode:/transcode #optional - ${MEDIA_PATH}:/media labels: - com.centurylinklabs.watchtower.enable=true @@ -95,7 +96,7 @@ services: environment: - TZ=Europe/Paris volumes: - - /docker/tautulli/config:/config + - /srv/docker/tautulli/config:/config ports: - 8181:8181 restart: unless-stopped @@ -108,7 +109,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/sonarr/config:/config + - /srv/docker/sonarr/config:/config - ${MEDIA_PATH}:/media ports: - 8989:8989 @@ -122,7 +123,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/radarr/config:/config + - /srv/docker/radarr/config:/config - ${MEDIA_PATH}:/media ports: - 7878:7878 @@ -136,7 +137,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/prowlarr/data:/config + - /srv/docker/prowlarr/data:/config ports: - 9696:9696 restart: unless-stopped @@ -152,7 +153,7 @@ services: - PGID=${PGID} - TZ=Europe/Paris volumes: - - /docker/overseerr/config:/config + - /srv/docker/overseerr/config:/config ports: - 5055:5055 restart: unless-stopped @@ -166,7 +167,7 @@ services: - PGID=1000 - TZ=Europe/Paris volumes: - - /docker/bazarr/config:/config + - /srv/docker/bazarr/config:/config - ${MEDIA_PATH}:/media ports: - 6767:6767 @@ -455,7 +456,7 @@ Create and edit the file `films.subdomain.conf`: :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/films.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/films.subdomain.conf ``` Paste the following: diff --git a/content/en/6.recycled/3.alternatives/4.gitea.md b/content/en/6.recycled/3.alternatives/4.gitea.md index 4d3678e..97d6e17 100644 --- a/content/en/6.recycled/3.alternatives/4.gitea.md +++ b/content/en/6.recycled/3.alternatives/4.gitea.md @@ -21,9 +21,10 @@ This is an alternative to **Forgejo**, the community-run fork created after Gite --- tree: /: - - docker: - - gitea: - - data/ + - srv: + - docker: + - gitea: + - data/ --- :: @@ -120,7 +121,7 @@ Inside the Swag folders, create the file `gitea.subdomain.conf`. :: ```bash [Terminal] -sudo nano /docker/swag/config/nginx/proxy-confs/gitea.subdomain.conf +sudo nano /srv/docker/swag/config/nginx/proxy-confs/gitea.subdomain.conf ``` Paste the configuration below: @@ -188,7 +189,7 @@ Press :kbd{value="Ctrl+O"}, then :kbd{value="Enter"} to save, and :kbd{value="Ct Now open the `app.ini` file from the container's file system: ```bash [Terminal] -sudo nano /docker/gitea/data/gitea/conf/app.ini +sudo nano /srv/docker/gitea/data/gitea/conf/app.ini ``` Then modify the server section with your domain information: diff --git a/public/img/global/linux/btop.png b/public/img/global/linux/btop.png new file mode 100644 index 0000000..7e05008 Binary files /dev/null and b/public/img/global/linux/btop.png differ diff --git a/public/img/global/linux/duf.png b/public/img/global/linux/duf.png new file mode 100644 index 0000000..a9bff44 Binary files /dev/null and b/public/img/global/linux/duf.png differ diff --git a/public/img/global/linux/lazydocker.png b/public/img/global/linux/lazydocker.png new file mode 100644 index 0000000..fe8f6e8 Binary files /dev/null and b/public/img/global/linux/lazydocker.png differ