Add a Linux tips section and move Docker stacks to /srv/docker

This commit is contained in:
Djeex
2026-09-05 12:28:05 +02:00
parent 11d6c275c8
commit 142788d740
40 changed files with 894 additions and 330 deletions
+20
View File
@@ -66,3 +66,23 @@ Switches, NICs, and cabling
A budget N100 home server build 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
::
::
@@ -0,0 +1,2 @@
title: Linux tips for dummies
icon: i-lucide-terminal
@@ -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.
::
@@ -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**.
::
@@ -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 !
::
@@ -14,8 +14,8 @@ The other reason is that it stays out of your way. Appliance systems like Unraid
## Installation ## Installation
::note{icon="" to="https://www.iamtimsmith.com/blog/getting-started-with-the-linux-cli" target="_blank"} ::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 Linux CLI** and come back. 📋 __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 ### BIOS setup
@@ -342,13 +342,12 @@ Some essential apps youll likely need at some point, so might as well install
```bash [Terminal] ```bash [Terminal]
sudo apt update sudo apt update
sudo apt upgrade 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: ::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**.
- [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
## Useful Features ## Useful Features
### Firewall ### Firewall
+12 -11
View File
@@ -49,9 +49,9 @@ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
::note ::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] ```bash [Terminal]
sudo mkdir /docker sudo mkdir /srv/docker
``` ```
:: ::
@@ -67,9 +67,10 @@ sudo mkdir /docker
label: File structure we will create label: File structure we will create
tree: tree:
/: /:
- docker: - srv:
- dockge: - docker:
- compose.yml - dockge:
- compose.yml
--- ---
:: ::
@@ -77,14 +78,14 @@ tree:
#### Create the stack folder #### Create the stack folder
```bash [Terminal] ```bash [Terminal]
cd /docker cd /srv/docker
sudo mkdir dockge sudo mkdir dockge
``` ```
#### Create the compose file #### Create the compose file
```bash [Terminal] ```bash [Terminal]
cd /docker/dockge cd /srv/docker/dockge
sudo nano compose.yml sudo nano compose.yml
``` ```
Paste the following: Paste the following:
@@ -101,10 +102,10 @@ services:
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /docker/dockge/data:/app/data - /srv/docker/dockge/data:/app/data
- /docker:/docker - /srv/docker:/srv/docker
environment: 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. 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 #### Launch the container
```bash [Terminal] ```bash [Terminal]
cd /docker/dockge cd /srv/docker/dockge
sudo docker compose up -d sudo docker compose up -d
``` ```
+19 -17
View File
@@ -57,12 +57,13 @@ __Warning__: If your IP is not static, use a Dynamic DNS service ([DynDNS](https
--- ---
tree: tree:
/: /:
- docker: - srv:
- wg-easy: - docker:
- config: - wg-easy:
- etc_wireguard/ - config:
- compose.yaml - etc_wireguard/
- .env - compose.yaml
- .env
--- ---
:: ::
@@ -191,11 +192,12 @@ We assume the client server runs Linux with Docker installed.
--- ---
tree: tree:
/: /:
- docker: - srv:
- wireguard: - docker:
- config: - wireguard:
- wg_confs/ - config:
- compose.yaml - wg_confs/
- compose.yaml
--- ---
:: ::
@@ -203,7 +205,7 @@ tree:
### Create the folder ### Create the folder
```bash [Terminal] ```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"} ::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 ### Create the wg0.conf file
```bash [Terminal] ```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"}. 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=""} ::tip{icon=""}
✨ **Alternative method:** Transfer the file via SFTP and move it: ✨ **Alternative method:** Transfer the file via SFTP and move it:
```bash [Terminal] ```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 file
Create the `compose.yaml` file in `/docker/wireguard`: Create the `compose.yaml` file in `/srv/docker/wireguard`:
```yaml [compose.yaml] ```yaml [compose.yaml]
--- ---
@@ -242,7 +244,7 @@ services:
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/wireguard/config:/config - /srv/docker/wireguard/config:/config
- /lib/modules:/lib/modules - /lib/modules:/lib/modules
restart: unless-stopped restart: unless-stopped
``` ```
@@ -250,7 +252,7 @@ services:
### Start the container ### Start the container
```bash [Terminal] ```bash [Terminal]
cd /docker/wireguard cd /srv/docker/wireguard
sudo docker compose up -d sudo docker compose up -d
``` ```
+20 -19
View File
@@ -31,18 +31,19 @@ This tutorial assumes you have a domain name pointing to your server, and that y
label: File structure to modify label: File structure to modify
tree: tree:
/: /:
- docker: - srv:
- swag: - docker:
- config: - swag:
- dns-conf: - config:
- ovh.ini - dns-conf:
- nginx: - ovh.ini
- dbip.conf - nginx:
- nginx.conf - dbip.conf
- proxy-confs: - nginx.conf
- dockge.subdomain.conf - proxy-confs:
- compose.yml - dockge.subdomain.conf
- .env - compose.yml
- .env
--- ---
:: ::
@@ -71,7 +72,7 @@ services:
- EMAIL=${EMAIL} - EMAIL=${EMAIL}
- DOCKER_MODS=linuxserver/mods:swag-dbip|linuxserver/mods:swag-dashboard|linuxserver/mods:swag-auto-reload - DOCKER_MODS=linuxserver/mods:swag-dbip|linuxserver/mods:swag-dashboard|linuxserver/mods:swag-auto-reload
volumes: volumes:
- /docker/swag/config:/config - /srv/docker/swag/config:/config
ports: ports:
- 80:80 - 80:80
- 443:443 - 443:443
@@ -131,7 +132,7 @@ You can use **File Browser Quantum** to browse and edit files instead of using t
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/dns-conf/ovh.ini sudo nano /srv/docker/swag/config/dns-conf/ovh.ini
``` ```
You should see: 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: Now configure swag to access DBIP, the geolocation-based access control module. Open the `nginx.conf` file:
```bash [Terminal] ```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: 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) ![picture](https://www.linuxserver.io/user/pages/03.blog/introducing-swag-dashboard/example.png)
## DBIP ## 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, well configure it to block a list of countries known to be the source of most malicious traffic. Well also configure a variable to allow internal server traffic, your boxs local network, and a potential VPN in the 10.x.x.x range to access your services, but not the open internet. In this example, well configure it to block a list of countries known to be the source of most malicious traffic. Well also configure a variable to allow internal server traffic, your boxs local network, and a potential VPN in the 10.x.x.x range to access your services, but not the open internet.
@@ -194,7 +195,7 @@ This configuration can be enabled or disabled per service (see the Dockge exampl
### Open dbip.conf ### Open dbip.conf
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/nginx/dbip.conf sudo nano /srv/docker/swag/config/nginx/dbip.conf
``` ```
### Make your changes ### 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: Open the `dockge.subdomain.conf` file:
```bash [Terminal] ```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: 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: 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] ```bash [Terminal]
cd /docker/swag/config/proxy-confs cd /srv/docker/swag/config/proxy-confs
sudo cp servicename.subdomain.conf.sample servicename.subdomain.conf sudo cp servicename.subdomain.conf.sample servicename.subdomain.conf
``` ```
@@ -83,7 +83,7 @@ Create a file `tunnelconfig.yml` to reference in your SWAG `compose.yaml`.
:: ::
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/swag/config/tunnelconfig.yml sudo nano /srv/docker/swag/config/tunnelconfig.yml
``` ```
Paste: Paste:
@@ -108,7 +108,7 @@ Now configure _Cloudflare Real IP_.
Open the `nginx.conf` file: Open the `nginx.conf` file:
```bash [Terminal] ```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: Add the following at the end of the `http` section:
@@ -157,8 +157,8 @@ services:
ports: ports:
- 81:81 - 81:81
volumes: volumes:
- /docker/swag/config:/config - /srv/docker/swag/config:/config
- /docker/swag/config/fail2ban/fail2ban.sqlite3:/dashboard/fail2ban.sqlite3:ro - /srv/docker/swag/config/fail2ban/fail2ban.sqlite3:/dashboard/fail2ban.sqlite3:ro
restart: unless-stopped restart: unless-stopped
``` ```
+10 -9
View File
@@ -21,11 +21,12 @@ It supports a simple local username/password login out of the box, which is what
--- ---
tree: tree:
/: /:
- docker: - srv:
- tinyauth: - docker:
- compose.yaml - tinyauth:
- .env - compose.yaml
- data/ - .env
- data/
--- ---
:: ::
@@ -33,7 +34,7 @@ tree:
### Create the data folder ### Create the data folder
```bash [Terminal] ```bash [Terminal]
sudo mkdir -p /docker/tinyauth/data sudo mkdir -p /srv/docker/tinyauth/data
``` ```
### Generate a password hash ### Generate a password hash
@@ -61,7 +62,7 @@ services:
env_file: env_file:
- .env - .env
volumes: volumes:
- /docker/tinyauth/data:/data - /srv/docker/tinyauth/data:/data
ports: ports:
- 3000:3000 - 3000:3000
``` ```
@@ -180,7 +181,7 @@ In the Swag folders, create the file `tinyauth.subdomain.conf`:
:: ::
```bash [Terminal] ```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: 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 ### Open the app's subdomain.conf file
```bash [Terminal] ```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 ### Add the forward-auth check
+10 -9
View File
@@ -21,11 +21,12 @@ This makes it a good fit if you just need a simple, fast SSO backend, for exampl
--- ---
tree: tree:
/: /:
- docker: - srv:
- pocket-id: - docker:
- compose.yaml - pocket-id:
- .env - compose.yaml
- data/ - .env
- data/
--- ---
:: ::
@@ -33,7 +34,7 @@ tree:
### Create the data folder ### Create the data folder
```bash [Terminal] ```bash [Terminal]
sudo mkdir -p /docker/pocket-id/data sudo mkdir -p /srv/docker/pocket-id/data
``` ```
### Generate an encryption key ### Generate an encryption key
@@ -58,7 +59,7 @@ services:
env_file: env_file:
- .env - .env
volumes: volumes:
- /docker/pocket-id/data:/app/data - /srv/docker/pocket-id/data:/app/data
ports: ports:
- 1411:1411 - 1411:1411
healthcheck: healthcheck:
@@ -159,7 +160,7 @@ In the Swag folders, create the file `id.subdomain.conf`:
:: ::
```bash [Terminal] ```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: 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: Copy the __Client ID__ and __Client Secret__ Pocket ID gives you, then edit TinyAuth's `.env` file:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/tinyauth/.env sudo nano /srv/docker/tinyauth/.env
``` ```
Add the following: Add the following:
@@ -14,10 +14,11 @@ description: Install Uptime-Kuma to monitor your self-hosted services uptime, se
--- ---
tree: tree:
/: /:
- docker: - srv:
- uptime-kuma: - docker:
- data/ - uptime-kuma:
- compose.yaml - data/
- compose.yaml
--- ---
:: ::
@@ -33,7 +34,7 @@ services:
image: louislam/uptime-kuma:2-slim image: louislam/uptime-kuma:2-slim
container_name: uptime-kuma container_name: uptime-kuma
volumes: volumes:
- /docker/uptime-kuma/uptime-kuma-data:/app/data - /srv/docker/uptime-kuma/uptime-kuma-data:/app/data
ports: ports:
- 3200:3001 # <Host Port>:<Container Port> - 3200:3001 # <Host Port>:<Container Port>
restart: always restart: always
@@ -87,7 +88,7 @@ you can use **File Browser Quantum** to browse and edit your files instead of us
:: ::
```bash [Terminal] ```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: 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 ### Open the subdomain.conf file
```bash [Terminal] ```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 ### Add the forward-auth check and public paths
@@ -17,11 +17,12 @@ description: Install Dozzle to monitor Docker container logs in real time from a
--- ---
tree: tree:
/: /:
- docker: - srv:
- dozzle: - docker:
- compose.yaml - dozzle:
- .env - compose.yaml
- data/ - .env
- data/
--- ---
:: ::
@@ -125,7 +126,7 @@ In the Swag folder, create the `dozzle.subdomain.conf` file.
:: ::
```bash [Terminal] ```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: Paste the configuration below:
@@ -20,12 +20,13 @@ We will use the Docker image maintained by **LinuxServer.io**
--- ---
tree: tree:
/: /:
- docker: - srv:
- speedtest-tracker: - docker:
- compose.yaml - speedtest-tracker:
- .env - compose.yaml
- data: - .env
- config/ - data:
- config/
--- ---
:: ::
@@ -61,7 +62,7 @@ services:
- DB_CONNECTION=sqlite - DB_CONNECTION=sqlite
- SPEEDTEST_SCHEDULE=${SCHEDULE} - SPEEDTEST_SCHEDULE=${SCHEDULE}
volumes: volumes:
- /docker/speedtest-tracker/data/config:/config - /srv/docker/speedtest-tracker/data/config:/config
``` ```
### Set your environment variables ### 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: Open the `speedtest.subdomain.conf` file:
```bash [Terminal] ```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: Configure it like this:
@@ -18,12 +18,13 @@ Beszel includes a hub with a web UI and an agent that collects data from your se
--- ---
tree: tree:
/: /:
- docker: - srv:
- beszel: - docker:
- compose.yaml - beszel:
- .env - compose.yaml
- data/ - .env
- socket/ - data/
- socket/
--- ---
:: ::
@@ -195,7 +196,7 @@ In Swags config folders, create `beszel.subdomain.conf`.
:: ::
```bash [Terminal] ```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: Paste:
@@ -16,11 +16,12 @@ description: Install UpSnap to remotely wake up machines on your local network v
--- ---
tree: tree:
/: /:
- docker: - srv:
- upsnap: - docker:
- compose.yaml - upsnap:
- .env - compose.yaml
- data/ - .env
- data/
--- ---
:: ::
@@ -38,7 +39,7 @@ services:
network_mode: host network_mode: host
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- /docker/upsnap/data:/app/pb_data - /srv/docker/upsnap/data:/app/pb_data
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
- UPSNAP_SCAN_RANGE=${SCAN_RANGE} - UPSNAP_SCAN_RANGE=${SCAN_RANGE}
@@ -137,7 +138,7 @@ In the Swag folders, create the file `upsnap.subdomain.conf`.
:: ::
```bash [Terminal] ```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: And paste the following configuration:
+7 -6
View File
@@ -25,11 +25,12 @@ Unlike Plex, Jellyfin has no cloud relay: to access your server outside your loc
--- ---
tree: tree:
/: /:
- docker: - srv:
- jellyfin: - docker:
- compose.yaml - jellyfin:
- .env - compose.yaml
- config/ - .env
- config/
- media: - media:
- tvseries/ - tvseries/
- movies/ - movies/
@@ -61,7 +62,7 @@ services:
- PGID=${GUID} - PGID=${GUID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/jellyfin/config:/config - /srv/docker/jellyfin/config:/config
- /media:/media - /media:/media
restart: unless-stopped restart: unless-stopped
devices: devices:
+14 -13
View File
@@ -26,13 +26,14 @@ Heres the system well set up:
--- ---
tree: tree:
/: /:
- docker: - srv:
- seedbox: - docker:
- qbittorrent: - seedbox:
- config/ - qbittorrent:
- gluetun/ - config/
- compose.yaml - gluetun/
- .env - compose.yaml
- .env
- "media # linked to Jellyfin and Qbittorrent": - "media # linked to Jellyfin and Qbittorrent":
- "downloads/ # generic downloads, selected in settings" - "downloads/ # generic downloads, selected in settings"
- "movies/ # used for downloading movies" - "movies/ # used for downloading movies"
@@ -72,7 +73,7 @@ services:
- GSP_QBT_USERNAME=${ID} - GSP_QBT_USERNAME=${ID}
- GSP_QBT_PASSWORD=${PW} - GSP_QBT_PASSWORD=${PW}
volumes: volumes:
- /docker/seedbox/qbittorrent/config:/config - /srv/docker/seedbox/qbittorrent/config:/config
- /media:/media - /media:/media
depends_on: depends_on:
- gluetun - gluetun
@@ -83,7 +84,7 @@ services:
restart: unless-stopped restart: unless-stopped
mem_limit: 4g mem_limit: 4g
volumes: volumes:
- /docker/gluetun/config.toml:/gluetun/auth/config.toml:ro - /srv/docker/gluetun/config.toml:/gluetun/auth/config.toml:ro
devices: devices:
- /dev/net/tun:/dev/net/tun - /dev/net/tun:/dev/net/tun
ports: ports:
@@ -133,16 +134,16 @@ Open a terminal to generate the authentication key:
sudo docker run --rm qmcgaw/gluetun genkey 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] ```bash [Terminal]
sudo mkdir /docker/gluetun sudo mkdir /srv/docker/gluetun
``` ```
Create the `config.toml` file: Create the `config.toml` file:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/gluetun/config.toml sudo nano /srv/docker/gluetun/config.toml
``` ```
Enter: Enter:
@@ -272,7 +273,7 @@ Now create/edit `seedbox.subdomain.conf`.
:: ::
```bash [Terminal] ```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): Paste the following config (check the port):
+25 -24
View File
@@ -23,21 +23,22 @@ Well start by deploying the stack and then proceed to configure each app and
--- ---
tree: tree:
/: /:
- docker: - srv:
- jellyfin: - docker:
- compose.yml - jellyfin:
- .env - compose.yml
- config/ - .env
- sonarr: - config/
- config/ - sonarr:
- radarr: - config/
- config/ - radarr:
- bazarr: - config/
- config/ - bazarr:
- prowlarr: - config/
- config/ - prowlarr:
- seerr: - config/
- config/ - seerr:
- config/
- media: - media:
- downloads/ - downloads/
- tvseries/ - tvseries/
@@ -66,7 +67,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/jellyfin/config:/config - /srv/docker/jellyfin/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
restart: unless-stopped restart: unless-stopped
devices: devices:
@@ -82,7 +83,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/sonarr/config:/config - /srv/docker/sonarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 8989:8989 - 8989:8989
@@ -96,7 +97,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/radarr/config:/config - /srv/docker/radarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 7878:7878 - 7878:7878
@@ -110,7 +111,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/prowlarr/data:/config - /srv/docker/prowlarr/data:/config
ports: ports:
- 9696:9696 - 9696:9696
restart: unless-stopped restart: unless-stopped
@@ -122,7 +123,7 @@ services:
- LOG_LEVEL=info - LOG_LEVEL=info
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/seerr/config:/app/config - /srv/docker/seerr/config:/app/config
ports: ports:
- 5055:5055 - 5055:5055
restart: unless-stopped restart: unless-stopped
@@ -136,7 +137,7 @@ services:
- PGID=1000 - PGID=1000
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/bazarr/config:/config - /srv/docker/bazarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 6767:6767 - 6767:6767
@@ -173,10 +174,10 @@ MEDIA_PATH=
::note ::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] ```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] ```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: Paste the following:
+7 -6
View File
@@ -16,11 +16,12 @@ description: Install Immich, a self-hosted alternative to Google Photos and iClo
--- ---
tree: tree:
/: /:
- docker: - srv:
- immich: - docker:
- library/ - immich:
- compose.yaml - library/
- .env - compose.yaml
- .env
--- ---
:: ::
@@ -100,7 +101,7 @@ In the SWAG folders, create a file named `immich.subdomain.conf`.
:: ::
```bash [Terminal] ```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: Then paste the following configuration:
+12 -11
View File
@@ -20,12 +20,13 @@ We'll be using the Docker image maintained by **LinuxServer.io**
--- ---
tree: tree:
/: /:
- docker: - srv:
- nextcloud: - docker:
- config/ - nextcloud:
- data/ - config/
- compose.yaml - data/
- .env - compose.yaml
- .env
--- ---
:: ::
@@ -45,8 +46,8 @@ services:
- PGID=${GUID} - PGID=${GUID}
- TZ=Etc/UTC - TZ=Etc/UTC
volumes: volumes:
- /docker/nextcloud/config:/config - /srv/docker/nextcloud/config:/config
- /docker/nextcloud/data:/data - /srv/docker/nextcloud/data:/data
ports: ports:
- ${PORT}:443 - ${PORT}:443
restart: unless-stopped restart: unless-stopped
@@ -54,7 +55,7 @@ services:
::note{to="/general/networking/samba"} ::note{to="/general/networking/samba"}
If youre using a NAS or network-shared drive via **Samba**, replace `/docker/nextcloud/data` with the path to your shared folder. If youre 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 ### Set your environment variables
@@ -129,7 +130,7 @@ In Nextclouds files, edit the `config.php` file:
:: ::
```bash [Terminal] ```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 `);`: 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 Swags folders, create the file `nextcloud.subdomain.conf`: In Swags folders, create the file `nextcloud.subdomain.conf`:
```bash [Terminal] ```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: Paste the following:
@@ -16,12 +16,13 @@ description: Install File Browser Quantum, a modernized fork of File Browser, to
--- ---
tree: tree:
/: /:
- docker: - srv:
- filebrowser-quantum: - docker:
- compose.yaml - filebrowser-quantum:
- data: - compose.yaml
- config.yaml - data:
- filebrowser.sqlite - config.yaml
- filebrowser.sqlite
--- ---
:: ::
@@ -31,13 +32,13 @@ tree:
Create the data folder: Create the data folder:
```bash [Terminal] ```bash [Terminal]
sudo mkdir -p /docker/filebrowser-quantum/data sudo mkdir -p /srv/docker/filebrowser-quantum/data
``` ```
Create the `config.yaml` file: Create the `config.yaml` file:
```bash [Terminal] ```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: 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: server:
cacheDir: /home/filebrowser/data/tmp cacheDir: /home/filebrowser/data/tmp
sources: sources:
- path: /docker - path: /srv/docker
config: config:
defaultEnabled: true defaultEnabled: true
- path: /media - path: /media
@@ -68,16 +69,16 @@ services:
image: gtstef/filebrowser:beta image: gtstef/filebrowser:beta
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- /docker:/docker - /srv/docker:/srv/docker
- /media:/media - /media:/media
- /docker/filebrowser-quantum/data:/home/filebrowser/data - /srv/docker/filebrowser-quantum/data:/home/filebrowser/data
ports: ports:
- 8020:80 - 8020:80
``` ```
::note ::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=""} ::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`. In the Swag folders, create the file `fbq.subdomain.conf`.
```bash [Terminal] ```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: And paste the following configuration:
+4 -4
View File
@@ -27,9 +27,9 @@ services:
ports: ports:
- 3600:3000 - 3600:3000
volumes: volumes:
- /docker/pingvin/data:/opt/app/backend/data - /srv/docker/pingvin/data:/opt/app/backend/data
- /docker/pingvin/data/img:/opt/app/frontend/public/img - /srv/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/uploads:/opt/app/backend/uploads # path to the folder where you want to store files uploaded to pingvin. Change to your preference.
depends_on: depends_on:
clamav: clamav:
condition: service_healthy condition: service_healthy
@@ -121,7 +121,7 @@ In the Swag folders, create the `pingvin.subdomain.conf` file.
:: ::
```bash [Terminal] ```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: Paste the configuration below:
@@ -29,11 +29,12 @@ For this setup, well use the **image maintained by LinuxServer.io**.
--- ---
tree: tree:
/: /:
- docker: - srv:
- code-server: - docker:
- compose.yaml - code-server:
- .env - compose.yaml
- config/ - .env
- config/
- (any folder you want to mount in VS Code)/ - (any folder you want to mount in VS Code)/
--- ---
:: ::
@@ -55,7 +56,7 @@ services:
- TZ=Etc/UTC - TZ=Etc/UTC
- HASHED_PASSWORD=${PW} - HASHED_PASSWORD=${PW}
volumes: volumes:
- /docker/code-server/config:/config - /srv/docker/code-server/config:/config
# add folders to mount in VS Code # add folders to mount in VS Code
# - /path/to/folder:/folder # - /path/to/folder:/folder
ports: ports:
@@ -172,7 +173,7 @@ Inside the Swag config folders, create the file `code.subdomain.conf`.
:: ::
```bash [Terminal] ```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: Paste the following configuration:
@@ -17,11 +17,12 @@ description: Install Forgejo, a lightweight self-hosted Git service to manage yo
--- ---
tree: tree:
/: /:
- docker: - srv:
- forgejo: - docker:
- compose.yaml - forgejo:
- .env - compose.yaml
- data/ - .env
- data/
--- ---
:: ::
@@ -118,7 +119,7 @@ Inside the Swag folders, create the file `forgejo.subdomain.conf`.
:: ::
```bash [Terminal] ```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: 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: Now open the `app.ini` file from the container's file system:
```bash [Terminal] ```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: Then modify the server section with your domain information:
@@ -102,7 +102,7 @@ Inside the Swag folders, create the file `tools.subdomain.conf`.
:: ::
```bash [Terminal] ```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: Paste the configuration below:
+12 -11
View File
@@ -35,18 +35,19 @@ This is how ads and malicious domains are blocked: Adguard blocks only the bad d
--- ---
tree: tree:
/: /:
- docker: - srv:
- adguard: - docker:
- confdir/ - adguard:
- workdir/ - confdir/
- compose.yaml - workdir/
- .env - compose.yaml
- .env
--- ---
:: ::
::note ::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"} ::steps{level="3"}
@@ -70,9 +71,9 @@ services:
- 853:853/tcp - 853:853/tcp
- 3000:3000/tcp - 3000:3000/tcp
volumes: volumes:
- /docker/adguardhome/confdir:/opt/adguardhome/conf - /srv/docker/adguardhome/confdir:/opt/adguardhome/conf
- /docker/adguardhome/workdir:/opt/adguardhome/work - /srv/docker/adguardhome/workdir:/opt/adguardhome/work
- /docker/swag/config/etc/letsencrypt:/swag-ssl:ro - /srv/docker/swag/config/etc/letsencrypt:/swag-ssl:ro
``` ```
::tip{icon=""} ::tip{icon=""}
@@ -149,7 +150,7 @@ You can use **File Browser Quantum** to browse and edit files instead of using t
:: ::
```bash [Terminal] ```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: Paste the configuration below:
+8 -7
View File
@@ -18,11 +18,12 @@ Vaultwarden is a fork of [Bitwarden](https://bitwarden.com/fr-fr/help/).
--- ---
tree: tree:
/: /:
- docker: - srv:
- vaultwarden: - docker:
- data/ - vaultwarden:
- compose.yaml - data/
- .env - compose.yaml
- .env
--- ---
:: ::
@@ -152,7 +153,7 @@ In SWAG's config folder, create the file `vault.subdomain.conf`:
:: ::
```bash [Terminal] ```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: And paste the following configuration:
@@ -267,7 +268,7 @@ https://vault.yourdomain.com/identity/connect/oidc-signin
Edit Vaultwarden's `.env` file: Edit Vaultwarden's `.env` file:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/vaultwarden/.env sudo nano /srv/docker/vaultwarden/.env
``` ```
Add the following: Add the following:
+23 -22
View File
@@ -39,14 +39,15 @@ Both modes can be configured on a per-application basis.
--- ---
tree: tree:
/: /:
- docker: - srv:
- authentik: - docker:
- .env - authentik:
- compose.yml - .env
- media/ - compose.yml
- certs/ - media/
- custom-template/ - certs/
- ssh/ - custom-template/
- ssh/
--- ---
:: ::
@@ -54,12 +55,12 @@ tree:
### Create the folders ### Create the folders
```bash [Terminal] ```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 ### 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] ```bash [Terminal]
sudo echo "PG_PASS=$(openssl rand 36 | base64)" >> .env 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: 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] ```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] ```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: 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: Create the `auth.subdomain.conf` file:
```bash [Terminal] ```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: 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`: Edit the file `dockge.mydomain.com`:
```bash [Terminal] ```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;` Uncomment the two lines `#include /config/nginx/authentik-server.conf;`
@@ -437,10 +438,10 @@ We assume youve 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`. 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 havent 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 havent 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] ```bash [Terminal]
sudo mkdir -P /docker/authentik-outpost sudo mkdir -P /srv/docker/authentik-outpost
``` ```
::tip{icon="" to="/serveex/files/file-browser-quantum"} ::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: Via command line:
```bash [Terminal] ```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. 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): 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] ```bash [Terminal]
sudo nano /docker/swag/compose.yaml sudo nano /srv/docker/swag/compose.yaml
``` ```
```yaml [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: Otherwise, via terminal:
```bash [Terminal] ```bash [Terminal]
cd /docker/swag/ cd /srv/docker/swag/
sudo docker compose up -d 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: Via command line:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/authentik-outpost/.env sudo nano /srv/docker/authentik-outpost/.env
``` ```
Paste the following configuration: Paste the following configuration:
@@ -556,7 +557,7 @@ If using Dockge, deploy the stack.
Otherwise, via terminal: Otherwise, via terminal:
```bash [Terminal] ```bash [Terminal]
cd /docker/authentik-outpost/ cd /srv/docker/authentik-outpost/
sudo docker compose up -d sudo docker compose up -d
``` ```
@@ -569,7 +570,7 @@ Now, lets configure SWAG.
Open the `authentik-server.conf` file: Open the `authentik-server.conf` file:
```bash [Terminal] ```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: In the file, change `authentik-server` to `authentik-outpost` as shown:
+9 -8
View File
@@ -29,11 +29,12 @@ Arcane needs access to the Docker socket to manage containers, which is effectiv
--- ---
tree: tree:
/: /:
- docker: - srv:
- arcane: - docker:
- compose.yaml - arcane:
- .env - compose.yaml
- data/ - .env
- data/
--- ---
:: ::
@@ -61,7 +62,7 @@ services:
env_file: env_file:
- .env - .env
volumes: volumes:
- /docker/arcane/data:/app/data - /srv/docker/arcane/data:/app/data
networks: networks:
- arcane-internal - arcane-internal
ports: ports:
@@ -200,7 +201,7 @@ In the Swag folders, create the file `arcane.subdomain.conf`:
:: ::
```bash [Terminal] ```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: Paste the following configuration:
@@ -275,7 +276,7 @@ services:
- MANAGER_API_URL=http://10.8.0.3:3552 - MANAGER_API_URL=http://10.8.0.3:3552
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /docker/arcane-agent/data:/app/data - /srv/docker/arcane-agent/data:/app/data
``` ```
::note ::note
@@ -60,12 +60,13 @@ __Warning:__ This guide uses version `14` of **wg-easy**. Version `15` introduce
--- ---
tree: tree:
/: /:
- docker: - srv:
- wg-easy: - docker:
- config: - wg-easy:
- etc_wireguard/ - config:
- compose.yaml - etc_wireguard/
- .env - compose.yaml
- .env
--- ---
:: ::
@@ -98,7 +99,7 @@ services:
image: ghcr.io/wg-easy/wg-easy:14 image: ghcr.io/wg-easy/wg-easy:14
container_name: wg-easy container_name: wg-easy
volumes: volumes:
- /docker/wg_easy/config/etc_wireguard:/etc/wireguard - /srv/docker/wg_easy/config/etc_wireguard:/etc/wireguard
restart: unless-stopped restart: unless-stopped
cap_add: cap_add:
- NET_ADMIN - NET_ADMIN
@@ -175,25 +176,26 @@ Assumes the client is a Linux server with Docker installed
--- ---
tree: tree:
/: /:
- docker: - srv:
- wireguard: - docker:
- config: - wireguard:
- wg_confs/ - config:
- compose.yaml - wg_confs/
- compose.yaml
--- ---
:: ::
::steps{level="3"} ::steps{level="3"}
### Create the config folder ### 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{icon="" to="/serveex/files/file-browser-quantum"}
✨ __Tip:__ Use **File Browser** to browse and edit files without terminal ✨ __Tip:__ Use **File Browser** to browse and edit files without terminal
:: ::
```bash [Terminal] ```bash [Terminal]
sudo mkdir -p /docker/wireguard/config/wg_confs sudo mkdir -p /srv/docker/wireguard/config/wg_confs
``` ```
### Copy the configuration file ### 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: ✨ __Tip:__ Easiest way is to transfer the file via SFTP to `/home/youruser`, then move it:
```bash [Terminal] ```bash [Terminal]
sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs sudo cp ~/wg0.conf /srv/docker/wireguard/config/wg_confs
``` ```
:: ::
### Deploy the container ### Deploy the container
Create `compose.yaml` in `/docker/wireguard`: Create `compose.yaml` in `/srv/docker/wireguard`:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/wireguard/compose.yaml sudo nano /srv/docker/wireguard/compose.yaml
``` ```
Paste: Paste:
@@ -231,7 +233,7 @@ services:
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/wireguard/config:/config - /srv/docker/wireguard/config:/config
- /lib/modules:/lib/modules #optional - /lib/modules:/lib/modules #optional
restart: unless-stopped 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: Start the container:
```bash [Terminal] ```bash [Terminal]
cd /docker/wireguard cd /srv/docker/wireguard
sudo docker compose up -d sudo docker compose up -d
``` ```
@@ -28,8 +28,8 @@ services:
filebrowser: filebrowser:
container_name: filebrowser container_name: filebrowser
volumes: volumes:
- /docker/filebrowser/config:/config/ - /srv/docker/filebrowser/config:/config/
- /path/to/your/folders:/yourfolders #add your folders to browse as /docker:/docker for exemple - /path/to/your/folders:/yourfolders #add your folders to browse as /srv/docker:/srv/docker for exemple
ports: ports:
- 8010:80 - 8010:80
image: filebrowser/filebrowser:s6 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`. In the Swag folders, create the file `files.subdomain.conf`.
```bash [Terminal] ```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: And paste the following configuration:
+14 -13
View File
@@ -33,14 +33,15 @@ Youll need to create a *Plex.tv* account. You dont need to expose your Ple
--- ---
tree: tree:
/: /:
- docker: - srv:
- plex: - docker:
- compose.yml - plex:
- .env - compose.yml
- config/ - .env
- transcode/ - config/
- tautulli: - transcode/
- config/ - tautulli:
- config/
- media: - media:
- tvseries/ - tvseries/
- movies/ - movies/
@@ -75,8 +76,8 @@ services:
- TZ=Europe/Paris - TZ=Europe/Paris
- VERSION=docker - VERSION=docker
volumes: volumes:
- /docker/plex/config:/config - /srv/docker/plex/config:/config
- /docker/plex/transcode:/transcode - /srv/docker/plex/transcode:/transcode
- /media:/media - /media:/media
restart: unless-stopped restart: unless-stopped
mem_limit: 4096m mem_limit: 4096m
@@ -92,7 +93,7 @@ services:
- PGID=${GUID} - PGID=${GUID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/tautulli/config:/config - /srv/docker/tautulli/config:/config
ports: ports:
- 8181:8181 - 8181:8181
restart: unless-stopped restart: unless-stopped
@@ -220,8 +221,8 @@ Copy and rename the file `tautulli.subdomain.conf.sample` to `tautulli.subdomain
:: ::
```bash [Terminal] ```bash [Terminal]
sudo cp /docker/swag/config/nginx/proxy-confs/tautulli.subdomain.conf.sample /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 /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: Ensure the configuration matches the following, and edit it if needed:
@@ -31,13 +31,14 @@ Heres the system well set up:
--- ---
tree: tree:
/: /:
- docker: - srv:
- seedbox: - docker:
- qbittorrent: - seedbox:
- config/ - qbittorrent:
- gluetun/ - config/
- compose.yaml - gluetun/
- .env - compose.yaml
- .env
- "media # linked to Plex and Qbittorrent": - "media # linked to Plex and Qbittorrent":
- "downloads/ # generic downloads, selected in settings" - "downloads/ # generic downloads, selected in settings"
- "movies/ # used for downloading movies" - "movies/ # used for downloading movies"
@@ -77,7 +78,7 @@ services:
- GSP_QBT_USERNAME=${ID} - GSP_QBT_USERNAME=${ID}
- GSP_QBT_PASSWORD=${PW} - GSP_QBT_PASSWORD=${PW}
volumes: volumes:
- /docker/seedbox/qbittorrent/config:/config - /srv/docker/seedbox/qbittorrent/config:/config
- /media:/media - /media:/media
depends_on: depends_on:
- gluetun - gluetun
@@ -88,7 +89,7 @@ services:
restart: unless-stopped restart: unless-stopped
mem_limit: 4g mem_limit: 4g
volumes: volumes:
- /docker/gluetun/config.toml:/gluetun/auth/config.toml:ro - /srv/docker/gluetun/config.toml:/gluetun/auth/config.toml:ro
devices: devices:
- /dev/net/tun:/dev/net/tun - /dev/net/tun:/dev/net/tun
ports: ports:
@@ -138,16 +139,16 @@ Open a terminal to generate the authentication key:
sudo docker run --rm qmcgaw/gluetun genkey 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] ```bash [Terminal]
sudo mkdir /docker/gluetun sudo mkdir /srv/docker/gluetun
``` ```
Create the `config.toml` file: Create the `config.toml` file:
```bash [Terminal] ```bash [Terminal]
sudo nano /docker/gluetun/config.toml sudo nano /srv/docker/gluetun/config.toml
``` ```
Enter: Enter:
@@ -273,7 +274,7 @@ Now create/edit `seedbox.subdomain.conf`.
:: ::
```bash [Terminal] ```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): Paste the following config (check the port):
@@ -28,23 +28,24 @@ Well start by deploying the stack and then proceed to configure each app and
--- ---
tree: tree:
/: /:
- docker: - srv:
- plex: - docker:
- compose.yml - plex:
- config/ - compose.yml
- transcode/ - config/
- tautulli: - transcode/
- config/ - tautulli:
- sonarr: - config/
- config/ - sonarr:
- radarr: - config/
- config/ - radarr:
- bazarr: - config/
- config/ - bazarr:
- prowlarr: - config/
- config/ - prowlarr:
- overseerr: - config/
- config/ - overseerr:
- config/
- media: - media:
- downloads/ - downloads/
- tvseries/ - tvseries/
@@ -78,8 +79,8 @@ services:
- VERSION=docker - VERSION=docker
- PLEX_CLAIM= #optional - PLEX_CLAIM= #optional
volumes: volumes:
- /docker/plex/config:/config - /srv/docker/plex/config:/config
- /docker/plex/transcode:/transcode #optional - /srv/docker/plex/transcode:/transcode #optional
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
labels: labels:
- com.centurylinklabs.watchtower.enable=true - com.centurylinklabs.watchtower.enable=true
@@ -95,7 +96,7 @@ services:
environment: environment:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/tautulli/config:/config - /srv/docker/tautulli/config:/config
ports: ports:
- 8181:8181 - 8181:8181
restart: unless-stopped restart: unless-stopped
@@ -108,7 +109,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/sonarr/config:/config - /srv/docker/sonarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 8989:8989 - 8989:8989
@@ -122,7 +123,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/radarr/config:/config - /srv/docker/radarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 7878:7878 - 7878:7878
@@ -136,7 +137,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/prowlarr/data:/config - /srv/docker/prowlarr/data:/config
ports: ports:
- 9696:9696 - 9696:9696
restart: unless-stopped restart: unless-stopped
@@ -152,7 +153,7 @@ services:
- PGID=${PGID} - PGID=${PGID}
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/overseerr/config:/config - /srv/docker/overseerr/config:/config
ports: ports:
- 5055:5055 - 5055:5055
restart: unless-stopped restart: unless-stopped
@@ -166,7 +167,7 @@ services:
- PGID=1000 - PGID=1000
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /docker/bazarr/config:/config - /srv/docker/bazarr/config:/config
- ${MEDIA_PATH}:/media - ${MEDIA_PATH}:/media
ports: ports:
- 6767:6767 - 6767:6767
@@ -455,7 +456,7 @@ Create and edit the file `films.subdomain.conf`:
:: ::
```bash [Terminal] ```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: Paste the following:
@@ -21,9 +21,10 @@ This is an alternative to **Forgejo**, the community-run fork created after Gite
--- ---
tree: tree:
/: /:
- docker: - srv:
- gitea: - docker:
- data/ - gitea:
- data/
--- ---
:: ::
@@ -120,7 +121,7 @@ Inside the Swag folders, create the file `gitea.subdomain.conf`.
:: ::
```bash [Terminal] ```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: 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: Now open the `app.ini` file from the container's file system:
```bash [Terminal] ```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: Then modify the server section with your domain information:
Binary file not shown.

After

Width:  |  Height:  |  Size: 490 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 760 KiB