feat: initial infra repo

- docker-services: 14 generic compose templates (portainer, npm, vaultwarden, gitea, jotty, nextcloud-aio, rustdesk, audiobookshelf, calibre-web, plex, erugo, jswiki, speedtest, watchtower)
- install-scripts: bash scripts for Ubuntu server bootstrap, docker, portainer, npm, backup, restore
- ansible: 4 playbooks (bootstrap, deploy-services, update-services, security-hardening) + roles skeleton
- hermes-install: Hermes CLI setup on macOS
- macos-setup: Brewfile + osx-defaults + fish-config
- home-nas-tools: metadata index for NAS projects (no binaries)
- docs: architecture, security, contributing
- README, LICENSE (MIT), .gitignore
This commit is contained in:
2026-08-01 16:25:58 +02:00
commit 444191d16d
73 changed files with 4032 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
# 📦 Docker Services
> Generické `docker-compose.yml` šablony pro self-hosted služby.
> Každá služba má **vlastní složku**, `.env.example` (šablona) a **README** s dokumentací.
## 🎯 Jak použít
```bash
# 1. Vyber službu
cd services/<service>
# 2. Vytvoř .env z šablony
cp .env.example .env
nano .env # nastav POUZE potřebné hodnoty (hesla, cesty)
# 3. Nasaď
docker compose up -d
# 4. Ověř
docker compose ps
docker compose logs -f
```
## 📚 Rejstřík služeb
| Služba | Účel | Port | Image |
|---|---|---|---|
| [`portainer`](portainer/) | Docker UI management | `9000`, `9443` | `portainer/portainer-ce` |
| [`nginx-proxy-manager`](nginx-proxy-manager/) | Reverse proxy + HTTPS | `80`, `443`, `81` | `jc21/nginx-proxy-manager` |
| [`vaultwarden`](vaultwarden/) | Správce hesel | `2999` | `vaultwarden/server` |
| [`nextcloud-aio`](nextcloud-aio/) | Cloud (soubory, kalendář) | `11000` | `nextcloud/all-in-one` |
| [`gitea`](gitea/) | Git server | `3000`, `222` | `gitea/gitea` |
| [`jotty`](jotty/) | Poznámky & checklisty | `1122` | `mrx23dotcom/jotty` |
| [`rustdesk`](rustdesk/) | Remote desktop | `21115-21119` | `rustdesk/rustdesk-server` |
| [`audiobookshelf`](audiobookshelf/) | Audio knihovna | `13378` | `advplyr/audiobookshelf` |
| [`calibre-web`](calibre-web/) | E-knihovna | `8083` | `linuxserver/calibre-web` |
| [`plex`](plex/) | Media server | `32400` | `linuxserver/plex` |
| [`erugo`](erugo/) | File sharing | `61080` | `wardy784/erugo` |
| [`jswiki`](jswiki/) | Wiki | `9180` | `linuxserver/wikijs` |
| [`speedtest`](speedtest/) | Speedtest tracker | `8072` | `linuxserver/speedtest-tracker` |
| [`watchtower`](watchtower/) | Auto-update kontejnerů | | `containrrr/watchtower` |
## 🧱 Společné konvence
Všechny compose soubory v tomto adresáři dodržují:
- **Porty:** nikdy nepoužívat konfliktní porty s ostatními službami
- **Volume:** `./data:/data` (host container, snadná záloha)
- **Restart:** `unless-stopped`
- **Network:** výchozí `bridge`, případně vlastní `*-net`
- **User:** `1000:1000` pro souborový přístup
- **Logging:** `json-file` driver, max 10 MB × 3 soubory
- **TZ:** `Europe/Prague`
- **Environment:** `.env` soubor (šablona `.env.example` v gitu)
## 🛡 Bezpečnost
-**Žádná hesla v `docker-compose.yml`** vše v `.env` (gitignored)
-**Restart policy** zamezí nechtěnému spuštění po rebootu
-**Networks** izolované `bridge` pro každou službu
-**Read-only filesystémy** kde to jde (`/etc/timezone`, `/etc/localtime`)
## 🗂 Struktura
```
docker-services/
├── README.md # Tento soubor
├── portainer/
│ ├── docker-compose.yml
│ ├── .env.example
│ └── README.md
├── nginx-proxy-manager/
│ ├── docker-compose.yml
│ ├── .env.example
│ └── README.md
└── ... (další služby)
```
## 🔄 Aktualizace služeb
```bash
# Pomocí Watchtower (auto-update)
docker compose pull && docker compose up -d
# Nebo ručně
cd services/<service>
docker compose pull
docker compose up -d
```
## 📦 Zálohování
Všechna data jsou v `./data/` uvnitř každé služby. Zálohuj celé adresáře:
```bash
# Pomocí našeho nástroje z install-scripts/
sudo bash install-scripts/backup-all.sh
```
@@ -0,0 +1,4 @@
# Audiobookshelf proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
+57
View File
@@ -0,0 +1,57 @@
# Audiobookshelf audio knihovna
> Self-hosted audio knihovna. Stream audioknih, podcastů. Sledování pokroku.
## 📋 Přehled
- **Image:** `advplyr/audiobookshelf:latest`
- **Port:** `13378` (web)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
docker compose up -d
```
## 🌐 Přístup
- **Web:** `http://<server>:13378`
- **Mobile app:** vyhledej "Audiobookshelf" v App Store/Google Play
## 🎯 Funkce
- **Audioknihy** upload (mp3, m4b, m4a, flac, …)
- **Podcasty** RSS subscribe
- **Progress tracking** synchronizace mezi zařízeními
- **Multi-user** každý má svou knihovnu
- **Transkripce** vyhledávání v textu (s AI)
- **OPDS** kompatibilní s jinými čtečkami
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/data` | Databáze, config, cache |
| `./audiobooks:/audiobooks` | Tvoje knihovna (readonly) |
| `./podcasts:/podcasts` | Auto-download podcasty |
## 🔐 Bezpečnost
- **2FA** pro admin účet
- **HTTPS** terminuj v NPM
- **Auth proxy** integrovaný (OIDC)
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
## 📚 Dokumentace
- [Audiobookshelf](https://www.audiobookshelf.org/)
- [GitHub](https://github.com/advplyr/audiobookshelf)
@@ -0,0 +1,29 @@
# Audiobookshelf audio knihovna
services:
audiobookshelf:
image: advplyr/audiobookshelf:latest
container_name: audiobookshelf
restart: unless-stopped
ports:
- "13378:80"
volumes:
- ./data:/data
- ./audiobooks:/audiobooks
- ./podcasts:/podcasts
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
networks:
- audiobookshelf_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
audiobookshelf_net:
name: audiobookshelf_default
driver: bridge
+4
View File
@@ -0,0 +1,4 @@
# Calibre-Web proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
+53
View File
@@ -0,0 +1,53 @@
# Calibre-Web e-knihovna
> Web čtečka e-knihoven. Calibre metadata, OPDS, Kindle send.
## 📋 Přehled
- **Image:** `linuxserver/calibre-web:latest`
- **Port:** `8083` (web)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
docker compose up -d
```
Pak v prohlížeči otevři `http://<server>:8083` a dokonči setup (admin účet, cesta ke knihovně).
## 🎯 Funkce
- **Čtení online** v prohlížeči, EPUB/PDF
- **Send to Kindle** email na Kindle
- **OPDS** kompatibilní s jinými čtečkami
- **Multi-user** s admin/user oprávněními
- **Metadata** z Goodreads, Google Books
- **Tagy, série, autoři** plná Calibre metadata
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/config` | Calibre-Web konfigurace, DB |
| `./books:/books` | Tvoje knihovna (knihy) |
## 🔐 Bezpečnost
- **Admin heslo** silné
- **HTTPS** terminuj v NPM
- **Magic link** email login (vyžaduje SMTP)
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
## 📚 Dokumentace
- [Calibre-Web GitHub](https://github.com/janeczku/calibre-web)
- [LinuxServer.io](https://docs.linuxserver.io/images/docker-calibre-web)
@@ -0,0 +1,30 @@
# Calibre-Web e-knihovna
services:
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
restart: unless-stopped
ports:
- "8083:8083"
volumes:
- ./data:/config
- ./books:/books
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- DOCKER_MODS=linuxserver/mods:universal-calibre
- OAUTHLIB_RELAX_TOKEN_SCOPE=1
networks:
- calibre-web_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
calibre-web_net:
name: calibre-web_default
driver: bridge
+4
View File
@@ -0,0 +1,4 @@
# Erugo proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
+43
View File
@@ -0,0 +1,43 @@
# Erugo file sharing
> Jednoduché sdílení souborů s heslem a expirací.
## 📋 Přehled
- **Image:** `wardy784/erugo:latest`
- **Port:** `61080` (web)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
docker compose up -d
```
## 🌐 Přístup
- **Web:** `http://<server>:61080`
## 🎯 Funkce
- **Upload** drag & drop souborů
- **Heslo** volitelné pro každý upload
- **Expirace** automatické mazání po X dnech
- **Linky** sdílitelné
- **API** pro integraci
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/uploads` | Uložené soubory |
| `./db:/db` | SQLite databáze |
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
+28
View File
@@ -0,0 +1,28 @@
# Erugo file sharing
services:
erugo:
image: wardy784/erugo:latest
container_name: erugo
restart: unless-stopped
ports:
- "61080:80"
volumes:
- ./data:/uploads
- ./db:/db
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
networks:
- erugo_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
erugo_net:
name: erugo_default
driver: bridge
+11
View File
@@ -0,0 +1,11 @@
# Gitea proměnné prostředí
USER_UID=1000
USER_GID=1000
TZ=Europe/Prague
# Po prvním adminovi nastav na false
GITEA__service__DISABLE_REGISTRATION=false
GITEA__service__REQUIRE_SIGNIN_VIEW=false
# HTTPS terminuje NPM, takže false
GITEA__session__COOKIE_SECURE=false
+70
View File
@@ -0,0 +1,70 @@
# Gitea self-hosted Git
> Lehký Git server (alternativa k GitLabu). Web UI, API, SSH.
## 📋 Přehled
- **Image:** `docker.gitea.com/gitea:1.27.1`
- **Porty:** `3000` (web), `222` (SSH)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
nano .env
docker compose up -d
```
Po startu otevři `http://<server>:3000/` a dokonči install wizard:
1. **Database:** SQLite3 (default)
2. **Site Title:** libovolný
3. **Admin Username:** `admin` (nebo `mates`)
4. **Admin Password:** silné heslo
5. **Admin Email:** tvůj email
6. Ostatní default
7. **Install Gitea**
## 🌐 Přístup
- **Web:** `http://<server>:3000` (za HTTPS terminuj v NPM)
- **SSH git push:** `ssh://git@<server>:222/<user>/<repo>.git`
- **API:** `http://<server>:3000/api/v1/`
## 🔐 Bezpečnost
- **Změň admin heslo** hned po instalaci
- **DISABLE_REGISTRATION=false** po registraci prvního admina vypni
- **HTTPS** terminuj v NPM a přesměruj HTTP→HTTPS
- **2FA** aktivuj pro admin účet
## 🔑 API Token
Vytvoření tokenu pro skripty:
1. User Settings → Applications
2. Název: `<script-name>`
3. Scopes: `read:user`, `write:user`, `read:repository`, `write:repository`
4. **Token ulož do keychainu**, ne do chatu
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
# DB migrace probíhá automaticky
```
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./gitea:/data` | Repozitáře, DB, konfigurace, hooks |
## 📚 Dokumentace
- [Gitea Docker install](https://docs.gitea.com/installation/install-with-docker/)
- [Gitea API](https://docs.gitea.com/api/)
+39
View File
@@ -0,0 +1,39 @@
# Gitea self-hosted Git server
services:
server:
image: docker.gitea.com/gitea:1.27.1
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__webhook__SKIP_TLS_VERIFY=false
- GITEA__service__DISABLE_REGISTRATION=false
- GITEA__service__REQUIRE_SIGNIN_VIEW=false
- GITEA__session__COOKIE_SECURE=false
restart: unless-stopped
networks:
- gitea_net
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "222:22"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
gitea_net:
name: gitea_default
driver: bridge
+4
View File
@@ -0,0 +1,4 @@
# Jotty proměnné prostředí
TZ=Europe/Prague
PUID=1000
PGID=1000
+59
View File
@@ -0,0 +1,59 @@
# Jotty poznámky a checklisty
> Self-hosted alternativa k Obsidian. Markdown poznámky, checklisty, kategorie.
## 📋 Přehled
- **Image:** `mrx23dotcom/jotty:latest`
- **Port:** `1122` (web)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
nano .env
docker compose up -d
```
## 🌐 Přístup
- **Web:** `http://<server>:1122` (za HTTPS terminuj v NPM)
- **První registrace:** Setup wizard na hlavní stránce
## 🎯 Použití
- **Poznámky** markdown, interní linky `@note-id`, tagy `#tag`
- **Checklisty** task management
- **Kategorie** organizace
- **TipTap editor** WYSIWYG nebo markdown
- **API** REST API s API klíčem pro integraci
## 🔐 Bezpečnost
- **API klíč** generuj v Admin → API
- **2FA** pro admin účet
- **HTTPS** terminuj v NPM
- **Registry** vypni po registraci
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
# Data zůstávají v ./data/notes/
```
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/app/data` | Poznámky, checklisty, databáze |
| `./config:/app/config` | Konfigurace, themes, custom emojis |
## 📚 Dokumentace
- [Jotty GitHub](https://github.com/mrx23dotcom/jotty)
- [Jotty API](https://github.com/mrx23dotcom/jotty/blob/main/howto/API.md)
+35
View File
@@ -0,0 +1,35 @@
# Jotty poznámky a checklisty
services:
jotty:
image: mrx23dotcom/jotty:latest
container_name: jotty
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
restart: unless-stopped
networks:
- jotty_net
volumes:
- ./data:/app/data
- ./config:/app/config
- ./cache:/app/.next/cache
ports:
- "1122:3000"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
jotty_net:
name: jotty_default
driver: bridge
+9
View File
@@ -0,0 +1,9 @@
# Wiki.js proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
# MariaDB hesla (ZMĚŇ!)
MYSQL_ROOT_PASSWORD=change-me-strong
MYSQL_PASSWORD=change-me-strong
WIKIJS_DB_PASS=change-me-strong
+54
View File
@@ -0,0 +1,54 @@
# Wiki.js wiki
> Nejvýkonnější open-source wiki. Markdown, WYSIWYG, DB, fulltext.
## 📋 Přehled
- **Image:** `linuxserver/wikijs:latest`
- **Port:** `9180` (web)
- **User:** `1000:1000`
- **DB:** PostgreSQL/SQLite (zde SQLite pro jednoduchost)
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
docker compose up -d
```
Pak `http://<server>:9180` setup wizard.
## 🎯 Funkce
- **Editor** WYSIWYG (TinyMCE), Markdown, AsciiDoc
- **Verzování** každá stránka má historii
- **Permissions** skupiny, ACL
- **Search** fulltext
- **Multi-language**
- **GraphQL API** pro integrace
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/config` | Wiki.js data, DB, config |
| `./db:/db` | SQLite databáze |
## 🔐 Bezpečnost
- **Local auth** nebo LDAP/OAuth
- **HTTPS** terminuj v NPM
- **Rate limiting** default zapnutý
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
## 📚 Dokumentace
- [Wiki.js](https://wiki.js.org/)
- [GitHub](https://github.com/requarks/wiki)
+57
View File
@@ -0,0 +1,57 @@
# Wiki.js
services:
db:
image: linuxserver/mariadb:latest
container_name: jswiki_db
restart: unless-stopped
volumes:
- ./db:/config
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- MYSQL_ROOT_PASSWORD=CHANGE_ME_STRONG
- MYSQL_DATABASE=wiki
- MYSQL_USER=wiki
- MYSQL_PASSWORD=CHANGE_ME_STRONG
networks:
- jswiki_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
wikijs:
image: lscr.io/linuxserver/wikijs:latest
container_name: wikijs
restart: unless-stopped
depends_on:
- db
ports:
- "9180:3000"
volumes:
- ./data:/config
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- WIKIJS_DB_TYPE=mariadb
- WIKIJS_DB_HOST=db
- WIKIJS_DB_PORT=3306
- WIKIJS_DB_USER=wiki
- WIKIJS_DB_PASS=CHANGE_ME_STRONG
- WIKIJS_DB_NAME=wiki
networks:
- jswiki_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
jswiki_net:
name: jswiki_default
driver: bridge
@@ -0,0 +1,19 @@
# Nextcloud AIO proměnné prostředí
TZ=Europe/Prague
PUID=1000
PGID=1000
# Web port (default 11000)
APACHE_PORT=11000
# Data na hostu (NE containeru)
NEXTCLOUD_DATADIR=/mnt/data
# Extra balíky (ImageMagick pro OCR, atd.)
NEXTCLOUD_ADDITIONAL_APKS=imagemagick
# Upload limit
NEXTCLOUD_UPLOAD_LIMIT=10G
# Důvěryhodné certifikáty (firemní CA, Cloudflare Origin)
# NEXTCLOUD_TRUSTED_CACERTS_DIR=/usr/local/share/ca-certificates
+64
View File
@@ -0,0 +1,64 @@
# Nextcloud AIO vše v jednom
> All-in-One Nextcloud: soubory, kalendář, kontakty, fotky, videohovory.
## 📋 Přehled
- **Image:** `nextcloud/all-in-one:latest`
- **Porty:** `11000` (admin), další interně
- **User:** `1000:1000`
- **Network:** `bridge` + `nextcloud-aio` (interní)
## 🚀 Instalace
```bash
cp .env.example .env
nano .env # nastavit APACHE_PORT, NEXTCLOUD_DATADIR, NEXTCLOUD_ADDITIONAL_APKS
docker compose up -d
```
Pak otevři `http://<server>:11000/` a dokonči instalaci.
## 🌐 Přístup
- **Admin:** `http://<server>:11000`
- **Nextcloud:** `http://<server>:11000` (nebo za reverse proxy)
- **Doporučení:** terminuj HTTPS přes NPM
## 🔧 Pokročilé nastavení
- **Cloudflare Tunnel** pro vzdálený přístup bez veřejné IP
- **Talk (videohovory)** v AIO default
- **Imaginary (AI)** rozpoznávání obrázků
- **Fulltextsearch** indexování souborů
- **Whiteboard** collaborative kreslení
- **Borg backup** integrované zálohování
## 🔐 Bezpečnost
- **HTTPS terminuj v NPM** (Let's Encrypt)
- **2FA** povinně pro admin
- **Brute force protection** default zapnutý
- **Trusted domains** nastav `NEXTCLOUD_TRUSTED_DOMAINS`
- **Backup** AIO Borg nebo externí rsync
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
# AIO auto-updates Nextcloud a všechny sub-containery
```
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./nextcloud_aio_mastercontainer:/mnt/docker-aio-config` | AIO master data |
| `./data:/mnt/data` | Nextcloud data (files, DB) |
## 📚 Dokumentace
- [Nextcloud AIO](https://github.com/nextcloud/all-in-one)
- [Nextcloud Admin Manual](https://docs.nextcloud.com/server/latest/admin_manual/)
@@ -0,0 +1,40 @@
# Nextcloud All-in-One
services:
nextcloud-aio-mastercontainer:
image: nextcloud/all-in-one:latest
container_name: nextcloud-aio-mastercontainer
restart: unless-stopped
init: true
ports:
- "11000:8080"
volumes:
- ./nextcloud_aio_mastercontainer:/mnt/docker-aio-config
- ./data:/mnt/data
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- APACHE_PORT=11000
- NEXTCLOUD_DATADIR=/mnt/data
- NEXTCLOUD_ADDITIONAL_APKS=imagemagick
- NEXTCLOUD_TRUSTED_CACERTS_DIR=/usr/local/share/ca-certificates
- NEXTCLOUD_UPLOAD_LIMIT=10G
networks:
- nextcloud_net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 60s
timeout: 10s
retries: 5
start_period: 120s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
nextcloud_net:
name: nextcloud_default
driver: bridge
@@ -0,0 +1,8 @@
# NPM proměnné prostředí
TZ=Europe/Prague
PUID=1000
PGID=1000
DISABLE_IPV6=true
# MariaDB heslo pro NPM backend (ZMĚŇ!)
MYSQL_ROOT_PASSWORD=change-me-strong-password
@@ -0,0 +1,62 @@
# Nginx Proxy Manager
> Reverzní proxy s HTTPS (Let's Encrypt), web UI, ACL.
## 📋 Přehled
- **Image:** `jc21/nginx-proxy-manager:latest`
- **Porty:** `80`, `443`, `81` (admin UI)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
nano .env
docker compose up -d
```
## 🌐 Přístup
- **Admin UI:** `http://<server>:81` (default `admin@example.com` / `changeme`)
- **Změň heslo hned po prvním přihlášení!**
## 🔒 HTTPS
NPM umí automaticky generovat Let's Encrypt certifikáty:
1. **DNS A záznam** domény → server IP
2. NPM UI → Proxy Hosts → Add Proxy Host
3. Domain Names: `service.example.com`
4. Scheme: `http`, Forward: `<server>:PORT`
5. Záložka **SSL:** Request SSL Certificate, Let's Encrypt
6. Force SSL, HTTP/2, HSTS vše zapnout
## 🔧 Pokročilé
- **Cloudflare DNS-01 challenge** pro wildcard certifikáty
- **Access Lists** whitelist IP pro citlivé služby
- **Redirection** 301/302 přesměrování
- **Streams** TCP/UDP proxy (SSH, databáze)
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/data` | NPM data, certifikáty, konfigurace |
| `./letsencrypt:/etc/letsencrypt` | Let's Encrypt certifikáty |
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
# Certifikáty zůstávají v ./letsencrypt/
```
## 📚 Dokumentace
- [NPM oficiální dokumentace](https://nginxproxymanager.com/docs/)
- [Let's Encrypt s NPM](https://nginxproxymanager.com/advanced-config/#ssl-certificates)
@@ -0,0 +1,57 @@
# Nginx Proxy Manager
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- DISABLE_IPV6=true
networks:
- npm_net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:81"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# NPM vyžaduje vlastní MariaDB backend
db:
image: jc21/mariadb-aria:latest
container_name: npm_db
restart: unless-stopped
volumes:
- ./mysql:/var/lib/mysql
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- MYSQL_ROOT_PASSWORD=CHANGE_ME
networks:
- npm_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
npm_net:
name: nginx_proxy_manager_default
driver: bridge
+8
View File
@@ -0,0 +1,8 @@
# Plex proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
# HW akcelerace (vyber podle sveho GPU)
# NVIDIA_VISIBLE_DEVICES=all
# INTEL_VISIBLE_DEVICES=true
+58
View File
@@ -0,0 +1,58 @@
# Plex media server
> Stream filmů, seriálů, hudby, fotek. HW transkódování.
## 📋 Přehled
- **Image:** `linuxserver/plex:latest`
- **Porty:** `32400` (web), `1900` (DLNA), `5353` (Bonjour), `8324` (plex.tv)
- **User:** `1000:1000`
- **Network:** `host` (doporučeno) kvůli HW transkódování
## 🚀 Instalace
```bash
cp .env.example .env
docker compose up -d
```
Pak `http://<server>:32400/web` setup wizard.
## 🎯 Funkce
- **Hardware transkódování** Intel/AMD/NVIDIA GPU akcelerace
- **Plex Pass** Live TV, DVR, HW encoding (placené)
- **Mobile app** iOS/Android/Apple TV
- **Plex.tv** vzdálený přístup
- **Share** s přáteli
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/config` | Plex konfigurace, DB |
| `./media:/media` | Tvoje knihovna (filmy, seriály, hudba) |
## 🔧 HW transkódování
V `.env` nastavit:
- `NVIDIA_VISIBLE_DEVICES=all` pro NVIDIA
- `INTEL_VISIBLE_DEVICES=true` pro Intel QuickSync
## 🔐 Bezpečnost
- **HTTPS** terminuj v NPM
- **Plex.tv účet** nepoužívej guest účet
- **Network discovery** vypni pokud nepotřebuješ
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
## 📚 Dokumentace
- [Plex Support](https://support.plex.tv/)
- [Plex Media Server](https://www.plex.tv/media-server-downloads/)
+22
View File
@@ -0,0 +1,22 @@
# Plex Media Server
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
restart: unless-stopped
network_mode: host # Pro HW transkódování a DLNA
volumes:
- ./data:/config
- ./media:/media
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- VERSION=docker
- NVIDIA_VISIBLE_DEVICES=all
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
+9
View File
@@ -0,0 +1,9 @@
# Portainer CE proměnné prostředí
# Zkopíruj tento soubor na .env a doplň skutečné hodnoty
# Timezone
TZ=Europe/Prague
# UID/GID pro file ownership
PUID=1000
PGID=1000
+67
View File
@@ -0,0 +1,67 @@
# Portainer Docker UI management
> Webové UI pro správu Dockeru (kontejnery, image, sítě, volumes, swarm, kubernetes).
## 📋 Přehled
- **Image:** `portainer/portainer-ce:latest`
- **Porty:** `9000` (HTTP), `9443` (HTTPS)
- **User:** `1000:1000`
- **Network:** `bridge` (default)
## 🚀 Instalace
```bash
cp .env.example .env
nano .env # nastavit SECRET, PUID, PGID
docker compose up -d
```
## 🌐 Přístup
- **HTTP:** `http://<server>:9000`
- **HTTPS:** `https://<server>:9443` (self-signed, akceptuj varování)
**První přihlášení:**
1. Vytvoř admin účet (zobrazí se při prvním přístupu)
2. Připoj se k lokálnímu Docker endpointu
3. Spravuj kontejnery přes web UI
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/data` | Portainer data (DB, certifikáty, zálohy) |
| `/var/run/docker.sock:/var/run/docker.sock` | Přístup k Docker daemonu |
## 🔐 Bezpečnost
- **Heslo pro admin:** silné, 12+ znaků
- **HTTPS:** nastavit v Settings → SSL (nebo terminovat v NPM)
- **2FA:** aktivovat pro admin účet v Settings → Users
- **Dostupnost:** portainer nemá remote auth → zařadit za reverse proxy
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
## 📚 Další informace
- [Oficiální dokumentace](https://docs.portainer.io/)
- [Portainer CE vs Business](https://www.portainer.io/pricing)
## 🛠 Troubleshooting
**Portainer se nemůže připojit k Dockeru:**
- Zkontroluj `/var/run/docker.sock` oprávnění
- Portainer musí mít stejný UID jako docker socket (typicky root, ale v CE to funguje)
**Zapomenuté heslo:**
```bash
docker exec -u root portainer /bin/sh
# Pak resetuj v DB (složitější, doporučuji reinstalaci)
```
@@ -0,0 +1,35 @@
# Portainer Community Edition
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "9000:9000"
- "9443:9443"
volumes:
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
networks:
- portainer_net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/api/status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
portainer_net:
name: portainer_default
driver: bridge
+7
View File
@@ -0,0 +1,7 @@
# RustDesk proměnné prostředí
TZ=Europe/Prague
PUID=1000
PGID=1000
# Poznámka: Po prvním spuštění si ulož veřejný klíč z logu hbbs
# Použije se v RustDesk klientovi (Preferences → Network → Key Server)
+53
View File
@@ -0,0 +1,53 @@
# RustDesk Server remote desktop
> Vlastní relay server pro RustDesk. Bez závislosti na veřejném RustDesk serveru.
## 📋 Přehled
- **Image:** `rustdesk/rustdesk-server:latest`
- **Porty:** `21115-21119` (TCP+UDP), `21116` (WebSocket)
- **User:** `1000:1000`
- **Network:** `host` (lepší pro P2P)
## 🚀 Instalace
```bash
cp .env.example .env
nano .env
docker compose up -d
```
## 🌐 Konfigurace klienta
V RustDesk klientovi (Preferences → Network):
- **ID Server:** `<tvuj-server>:21116`
- **Key Server:** `<tvuj-server>:21116`
- **Relay Server:** `<tvuj-server>:21117`
**Veřejný klíč** získáš z logu kontejneru `hbbs` (první spuštění).
## 🔐 Bezpečnost
- **Firewall:** otevři jen potřebné porty
- **HTTPS** na relay lze nastavit terminaci
- **WebSocket** `ws://` nebo `wss://` (doporučeno za HTTPS)
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/root` | Databáze, klíče, data |
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
## 📚 Dokumentace
- [RustDesk Server](https://rustdesk.com/docs/en/self-host/)
- [Docker compose](https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/docker/)
@@ -0,0 +1,53 @@
# RustDesk Server vlastní relay
services:
hbbs:
image: rustdesk/rustdesk-server:latest
container_name: hbbs
command: hbbs
restart: unless-stopped
volumes:
- ./data:/root
ports:
- "21115:21115"
- "21116:21116"
- "21116:21116/udp"
- "21118:21118"
networks:
- rustdesk_net
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
hbbr:
image: rustdesk/rustdesk-server:latest
container_name: hbbr
command: hbbr
restart: unless-stopped
volumes:
- ./data:/root
ports:
- "21117:21117"
- "21119:21119"
networks:
- rustdesk_net
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
rustdesk_net:
name: rustdesk_default
driver: bridge
+10
View File
@@ -0,0 +1,10 @@
# Speedtest Tracker proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
# APP_KEY: 32+ znaků vygeneruj: openssl rand -base64 32
APP_KEY=change-me-32-char-base64-key
# URL kde běží Speedtest Tracker
APP_URL=http://CHANGE_ME:8765
+51
View File
@@ -0,0 +1,51 @@
# Speedtest Tracker rychlost internetu
> Sledování rychlosti internetu v čase. Grafy, alerty, statistiky.
## 📋 Přehled
- **Image:** `linuxserver/speedtest-tracker:latest`
- **Porty:** `8765` (web), `8443` (HTTPS)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
docker compose up -d
```
## 🌐 Přístup
- **Web:** `http://<server>:8765`
## 🎯 Funkce
- **Automatický speedtest** každých X minut
- **Grafy** rychlost stahování, odesílání, ping
- **Alert** notifikace když rychlost klesne
- **Multi-server** sleduj víc linek
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/config` | Speedtest Tracker data |
## 🔧 Pokročilé
- **Ookla CLI** integrovaný
- **Cloudflare** speedtest.cloudflare.com
- **Notifikace** email, Telegram, Discord, Slack
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
```
## 📚 Dokumentace
- [Speedtest Tracker](https://docs.speedtest-tracker.dev/)
@@ -0,0 +1,30 @@
# Speedtest Tracker
services:
speedtest:
image: lscr.io/linuxserver/speedtest-tracker:latest
container_name: speedtest
restart: unless-stopped
ports:
- "8765:80"
- "8443:443"
volumes:
- ./data:/config
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- APP_KEY=CHANGE_ME_32_CHAR_KEY
- APP_URL=http://CHANGE_ME:8765
networks:
- speedtest_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
speedtest_net:
name: speedtest_default
driver: bridge
+15
View File
@@ -0,0 +1,15 @@
# Vaultwarden proměnné prostředí
TZ=Europe/Prague
PUID=1000
PGID=1000
# URL přes kterou bude Vaultwarden dostupný (musí být https://)
DOMAIN=https://vault.example.com
# Po prvním přihlášení admin účtu nastavte na false
SIGNUPS_ALLOWED=true
INVITATIONS_ALLOWED=false
# Bezpečnost
SHOW_PASSWORD_HINT=false
LOG_LEVEL=warn
+79
View File
@@ -0,0 +1,79 @@
# Vaultwarden self-hosted správce hesel
> Kompatibilní s Bitwarden klienty. Open-source, lehký (Rust).
## 📋 Přehled
- **Image:** `vaultwarden/server:latest`
- **Porty:** `2999` (HTTP), `3012` (WebSocket, interní)
- **User:** `1000:1000`
- **Network:** `bridge`
## 🚀 Instalace
```bash
cp .env.example .env
nano .env # nastavit DOMAIN, ROCKET_PORT, hesla
docker compose up -d
```
## 🌐 Přístup
- **Web vault:** `http://<server>:2999` (za HTTPS terminuj v NPM)
- **Bitwarden app:** stejná URL jako vault
- **Doporučení:** terminuj HTTPS přes NPM a nepoužívej HTTP přímo
## 🔐 Bezpečnost
- **DOMAIN** musí být `https://vault.example.com` (ne `http`)
- **SIGNUPS_ALLOWED=false** po registraci admin účtu
- **INVITATIONS_ALLOWED=false** pokud nechceš zvát další
- **SHOW_PASSWORD_HINT=false** (odhalování hesel)
- **DATABASE_URL** zálohuj SQLite pravidelně
## 🔑 Záloha
```bash
# Zastavit kontejner
docker compose stop
# Zazálohovat SQLite DB
cp ./data/db.sqlite3 /backup/vaultwarden-$(date +%Y%m%d).sqlite3
# Restart
docker compose start
```
## 👥 Organizace
- **1 user** (ty) self-hosted
- **2FA** povinně aktivuj po registraci
- **FIDO2/WebAuthn** podpora hardwarových klíčů (YubiKey)
- **Organizace** pro sdílení hesel s rodinou
## 📁 Volumes
| Mount | Účel |
|---|---|
| `./data:/data` | SQLite DB, attachmenty, ikony, config |
## 📚 Klienti
- **Mobil:** Bitwarden (iOS/Android)
- **Desktop:** Bitwarden (Win/Mac/Linux)
- **Browser:** Bitwarden extension (Chrome/Firefox/Edge)
- **CLI:** `rbw` (Rust) nebo `bitwarden-cli`
## 🔄 Aktualizace
```bash
docker compose pull
docker compose up -d
# DB migrace probíhá automaticky
```
## 📚 Dokumentace
- [Vaultwarden Wiki](https://github.com/dani-garcia/vaultwarden/wiki)
- [Bitwarden klienti](https://bitwarden.com/download/)
@@ -0,0 +1,41 @@
# Vaultwarden kompatibilní Bitwarden server
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
ports:
- "2999:80"
volumes:
- ./data:/data
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Prague
- DOMAIN=https://CHANGE_ME
- ROCKET_PORT=80
- SIGNUPS_ALLOWED=true
- INVITATIONS_ALLOWED=false
- SHOW_PASSWORD_HINT=false
- LOG_LEVEL=warn
- EXTENDED_LOGGING=true
- RUST_BACKTRACE=1
networks:
- vaultwarden_net
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/alive"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
vaultwarden_net:
name: vaultwarden_default
driver: bridge
+22
View File
@@ -0,0 +1,22 @@
# Watchtower proměnné
TZ=Europe/Prague
# Mód: true = jen upozorni, false = auto-aktualizuje
WATCHTOWER_MONITOR_ONLY=true
# Mazat stare image po update
WATCHTOWER_CLEANUP=true
# Cron schedule (default: kazdou nedeli ve 4:00)
WATCHTOWER_SCHEDULE=0 0 4 ? * SUN
# Email notifikace
WATCHTOWER_NOTIFICATIONS=email
WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=watchtower@example.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=change-me
# Poznámka: V praxi nastav SMTP podle sveho providera
+61
View File
@@ -0,0 +1,61 @@
# Watchtower automatické aktualizace
> Sleduje nové verze Docker image a automaticky restartuje kontejnery.
## 📋 Přehled
- **Image:** `containrrr/watchtower:latest`
- **Network:** `bridge` (musí mít přístup k Docker socketu)
- **Mód:** monitor-only (default) jen upozorňuje, NEaktualizuje
## 🚀 Instalace
```bash
cp .env.example .env
nano .env # nastavit WATCHTOWER_MONITOR_ONLY podle potřeby
docker compose up -d
```
## 🎯 Módy
- **Monitor only** (default) posílá email/notifikaci, NEaktualizuje
- **Auto update** stáhne nový image, restartuje kontejner
## 📧 Notifikace (email)
```env
WATCHTOWER_NOTIFICATIONS=email
WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=watchtower@example.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=CHANGE_ME
```
## 🔧 Pokročilé
- **Schedule** cron-like: `0 0 4 ? * SUN` (každou neděli v 4:00)
- **Cleanup** smaže staré image (`WATCHTOWER_CLEANUP=true`)
- **Notifications** shoutrrr (Telegram, Discord, Slack, …)
## 📁 Volumes
| Mount | Účel |
|---|---|
| `/var/run/docker.sock:/var/run/docker.sock` | Přístup k Docker daemonu |
## 🔐 Bezpečnost
- **Doporučeno:** monitor-only s email notifikací
- **Auto-update** riskantní může rozbít službu
- **Manuální update:** `docker compose pull && docker compose up -d`
## 🔄 Restart
Watchtower se automaticky restartuje. **Nemusíte na něj sahat.**
## 📚 Dokumentace
- [Watchtower GitHub](https://github.com/containrrr/watchtower)
@@ -0,0 +1,34 @@
# Watchtower monitor + auto-update
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Prague
- WATCHTOWER_MONITOR_ONLY=true
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_SCHEDULE=0 0 4 ? * SUN
- WATCHTOWER_NOTIFICATIONS=email
- WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
- WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=watchtower@example.com
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=CHANGE_ME
- WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG=Watchtower
networks:
- watchtower_net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
networks:
watchtower_net:
name: watchtower_default
driver: bridge