refactor: split into 6 specialized repos

- docker-services, ansible, install-scripts -> own repos
- macos-setup merged with hermes-install
- home-nas-tools (metadata only, no binaries)
- docs (architecture, security, contributing)
- this repo: index + LICENSE + .gitignore only
This commit is contained in:
2026-08-01 16:37:32 +02:00
parent b569344e69
commit 24d5e9be42
72 changed files with 61 additions and 3904 deletions
-1
View File
@@ -1 +0,0 @@
2026-08-01 16:32:27
+60 -50
View File
@@ -1,83 +1,93 @@
# 🔧 mates Home Infrastructure # 🏠 mates-infra Home Infrastructure
> Sbírka šablon, skriptů a Ansible playbooků pro rychlé nasazení self-hostované infrastruktury. > Hlavní index pro **home infrastructure as code** projekty.
> Veškerý obsah vychází z reálného běhu na serveru `192.168.0.148` (Ubuntu 24.04, Docker 29.x). > Obsah je **rozdělen do 6 specializovaných repozitářů** pro snadnou orientaci a
> samostatné použití. Toto repo slouží jako **orchestrátor + dokumentace**.
**[![Gitea](https://img.shields.io/badge/Gitea-192.168.0.148:3000-609926?logo=gitea)](http://192.168.0.148:3000)** · **[![Jotty](https://img.shields.io/badge/Jotty-docs-3b82f6)](http://192.168.0.148:1122)** · **[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)**
--- ---
## 🗂 Co je v tomto repo ## 📦 Repozitáře (6)
| Adresář | Účel | Stav | | Repo | Obsah | URL |
|---|---|---| |---|---|---|
| [`docker-services/`](docker-services/) | Generické `docker-compose.yml` pro 14+ služeb (portainer, vaultwarden, nextcloud, …) | | | [`mates-docker-services`](https://github.com/mates/mates-docker-services) | 14 generických `docker-compose.yml` (portainer, npm, vaultwarden, gitea, jotty, nextcloud, …) | http://192.168.0.148:3000/mates/mates-docker-services |
| [`install-scripts/`](install-scripts/) | Bash skripty pro nové servery (Ubuntu 22.04/24.04 LTS) | ✅ | | [`mates-ansible`](https://github.com/mates/mates-ansible) | 4 Ansible playbooky (bootstrap, deploy, update, security) | http://192.168.0.148:3000/mates/mates-ansible |
| [`ansible/`](ansible/) | Ansible playbooks + role pro idempotentní deploy | ✅ | | [`mates-install-scripts`](https://github.com/mates/mates-install-scripts) | Bash skripty pro nový Ubuntu server (bootstrap, docker, portainer, npm, backup, restore) | http://192.168.0.148:3000/mates/mates-install-scripts |
| [`hermes-install/`](hermes-install/) | Instalace a konfigurace Hermes Agent (mě) na macOS | ✅ | | [`mates-macos-setup`](https://github.com/mates/mates-macos-setup) | macOS workstation (Brewfile, Fish aliasy, osx defaults, Hermes CLI) | http://192.168.0.148:3000/mates/mates-macos-setup |
| [`macos-setup/`](macos-setup/) | Homebrew `Brewfile` + skripty pro macOS workstation | ✅ | | [`mates-home-nas-tools`](https://github.com/mates/mates-home-nas-tools) | Rejstřík projektů na NAS (metadata only, žádné binárky) | http://192.168.0.148:3000/mates/mates-home-nas-tools |
| [`home-nas-tools/`](home-nas-tools/) | Rejstřík projektů a nástrojů z NAS (`/Volumes/Backups/Prace/`) | ✅ | | [`mates-docs`](https://github.com/mates/mates-docs) | Architektura, bezpečnost, contributing | http://192.168.0.148:3000/mates/mates-docs |
| [`docs/`](docs/) | Architektura, bezpečnost, contributing | ✅ |
> **Proč 6 repo?** Každý má **jiný scope**, **jiný lifecycle**, **jiné uživatele**.
> Např. `mates-install-scripts` se mění zřídka, `mates-docker-services` často.
## 🏗 Aktuální infrastruktura ## 🏗 Aktuální infrastruktura
``` ```
┌───────────────────────────────────────────────────────────────────── ┌─────────────────────────────────────────────────────────────┐
Internet (Cloudflare Tunnel) Nginx Proxy Manager (reverzní proxy + HTTPS)
└────────────────────┬──────────────────────────────────────────────── └────────────────────┬────────────────────────────────────────┘
│ HTTPS (443)
┌─────────────────────────────────────────────────────────────────────┐
│ Nginx Proxy Manager (192.168.0.148:81, 443) │
│ ├─ DNS: domácí subdomény → LAN IP │
│ └─ Let's Encrypt auto-renew │
└────────────────────┬────────────────────────────────────────────────┘
┌─────────────────┼─────────────────┬──────────────┐ ┌─────────────────┼─────────────────┬──────────────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────── ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Nextcloud│ │Vaultwarden│ │ Gitea │ │ Jotty (doc) │ Nextcloud│ │Vaultwarden│ │ Gitea │ │ Jotty
│ AIO │ │ :2999 │ │ :3000/222│ │ :1122 │ │ AIO │ │ :2999 │ │ :3000/222│ │ :1122 │
│ :11000 │ └──────────┘ └──────────┘ └──────────── └──────────┘ └──────────┘ └──────────┘ └──────────┘
└──────────┘ … dalších 11 služeb (Plex, RustDesk, Audiobookshelf, …)
… dalších 11 služeb (Plex, RustDesk, Calibre, Audiobookshelf, Wikijs, …)
``` ```
Detailní seznam: [`docker-services/README.md`](docker-services/README.md) Detailní seznam: [`mates-docker-services/README.md`](https://github.com/mates/mates-docker-services)
## 🚀 Rychlý start (nový server) ## 🚀 Rychlý start (nový server)
```bash ```bash
# 1. Klonuj tento repo # 1. Klonuj všechna relevantní repo
git clone https://github.com/<user>/mates-infra.git ~/infra git clone http://192.168.0.148:3000/mates/mates-install-scripts.git
cd ~/infra git clone http://192.168.0.148:3000/mates/mates-docker-services.git
# 2. Spusť bootstrap (Ubuntu 22.04/24.04 LTS) # 2. Bootstrap
sudo bash install-scripts/bootstrap-ubuntu-server.sh cd mates-install-scripts
sudo bash bootstrap-ubuntu-server.sh
sudo bash install-docker.sh
# 3. Nainstaluj všechny služby # 3. Nasaď služby
sudo bash install-scripts/install-docker.sh cd ../mates-docker-services
sudo bash install-scripts/install-portainer.sh cp portainer/.env.example portainer/.env # a další služby
# … další viz install-scripts/ docker compose -f portainer/docker-compose.yml up -d
# ... atd.
# 4. Nebo použij Ansible # 4. (Volitelně) Ansible
cd ansible git clone http://192.168.0.148:3000/mates/mates-ansible.git
cd mates-ansible
ansible-playbook -i inventory.example.yml playbooks/deploy-services.yml ansible-playbook -i inventory.example.yml playbooks/deploy-services.yml
``` ```
## 📚 Dokumentace ## 📚 Dokumentace
- 🏛 [Architektura](docs/architecture.md) jak to celé funguje - 🏛 [Architektura](https://github.com/mates/mates-docs) jak to celé funguje
- 🔐 [Bezpečnost](docs/security.md) hardening, secrets, HTTPS - 🔐 [Bezpečnost](https://github.com/mates/mates-docs) hardening, secrets
- 🤝 [Contributing](docs/contributing.md) jak přispívat - 🤝 [Contributing](https://github.com/mates/mates-docs) jak přispívat
- 📝 [Jotty dokumentace](http://192.168.0.148:1122) knowledge base v Jotty - 📝 [Jotty knowledge base](http://192.168.0.148:1122) interní dokumentace
## 🗂 Mapa závislostí
```
mates-infra (toto repo index)
├──→ mates-docs (architektura, bezpečnost)
├──→ mates-docker-services (služby)
├──→ mates-install-scripts (nový server)
├──→ mates-ansible (idempotentní deploy)
├──→ mates-macos-setup (workstation)
└──→ mates-home-nas-tools (metadata k NAS)
```
## 🔒 Bezpečnost ## 🔒 Bezpečnost
- **Všechna hesla v `.env.example`** nikdy necommituj `.env` - Všechna hesla v `.env.example` (šablona), nikdy v `docker-compose.yml`
- **HTTPS** Let's Encrypt přes NPM - API token Gitea uložen v **macOS keychainu** (`gitea:api:192.168.0.148`)
- **Firewall** UFW + fail2ban - SSH klíče pro git push přes `credential.helper`
- **Bezpečnostní audit**: viz [`docs/security.md`](docs/security.md) - HTTPS terminuje Nginx Proxy Manager (Let's Encrypt)
- Detailní security hardening: [`mates-docs/security.md`](https://github.com/mates/mates-docs)
## 📜 Licence ## 📜 Licence
@@ -85,4 +95,4 @@ ansible-playbook -i inventory.example.yml playbooks/deploy-services.yml
--- ---
**Vyrobeno s ❤️ v homelabu · 2026** **Home lab · 2026 · Poslední update:** 2026-08-01
-88
View File
@@ -1,88 +0,0 @@
# 🎭 Ansible Playbooks
> Ansible role a playbooks pro nasazení a správu home infrastruktury.
> Idempotentní, testovatelné, čitelné.
## 📁 Struktura
```
ansible/
├── README.md # Tento soubor
├── ansible.cfg # Konfigurace
├── requirements.yml # Ansible Galaxy role
├── inventory.example.yml # Ukázkový inventory
├── playbooks/
│ ├── bootstrap-server.yml # Úvodní setup nového serveru
│ ├── deploy-services.yml # Nasaď všechny Docker služby
│ ├── update-services.yml # Update všech služeb
│ └── security-hardening.yml # Bezpečnostní hardening
├── roles/
│ ├── common/ # Společné úkoly (update, packages, users)
│ ├── docker/ # Docker + compose
│ ├── portainer/ # Portainer compose
│ ├── nginx-proxy/ # Nginx Proxy Manager
│ ├── vaultwarden/ # Vaultwarden
│ ├── gitea/ # Gitea
│ └── ...
└── group_vars/
└── all.yml.example # Společné proměnné
```
## 🚀 Quickstart
```bash
# 1. Příprava
pip install ansible
ansible-galaxy install -r requirements.yml
# 2. Inventory
cp inventory.example.yml inventory.yml
nano inventory.yml # nastavit IP a SSH user
# 3. Test připojení
ansible all -m ping
# 4. Bootstrap
ansible-playbook -i inventory.yml playbooks/bootstrap-server.yml
# 5. Nasaď služby
ansible-playbook -i inventory.yml playbooks/deploy-services.yml --extra-vars "services=[portainer,vaultwarden,gitea]"
# 6. Update
ansible-playbook -i inventory.yml playbooks/update-services.yml
```
## 🎯 Playbooky
### `bootstrap-server.yml`
- Update OS
- Setup deploy user (UID 1000)
- SSH hardening
- UFW firewall
- fail2ban
- Základní utility
### `deploy-services.yml`
- Nasaď vybrané Docker služby
- Idempotentní můžeš spustit víckrát
### `update-services.yml`
- `docker compose pull && up -d` pro všechny služby
- Watchtower notifikace
### `security-hardening.yml`
- Sysctl hardening
- AppArmor profily
- Auditd pravidla
- Automatické security updaty
## 🔐 Bezpečnost
- **Bez hesel v inventory** použij `ansible-vault` nebo SSH klíče
- **Privilege escalation** `become: true` jen kde potřeba
- **Idempotence** každý task kontroluje stav
## 📚 Dokumentace
- [Ansible docs](https://docs.ansible.com/)
- [Best practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)
-21
View File
@@ -1,21 +0,0 @@
[defaults]
inventory = inventory.yml
roles_path = roles
host_key_checking = False
retry_files_enabled = False
stdout_callback = yaml
forks = 10
gathering = smart
fact_caching = jsonfile
fact_caching_connection = local
fact_caching_timeout = 86400
[privilege_escalation]
become = True
become_method = sudo
become_ask_pass = False
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ServerAliveInterval=30
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
-35
View File
@@ -1,35 +0,0 @@
---
# Společné proměnné pro všechny playbooks
# Zkopíruj na group_vars/all.yml a doplň
# Docker
docker_user: deploy
docker_uid: 1000
docker_gid: 1000
docker_install_compose_plugin: true
# Služby k nasazení (seznam názvů adresářů v docker-services/)
services_to_deploy:
- portainer
- nginx-proxy-manager
- vaultwarden
- gitea
- jotty
- nextcloud-aio
- rustdesk
- audiobookshelf
- calibre-web
- plex
- erugo
- jswiki
- speedtest
- watchtower
# NPM admin (po prvním loginu změnit)
npm_default_email: admin@example.com
npm_default_password: changeme
# Gitea admin (po instalaci)
gitea_admin_user: admin
gitea_admin_password: changeme
gitea_admin_email: admin@example.com
-28
View File
@@ -1,28 +0,0 @@
---
# Ukázkový inventory zkopíruj na inventory.yml a uprav
all:
vars:
# SSH uživatel (deploy user, UID 1000)
ansible_user: deploy
# Python na cílovém systému
ansible_python_interpreter: /usr/bin/python3
# Timezone
timezone: Europe/Prague
children:
# Skupina pro všechny home servery
homeservers:
hosts:
homeserver-01:
ansible_host: 192.168.0.148
# homeserver-02:
# ansible_host: 192.168.0.149
# Skupina pro produkční servery
production:
hosts:
homeserver-01:
ansible_host: 192.168.0.148
# Skupina pro test
staging: []
-145
View File
@@ -1,145 +0,0 @@
---
# Bootstrap nového Ubuntu serveru
# - aktualizace systému
# - deploy user (UID 1000)
# - SSH hardening
# - UFW firewall
# - fail2ban
# - Docker
#
# Použití:
# ansible-playbook -i inventory.yml playbooks/bootstrap-server.yml
#
- name: Bootstrap home server
hosts: homeservers
become: true
gather_facts: true
vars:
deploy_user: deploy
deploy_uid: 1000
ssh_port: 22
deploy_ssh_key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
tasks:
- name: Update apt cache
ansible.builtin.apt:
update_cache: true
cache_valid_time: 3600
- name: Upgrade all packages
ansible.builtin.apt:
upgrade: dist
update_cache: true
- name: Install base packages
ansible.builtin.apt:
name:
- curl
- wget
- git
- vim
- htop
- ca-certificates
- gnupg
- ufw
- fail2ban
- bash-completion
state: present
- name: Set timezone
community.general.timezone:
name: "{{ timezone }}"
- name: Create deploy user
ansible.builtin.user:
name: "{{ deploy_user }}"
uid: "{{ deploy_uid }}"
shell: /bin/bash
create_home: true
password: ""
- name: Setup authorized_keys for deploy user
ansible.posix.authorized_key:
user: "{{ deploy_user }}"
state: present
key: "{{ deploy_ssh_key }}"
- name: Allow deploy user sudo without password
ansible.builtin.copy:
dest: "/etc/sudoers.d/{{ deploy_user }}"
content: "{{ deploy_user }} ALL=(ALL) NOPASSWD:ALL\n"
mode: "0440"
- name: SSH hardening
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: "^#?{{ item.key }}"
line: "{{ item.key }} {{ item.value }}"
state: present
loop:
- { key: "Port", value: "{{ ssh_port }}" }
- { key: "PermitRootLogin", value: "no" }
- { key: "PasswordAuthentication", value: "no" }
- { key: "X11Forwarding", value: "no" }
- { key: "ClientAliveInterval", value: "300" }
- { key: "ClientAliveCountMax", value: "2" }
notify: Restart ssh
- name: Configure UFW defaults
community.general.ufw:
direction: incoming
policy: deny
notify: Reload ufw
- name: Allow SSH through UFW
community.general.ufw:
rule: allow
port: "{{ ssh_port }}"
proto: tcp
- name: Allow HTTP and HTTPS through UFW
community.general.ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "80"
- "443"
- name: Enable UFW
community.general.ufw:
state: enabled
- name: Configure fail2ban
ansible.builtin.copy:
dest: /etc/fail2ban/jail.local
content: |
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = {{ ssh_port }}
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
mode: "0644"
notify: Restart fail2ban
handlers:
- name: Restart ssh
ansible.builtin.service:
name: sshd
state: restarted
- name: Reload ufw
community.general.ufw:
state: reloaded
- name: Restart fail2ban
ansible.builtin.service:
name: fail2ban
state: restarted
-42
View File
@@ -1,42 +0,0 @@
---
# Nasaď Docker služby z docker-services/ adresáře
#
# Použití:
# ansible-playbook -i inventory.yml playbooks/deploy-services.yml
# ansible-playbook -i inventory.yml playbooks/deploy-services.yml --extra-vars "services=[portainer,vaultwarden]"
#
- name: Deploy Docker services
hosts: homeservers
become: true
gather_facts: true
vars:
services_repo: https://github.com/<user>/mates-infra.git
services_path: "/home/{{ docker_user }}/docker-services"
services: "{{ services_to_deploy | default(['portainer', 'vaultwarden', 'gitea']) }}"
tasks:
- name: Clone services repo
ansible.builtin.git:
repo: "{{ services_repo }}"
dest: "{{ services_path }}"
force: false
update: true
become_user: "{{ docker_user }}"
- name: Create .env from example
ansible.builtin.copy:
src: "{{ services_path }}/{{ item }}/.env.example"
dest: "{{ services_path }}/{{ item }}/.env"
remote_src: true
force: false
loop: "{{ services }}"
become_user: "{{ docker_user }}"
- name: Deploy services
community.docker.docker_compose_v2:
project_src: "{{ services_path }}/{{ item }}"
state: present
pull: missing
loop: "{{ services }}"
become_user: "{{ docker_user }}"
-58
View File
@@ -1,58 +0,0 @@
---
# Security hardening sysctl, AppArmor, auditd, auto-updates
#
# Použití:
# ansible-playbook -i inventory.yml playbooks/security-hardening.yml
#
- name: Security hardening
hosts: homeservers
become: true
tasks:
- name: Kernel hardening via sysctl
ansible.posix.sysctl:
name: "{{ item.key }}"
value: "{{ item.value }}"
state: present
reload: true
loop:
- { key: "net.ipv4.conf.all.rp_filter", value: "1" }
- { key: "net.ipv4.conf.default.rp_filter", value: "1" }
- { key: "net.ipv4.icmp_echo_ignore_broadcasts", value: "1" }
- { key: "net.ipv4.conf.all.accept_redirects", value: "0" }
- { key: "net.ipv4.conf.default.accept_redirects", value: "0" }
- { key: "net.ipv6.conf.all.accept_redirects", value: "0" }
- { key: "net.ipv4.conf.all.send_redirects", value: "0" }
- { key: "net.ipv4.conf.all.accept_source_route", value: "0" }
- { key: "net.ipv4.conf.default.accept_source_route", value: "0" }
- { key: "net.ipv4.tcp_syncookies", value: "1" }
- { key: "net.ipv4.conf.all.log_martians", value: "1" }
- name: Install unattended-upgrades
ansible.builtin.apt:
name:
- unattended-upgrades
- apt-listchanges
state: present
- name: Enable automatic security updates
ansible.builtin.copy:
dest: /etc/apt/apt.conf.d/20auto-upgrades
content: |
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
mode: "0644"
- name: Install auditd
ansible.builtin.apt:
name:
- auditd
- audispd-plugins
state: present
- name: Enable auditd
ansible.builtin.service:
name: auditd
state: started
enabled: true
-22
View File
@@ -1,22 +0,0 @@
---
# Update všech Docker služeb (docker compose pull + up -d)
#
# Použití:
# ansible-playbook -i inventory.yml playbooks/update-services.yml
#
- name: Update Docker services
hosts: homeservers
become: true
vars:
services_path: "/home/{{ docker_user }}/docker-services"
services: "{{ services_to_deploy | default([]) }}"
tasks:
- name: Pull and restart services
community.docker.docker_compose_v2:
project_src: "{{ services_path }}/{{ item }}"
state: present
pull: always
loop: "{{ services }}"
become_user: "{{ docker_user }}"
-98
View File
@@ -1,98 +0,0 @@
# 📦 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
```
@@ -1,4 +0,0 @@
# Audiobookshelf proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
-57
View File
@@ -1,57 +0,0 @@
# 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)
@@ -1,29 +0,0 @@
# 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
@@ -1,4 +0,0 @@
# Calibre-Web proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
-53
View File
@@ -1,53 +0,0 @@
# 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)
@@ -1,30 +0,0 @@
# 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
@@ -1,4 +0,0 @@
# Erugo proměnné
TZ=Europe/Prague
PUID=1000
PGID=1000
-43
View File
@@ -1,43 +0,0 @@
# 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
@@ -1,28 +0,0 @@
# 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
@@ -1,11 +0,0 @@
# 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
@@ -1,70 +0,0 @@
# 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
@@ -1,39 +0,0 @@
# 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
@@ -1,4 +0,0 @@
# Jotty proměnné prostředí
TZ=Europe/Prague
PUID=1000
PGID=1000
-59
View File
@@ -1,59 +0,0 @@
# 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
@@ -1,35 +0,0 @@
# 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
@@ -1,9 +0,0 @@
# 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
@@ -1,54 +0,0 @@
# 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
@@ -1,57 +0,0 @@
# 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
@@ -1,19 +0,0 @@
# 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
@@ -1,64 +0,0 @@
# 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/)
@@ -1,40 +0,0 @@
# 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
@@ -1,8 +0,0 @@
# 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
@@ -1,62 +0,0 @@
# 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)
@@ -1,57 +0,0 @@
# 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
@@ -1,8 +0,0 @@
# 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
@@ -1,58 +0,0 @@
# 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
@@ -1,22 +0,0 @@
# 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
@@ -1,9 +0,0 @@
# 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
@@ -1,67 +0,0 @@
# 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)
```
@@ -1,35 +0,0 @@
# 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
@@ -1,7 +0,0 @@
# 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
@@ -1,53 +0,0 @@
# 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/)
@@ -1,53 +0,0 @@
# 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
@@ -1,10 +0,0 @@
# 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
@@ -1,51 +0,0 @@
# 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/)
@@ -1,30 +0,0 @@
# 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
@@ -1,15 +0,0 @@
# 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
@@ -1,79 +0,0 @@
# 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/)
@@ -1,41 +0,0 @@
# 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
@@ -1,22 +0,0 @@
# 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
@@ -1,61 +0,0 @@
# 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)
@@ -1,34 +0,0 @@
# 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
-162
View File
@@ -1,162 +0,0 @@
# 🏛 Architecture
> Jak je celá home infrastruktura poskládaná.
## 🎯 Přehled
Home lab běží na jednom fyzickém serveru (Ubuntu 22.04/24.04 LTS) s Docker.
Všechny služby jsou **containerizované**, za **Nginx Proxy Manager** (reverse proxy + HTTPS).
## 🌐 Vrstvy
```
┌─────────────────────────────────────────────────────────────┐
│ Layer 7: Aplikační služby │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │Nextcloud │ │Vaultwarden│ │ Gitea │ │ Jotty │ │
│ │ :11000 │ │ :2999 │ │ :3000/222│ │ :1122 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Portainer│ │ Plex │ │Audiobook-│ │ Calibre │ │
│ │ :9000 │ │ :32400 │ │shelf:13378│ │-Web:8083 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ... dalších 7 služeb (rustdesk, wikijs, speedtest, ...) │
└─────────────────────────────────────────────────────────────┘
│ HTTPS
┌─────────────────────────────────────────────────────────────┐
│ Layer 4-7: Reverzní proxy + Let's Encrypt │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Nginx Proxy Manager (:80, :443) │ │
│ │ - SSL terminace (Let's Encrypt) │ │
│ │ - HTTP → HTTPS redirect │ │
│ │ - Access Lists │ │
│ │ - Load balancing (volitelně) │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
│ HTTP
┌─────────────────────────────────────────────────────────────┐
│ Layer 2-3: Docker bridge networks │
│ Každá služba má vlastní bridge: │
│ portainer_default, vaultwarden_default, gitea_default, ... │
│ Izolace: služby mezi sebou nekomunikují (default) │
│ Komunikace: přes reverzní proxy (NPM) │
└─────────────────────────────────────────────────────────────┘
│ Docker API
┌─────────────────────────────────────────────────────────────┐
│ Layer 1: Fyzický server │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Ubuntu 22.04/24.04 LTS │ │
│ │ - Docker CE 29.x │ │
│ │ - Portainer CE (UI pro Docker) │ │
│ │ - Watchtower (auto-update monitoring) │ │
│ │ - deploy user (UID 1000) │ │
│ │ - UFW firewall + fail2ban │ │
│ │ - SSH hardening │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
## 🔌 Služby (detail)
| Služba | Port | Databáze | Volume | Backup |
|---|---|---|---|---|
| Portainer | 9000, 9443 | SQLite (interní) | `./data` | rsync |
| Nginx Proxy Manager | 80, 443, 81 | MariaDB | `./data`, `./letsencrypt` | rsync |
| Vaultwarden | 2999 | SQLite | `./data` | rsync (kritické!) |
| Nextcloud AIO | 11000 | MariaDB | `./data` | AIO Borg |
| Gitea | 3000, 222 | SQLite | `./gitea` | rsync |
| Jotty | 1122 | SQLite | `./data` | rsync |
| RustDesk | 21115-21119 | SQLite | `./data` | rsync |
| Audiobookshelf | 13378 | SQLite | `./data` + `./audiobooks` | rsync |
| Calibre-Web | 8083 | SQLite | `./data` + `./books` | rsync |
| Plex | 32400 | SQLite | `./data` + `./media` | rsync |
| Erugo | 61080 | SQLite | `./data` | rsync |
| Wiki.js | 9180 | MariaDB | `./data` | rsync |
| Speedtest | 8765 | SQLite | `./data` | rsync |
| Watchtower | | | | |
## 💾 Zálohovací schéma
```
┌────────────┐
│ Server │ rsync (denně, 03:00) → NAS /Volumes/Backups
│ /home/.../│
└────────────┘
┌────────────┐
│ NAS │ Off-site sync (Backblaze B2, týdně)
│ /Backups/ │
└────────────┘
```
Viz `install-scripts/backup-all.sh` a `install-scripts/restore-all.sh`.
## 🔐 Bezpečnost
### Perimetrie
- **UFW** default deny, povoleno: SSH, HTTP, HTTPS
- **fail2ban** ban po 3 neúspěšných SSH pokusech
- **Cloudflare Tunnel** (volitelně) přístup zvenčí bez veřejné IP
### Auth
- **SSH klíče** hesla zakázána (`PasswordAuthentication no`)
- **2FA** na všech web službách (Gitea, Vaultwarden, Nextcloud, …)
- **Vaultwarden** single source of truth pro hesla
### Network
- **Bridge isolation** služby spolu nekomunikují (default)
- **No host network** kromě Plex (HW transkódování)
- **DNS-over-HTTPS** (volitelně)
## 🔄 Deployment workflow
```
Developer
├─→ git push (do Gitea)
├─→ Ansible (na server)
│ │
│ └─→ docker compose pull && up -d
└─→ Watchtower (auto, týdně)
└─→ image: pull, container: restart
```
Viz `ansible/playbooks/`.
## 📊 Monitoring
- **Watchtower** Docker image notifikace (email/Telegram)
- **Speedtest Tracker** internet speed
- **Nextcloud Talk** interní chat
- **Portainer** Docker container status
## 🛠 Maintenance
| Úkol | Jak často | Skript/Ansible |
|---|---|---|
| Backup | Denně 03:00 | `backup-all.sh` (cron) |
| Update OS | Týdně | `apt update && apt upgrade` |
| Update Docker image | Týdně (auto) | Watchtower |
| Cert renewal | Auto (Let's Encrypt 30d) | NPM interní |
| Health check | Denně | `docker ps` + alerting |
## 🔮 Roadmap
- **Kubernetes** přechod z docker compose na k3s (1 server node, multi-workload)
- **GitOps** ArgoCD pro plnou automatizaci
- **CI/CD** Gitea Actions pro testování Ansible playbooks
- **Off-site backup** Backblaze B2 s encryption
- **Monitoring stack** Prometheus + Grafana + Loki
## 📚 Reference
- [Docker docs](https://docs.docker.com/)
- [Nginx Proxy Manager](https://nginxproxymanager.com/)
- [Ansible best practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)
- [12-factor app](https://12factor.net/)
-116
View File
@@ -1,116 +0,0 @@
# 🤝 Contributing
> Jak přispívat do tohoto repozitáře.
## 📝 Pravidla
### Commit messages
Používej **Conventional Commits**:
- `feat:` nová služba nebo funkce
- `fix:` oprava chyby
- `docs:` pouze dokumentace
- `chore:` údržba, refactoring
- `style:` formatting, bez funkční změny
- `refactor:` přestavba kódu
- `test:` přidání testů
Příklad: `feat(vaultwarden): přidat 2FA podporu`
### Branch naming
- `feature/<name>` nová feature
- `fix/<name>` bugfix
- `docs/<name>` dokumentace
Příklad: `feature/audiobookshelf-metadata`
### Pull Request
1. Fork → branch → commit → push → PR
2. **Titulek PR** krátký, výstižný
3. **Popis** co, proč, jak
4. **Screenshoty** pokud měníš UI/dokumentaci
5. **Testy** pokud měníš Ansible playbooks
## 🏗 Struktura
```
repo/
├── docker-services/ # Každá služba v samostatném adresáři
├── install-scripts/ # Bash skripty pro nové servery
├── ansible/ # Playbooky + role
├── hermes-install/ # Hermes CLI setup
├── macos-setup/ # Homebrew + macOS defaults
├── home-nas-tools/ # Metadata (žádné binárky!)
└── docs/ # Architektura, bezpečnost
```
## ✅ Checklist pro novou službu
- [ ] `docker-services/<service>/docker-compose.yml` generický, placeholders
- [ ] `docker-services/<service>/.env.example` šablona env vars
- [ ] `docker-services/<service>/README.md` dokumentace
- [ ] Aktualizován `docker-services/README.md` (tabulka)
- [ ] Aktualizován hlavní `README.md` (pokud je service klíčová)
- [ ] **Žádné citlivé údaje** v commitu
## 🔐 Bezpečnost
-**NEcommituj** hesla, API klíče, IP adresy serveru
-**NEcommituj** `~/.env` (je v `.gitignore`)
-**NEcommituj** SSH klíče
-**Vždy** používej `.env.example` jako šablonu
-**Vždy** testuj nové compose lokálně před commitem
## 🧪 Testování
Před commitem:
```bash
# Validace YAML
python3 -c "import yaml; yaml.safe_load(open('docker-services/<service>/docker-compose.yml'))"
# Validace compose (na serveru)
docker compose -f docker-services/<service>/docker-compose.yml config
# Syntax check bash
shellcheck install-scripts/<script>.sh
# Lint Ansible
ansible-lint ansible/playbooks/<playbook>.yml
```
## 📋 Verzování
- **Semver** `MAJOR.MINOR.PATCH`
- **Tagy:** `v1.0.0`, `v1.1.0`, …
- **Release notes** v GitHub/Gitea Releases
## 🐛 Hlášení chyb
Vytvoř **issue** v Gitea s:
1. **Název** krátký popis
2. **Kroky k reprodukci** co jsi udělal
3. **Očekávané chování** co jsi čekal
4. **Skutečné chování** co se stalo
5. **Verze** `git describe` + verze OS
## 💡 Návrhy features
1. Otevři **issue** s labelem `enhancement`
2. Popiš use case co chceš dělat
3. Jaké alternativy jsi zvážil
4. Jak to navrhuješ implementovat
## 📞 Kontakt
- **Issues:** Gitea
- **Email:** viz Gitea profil
- **Diskuze:** Gitea Discussions (pokud povoleno)
## 📜 Licence
Přispěním do tohoto repo souhlasíš s licencí [MIT](../LICENSE).
-152
View File
@@ -1,152 +0,0 @@
# 🔐 Security
> Bezpečnostní checklisty, hardening, threat model.
## 🛡 Defense in depth
### Layer 1: Fyzický
- Server v uzamčené místnosti
- UPS (nepřerušitelný zdroj)
- Teplotní monitoring (smart home)
### Layer 2: Síť (perimetrie)
- ✅ UFW firewall (default deny)
- ✅ fail2ban (3 SSH pokusy = ban)
- ✅ Cloudflare Tunnel (žádná veřejná IP)
- ✅ VLAN izolace (IoT vs servery)
### Layer 3: OS
- ✅ Ubuntu LTS (pravidelné bezpečnostní updaty)
- ✅ unattended-upgrades (auto security updates)
- ✅ SSH klíče (hesla zakázána)
- ✅ PermitRootLogin no
- ✅ Auditd (logování)
### Layer 4: Docker
- ✅ Bridge network isolation
- ✅ Read-only filesystémy kde to jde
- ✅ USER_UID/GID pro file ownership
- ✅ No `--privileged` (pokud to není nutné)
- ✅ No `--net=host` (kromě Plex)
- ✅ Health checks pro monitoring
- ✅ Logging: json-file driver, 10 MB × 3
### Layer 5: Aplikace
- ✅ HTTPS terminuje NPM (Let's Encrypt)
- ✅ 2FA na všech web službách
- ✅ API klíče v keychainu, ne v env souborech
- ✅ Rate limiting (NPM, fail2ban)
### Layer 6: Data
- ✅ Backup na NAS (denně)
- ✅ Off-site backup (Backblaze B2)
- ✅ Šifrované citlivé volumes (LUKS, v budoucnu)
- ✅ Retention policy (7 dní denně, 4 týdny týdně, 12 měsíců měsíčně)
## 🔑 Správa hesel
- **Vaultwarden** single source of truth
- **API klíče** v macOS keychainu (`security add-generic-password`)
- **SSH klíče** `~/.ssh/id_ed25519`, passphrase v keychainu
- **2FA** TOTP, hardwarový klíč (doporučeno YubiKey)
## 🚨 Incident Response
### Detekce
- Watchtower notifikace (image outdated)
- fail2ban email alert
- Speedtest alert (interní outage)
- Cloudflare Tunnel logy
### Postup
1. **Identifikuj** logy, monitoring
2. **Izoluj** zastavit kontejner / odpojit síť
3. **Analyzuj** root cause, scope
4. **Oprav** patch, konfigurace
5. **Dokumentuj** incident log v `~/Skripty/incident-YYYY-MM-DD.md`
### Recovery
- `restore-all.sh` pro Docker data
- Vaultwarden backup pro credentials
- DNS failover (Cloudflare)
## 🛠 Hardening checklist
### Server
- [ ] Ubuntu LTS nainstalován
- [ ] UFW aktivní, default deny
- [ ] fail2ban nakonfigurován
- [ ] SSH klíče, root login zakázán
- [ ] unattended-upgrades aktivní
- [ ] auditd běží
- [ ] Docker nainstalován z oficiálního repo
### Docker
- [ ] Bridge networks (žádný host network, kromě Plex)
- [ ] USER_UID=1000, USER_GID=1000 pro všechny kontejnery
- [ ] Volumes na hostu (./data), ne anonymous
- [ ] Health checks v compose
- [ ] Logging: 10 MB × 3 soubory
- [ ] Restart: unless-stopped
### Služby
- [ ] HTTPS terminuje NPM
- [ ] Let's Encrypt auto-renew
- [ ] 2FA na všech účtech
- [ ] Admin heslo změněno z default
- [ ] Registrace vypnuta (pokud ne private)
- [ ] SMTP nastaveno (pro notifikace)
### Zálohy
- [ ] rsync skript cron (denně 03:00)
- [ ] Off-site backup (Backblaze B2)
- [ ] Test obnovy (čtvrtletně)
- [ ] Šifrované zálohy (GPG + age)
## 📜 Compliance
- **GDPR** osobní data v Nextcloud (kontrola přístupu)
- **PCI DSS** N/A (žádné platby)
- **NIS2** pokud provozuješ služby pro třetí strany
## 🔍 Threat model
| Hrozba | Pravděpodobnost | Dopad | Mitigace |
|---|---|---|---|
| Brute force SSH | Vysoká | Nízký | fail2ban, key-only |
| Phishing | Střední | Vysoký | 2FA, edukace |
| Docker escape | Nízká | Kritický | Bridge isolation, USER_UID, pravidelné updaty |
| Supply chain (image) | Nízká | Vysoký | Oficiální image, Watchtower, GPG signing |
| Insider threat | Nízká | Střední | Audit logy, 2FA, hesla v keychainu |
| Ransomware | Nízká | Kritický | Off-site backup, 3-2-1 rule |
| DDoS | Střední | Střední | Cloudflare, fail2ban |
| DNS hijack | Nízká | Vysoký | DNSSEC, HTTPS |
| Zero-day v OS | Střední | Kritický | unattended-upgrades, WAF |
## 🔐 API token management
```bash
# Uložení do keychainu
security add-generic-password \
-s "service:api:192.168.0.148" \
-a "user" \
-w "TOKEN" -U
# Čtení v skriptech
TOKEN=$(security find-generic-password \
-s "service:api:192.168.0.148" \
-a "user" -w)
```
**Pravidla:**
- Token **nikdy** v `.env` souborech
- Token **nikdy** v `docker-compose.yml`
- Token **nikdy** v git history
- Token **pouze** v keychainu nebo env variables
## 📚 Reference
- [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework)
- [CIS Ubuntu Linux Benchmark](https://www.cisecurity.org/benchmark/ubuntu_linux)
-111
View File
@@ -1,111 +0,0 @@
# 🤖 Hermes Install
> Instalace a konfigurace **Hermes Agent** (AI asistent) na macOS.
## 📦 Obsah
| Soubor | Účel |
|---|---|
| [`install-hermes.sh`](install-hermes.sh) | Instaluje Hermes CLI |
| [`configure-hermes.sh`](configure-hermes.sh) | Nastaví API klíče, pracovní adresáře, profily |
| [`hermes-config.example.yml`](hermes-config.example.yml) | Ukázková konfigurace |
| [`README.md`](README.md) | Tento soubor |
## 🤖 Co je Hermes?
Hermes je **AI asistent** (Claude/GPT) integrovaný v terminálu. Umí:
- Spravovat soubory, Git, Docker
- Spouštět skripty (sandbox)
- Plánovat a provádět multi-step úkoly
- Učit se z paměti
- Integrovat se schránkou, poštou, kalendářem
## 🚀 Quickstart
```bash
# 1. Instalace
curl -fsSL https://hermes-agent.dev/install.sh | bash
# Nebo:
bash install-hermes.sh
# 2. Konfigurace (API klíč)
bash configure-hermes.sh
# nebo ručně:
hermes config set api-key <tvuj-api-klic>
hermes config set model claude-sonnet-4.5
# 3. Test
hermes --version
hermes chat "Ahoj, kdo jsi?"
# 4. Přidání Fish aliasu (volitelně)
hermes config alias
```
## ⚙️ Konfigurace
`hermes-config.example.yml` obsahuje:
```yaml
# API provider
provider: anthropic
model: claude-sonnet-4.5
api_key: ${HERMES_API_KEY}
# Pracovní adresáře
workspace: ~/Skripty
memory_dir: ~/.hermes/memory
# Sandbox: povolené příkazy
sandbox:
allow:
- "ls"
- "cat"
- "git"
- "docker"
- "kubectl"
deny:
- "rm -rf /"
- "dd if="
```
## 🔐 Bezpečnost
- **Sandbox** Hermes ve výchozím stavu **nesmaže** `rm -rf /` ani podobné destruktivní příkazy
- **API klíč** ulož do **macOS keychainu**, ne do konfiguráku
- **Audit log** `hermes log show` ukáže historii příkazů
- **Permissions** nastav na minimum potřebné
## 🧠 Memory a kontext
Hermes si pamatuje:
- Tvoje preference a workflow
- Kontext projektů (~/Skripty, ~/git-repos, …)
- Dřívější konverzace
Reset:
```bash
hermes memory reset
hermes memory show
```
## 🔌 Integrace
- **Gitea** push/pull, správa issues
- **Docker** compose, logs, restart
- **Git** všechny git operace
- **Fish shell** aliasy
- **macOS** clipboard, notifications
## 📚 Dokumentace
- [Hermes docs](https://hermes-agent.nousresearch.com/docs)
- [Hermes GitHub](https://github.com/NousResearch/hermes-agent)
## 🆘 Support
- **Issues:** [github.com/NousResearch/hermes-agent/issues](https://github.com/NousResearch/hermes-agent/issues)
- **Discord:** [discord.gg/hermes](https://discord.gg/hermes)
- **Email:** support@hermes-agent.dev
-115
View File
@@ -1,115 +0,0 @@
#!/usr/bin/env bash
#
# Konfigurace Hermes Agent
# - nastaví API klíč (z keychainu)
# - vytvoří výchozí ~/.config/hermes/config.yml
# - nastaví pracovní adresáře
#
set -euo pipefail
HERMES_CONFIG_DIR="$HOME/.config/hermes"
HERMES_CONFIG="$HERMES_CONFIG_DIR/config.yml"
HERMES_MEMORY="$HOME/.hermes/memory"
# API klíč z keychainu
echo "▶ Hledám API klíč v keychainu (služba: hermes:api)..."
API_KEY=$(security find-generic-password -s "hermes:api" -a "user" -w 2>/dev/null || true)
if [[ -z "$API_KEY" ]]; then
echo "⚠ API klíč není v keychainu."
read -rp "Vlož API klíč (nebo Enter pro přeskočení): " API_KEY
if [[ -n "$API_KEY" ]]; then
security add-generic-password -s "hermes:api" -a "user" -w "$API_KEY" -U
echo "✓ API klíč uložen do keychainu"
fi
fi
# Vytvoř config adresář
mkdir -p "$HERMES_CONFIG_DIR" "$HERMES_MEMORY"
# Výchozí config
cat > "$HERMES_CONFIG" <<EOF
# Hermes configuration
# Generováno configure-hermes.sh $(date +%Y-%m-%d)
provider: anthropic
model: claude-sonnet-4.5
api_key: \${HERMES_API_KEY} # čte z env, fallback: security find-generic-password
# Pracovní adresáře
workspace: ~/Skripty
memory_dir: $HERMES_MEMORY
# Sandbox
sandbox:
enabled: true
allow:
- "ls"
- "cat"
- "grep"
- "find"
- "git"
- "docker"
- "docker compose"
- "kubectl"
- "ssh"
- "scp"
- "rsync"
- "curl"
- "jq"
deny:
- "rm -rf /"
- "rm -rf /*"
- "dd if="
- "mkfs"
- ":(){:|:&};:"
# Integrace
integrations:
gitea:
url: http://192.168.0.148:3000
token_name: hermes:api:192.168.0.148
docker:
socket: /var/run/docker.sock
git:
user_name: "Hermes Agent"
user_email: "hermes@localhost"
# Output
output:
format: markdown
streaming: true
language: cs
# UI
ui:
theme: dark
icons: emoji
EOF
# Environment v shellu
SHELL_RC="$HOME/.zshrc"
if ! grep -q "HERMES_API_KEY" "$SHELL_RC" 2>/dev/null; then
cat >> "$SHELL_RC" <<'EOF'
# Hermes Agent API key (načítá z keychainu)
export HERMES_API_KEY=$(security find-generic-password -s "hermes:api" -a "user" -w 2>/dev/null)
EOF
echo "✓ ~/.zshrc aktualizován"
fi
# Fish varianta
FISH_CONFIG="$HOME/.config/fish/config.fish"
if [[ -f "$FISH_CONFIG" ]] && ! grep -q "HERMES_API_KEY" "$FISH_CONFIG" 2>/dev/null; then
cat >> "$FISH_CONFIG" <<'EOF'
# Hermes Agent API key
set -gx HERMES_API_KEY (security find-generic-password -s "hermes:api" -a "user" -w 2>/dev/null)
EOF
echo "✓ Fish config aktualizován"
fi
echo
echo "🎉 Hermes nakonfigurován!"
echo
echo "Test: hermes chat \"Ahoj\""
-69
View File
@@ -1,69 +0,0 @@
# Hermes Agent ukázková konfigurace
# Zkopíruj na ~/.config/hermes/config.yml a doplň
# AI provider a model
provider: anthropic
model: claude-sonnet-4.5
api_key: ${HERMES_API_KEY}
# Pracovní adresáře
workspace: ~/Skripty
memory_dir: ~/.hermes/memory
projects_dir: ~/git-repos
# Sandbox bezpečnostní omezení
sandbox:
enabled: true
allow:
- "ls"
- "cat"
- "grep"
- "find"
- "git"
- "docker"
- "docker compose"
- "kubectl"
- "ssh"
- "scp"
- "rsync"
- "curl"
- "jq"
deny:
- "rm -rf /"
- "rm -rf /*"
- "dd if="
- "mkfs"
# Integrace s existujícími službami
integrations:
gitea:
url: http://CHANGE_ME:3000
token_name: "gitea:api:CHANGE_ME"
docker:
socket: /var/run/docker.sock
ssh:
default_user: deploy
default_key: ~/.ssh/id_ed25519
# Výstup
output:
format: markdown
streaming: true
language: cs
color: true
# UI
ui:
theme: dark
icons: emoji
spinner: dots
# Bezpečnost
security:
audit_log: true
require_approval_for:
- "rm"
- "docker system prune"
- "kubectl delete"
- "git push --force"
api_key_storage: keychain # macOS keychain
-65
View File
@@ -1,65 +0,0 @@
#!/usr/bin/env bash
#
# Instalace Hermes Agent na macOS
# - vyžaduje Homebrew a Fish shell
# - nainstaluje Hermes CLI
# - přidá aliasy do Fish
#
set -euo pipefail
if [[ "$(uname)" != "Darwin" ]]; then
echo "Tento skript je pouze pro macOS" >&2
exit 1
fi
# Kontrola Homebrew
if ! command -v brew &>/dev/null; then
echo "▶ Instaluji Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# Kontrola Fish
if ! command -v fish &>/dev/null; then
echo "▶ Instaluji Fish..."
brew install fish
fi
# Instalace Hermes (přes pip)
echo "▶ Instaluji Hermes přes pip..."
python3 -m pip install --user hermes-agent
# Přidání do PATH (pokud není)
PIP_BIN="$HOME/Library/Python/3.9/bin"
if [[ -d "$PIP_BIN" ]] && [[ ":$PATH:" != *":$PIP_BIN:"* ]]; then
cat >> ~/.zshrc <<EOF
export PATH="\$HOME/Library/Python/3.9/bin:\$PATH"
EOF
export PATH="$PIP_BIN:$PATH"
fi
# Ověření
if command -v hermes &>/dev/null; then
echo "✓ Hermes nainstalován: $(hermes --version)"
else
echo "⚠ Hermes není v PATH. Přidej ručně: export PATH=\"\$HOME/Library/Python/3.9/bin:\$PATH\""
fi
# Fish alias
FISH_CONFIG="$HOME/.config/fish/config.fish"
mkdir -p "$(dirname "$FISH_CONFIG")"
if ! grep -q "alias hermes=" "$FISH_CONFIG" 2>/dev/null; then
cat >> "$FISH_CONFIG" <<'EOF'
# Hermes Agent
alias h='hermes'
alias hchat='hermes chat'
alias hgit='hermes git'
alias hd='hermes docker'
EOF
echo "✓ Fish aliasy přidány"
fi
echo
echo "🎉 Hotovo! Nastav API klíč:"
echo " security add-generic-password -s hermes:api -a user -w <klíč> -U"
echo " hermes config set api-key <klíč>"
-171
View File
@@ -1,171 +0,0 @@
# 🗂 home-nas-tools
> Rejstřík projektů uložených na **NAS**. Tento adresář obsahuje **pouze metadata**
> samotné archivy zůstávají na NAS, do Gitea se **nekopírují**.
## 🎯 Účel
-**Orientace** vědět co kde je
-**Replikace** snadné znovuvytvoření na novém stroji
-**Dokumentace** co archiv obsahuje, jak ho rozbalit, jak nasadit
## 📍 Cesta k archivům (NAS)
Všechny archivy jsou uloženy na:
```
/Volumes/Backups/Prace/moje-tools/
```
Tato cesta je **specifická pro tvůj Mac** s připojeným NAS (SMB).
Na novém stroji musíš **připojit NAS** (`/Volumes/Backups/...`) nebo
**zkopírovat archivy ručně** (např. přes `scp`, USB disk, cloud).
## 📚 Rejstřík projektů
> **Názvy projektů** v tomto README jsou **zobecněné popisy** konkrétní názvy
> archivů a popis obsahu zůstávají pouze v NAS. Pokud chceš znát detail, otevři
> si `archive-index.md` (gitignored, lokální soubor na tvém Macu) nebo přímo NAS.
### 🔐 Bezpečnost a utility
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|---|---|---|---|
| `web-aplikace` | `web-aplikace.txt` | ~135 B | Poznámky k web nástrojům (OSINT) |
| `backup-bitcopy` | `bitcopy-backup-*.tar.gz` | ~9 KB | Bit-perfect zálohovací nástroj (shell) |
| `whois-util` | `whois.zip` | ~3 KB | Whois lookup utilita |
### 🕵️ Forenzika a bezpečnostní analýza
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|---|---|---|---|
| `forensic-asistent-1` | `Digitalní*asistent*.zip` | ~9 MB | Asistent pro forenzní výslechy |
| `forensic-pipeline` | `forensic-pipeline.zip` | ~53 MB | Forenzní pipeline (zpracování důkazů) |
| `gesture-to-pin` | `gesto*pin.zip` | ~54 KB | Web app: gesture → PIN |
| `wireless-auditor` | `aircrack-ng.zip` | ~29 MB | Kompilace wireless auditu |
| `network-mapper` | `network-topology-mapper.zip` | ~1.2 MB | Mapper síťové topologie |
| `rpi4-scanner` | `zaloha-rpi4-*.zip` | ~3 MB | Raspberry Pi 4 scanner |
### 📄 Konverze dokumentů
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|---|---|---|---|
| `json2xml` | `jonson2xml.zip` | ~43 MB | JSON ↔ XML konverze |
| `json2xml-batch` | `prevod-json-souboru-do-xml.zip` | ~4 KB | Batch konverze |
| `xml-sms-parser` | `prevod-xml-sms-zalohy.zip` | ~16 KB | SMS XML parser |
| `ocr2txt` | `ocr2txt.zip` | ~7 KB | OCR extrakce textu |
| `ocr2txt-v2` | `ocr2txt-*.zip` | ~31 MB | OCR v2 |
| `forensic-helper` | `programAmateriX.zip` | ~47 KB | Forenzní pomůcka |
### 📧 E-maily
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|---|---|---|---|
| `eml-comparator` | `provnani-eml-slozek.zip` | ~12 MB | Porovnání EML složek |
### 💻 Hardware a utility
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|---|---|---|---|
| `usb-share` | `usb-share.zip` | ~7 KB | USB share utilita |
| `unique-pw` | `unik-hesel.zip` | ~1 KB | Unique passwords utilita |
| `foto-dokumentace` | `_skript-na-fotodokumentaci.zip` | ~154 KB | Skript pro fotodokumentaci |
### 🤖 AI / Asistenti (velké archivy)
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|---|---|---|---|
| `ai-asistent-docker` | `AI_Prepis-docker-*.7z` | ~1.3 GB | AI asistent Docker verze |
| `ai-asistent-portable` | `AI_Prepis-portable-*.zip` | ~14 GB | AI asistent Portable |
| `ai-asistent-final` | `AI_Prepis-portable-FINAL*.zip` | ~3 GB | AI asistent finální verze |
| `prace-kolekce` | `_prace-programy.zip` | ~1.2 GB | Pracovní programy (kolekce) |
## 📊 Statistiky (přibližné)
| Kategorie | Počet | Celková velikost |
|---|---|---|
| Bezpečnost a utility | 3 | ~12 KB |
| Forenzika | 6 | ~4 GB |
| Konverze dokumentů | 6 | ~94 MB |
| E-maily | 1 | ~12 MB |
| Hardware | 3 | ~4 MB |
| AI / Asistenti | 4 | ~19 GB |
| **Celkem** | **23** | **~23 GB** |
## 🗂 Struktura adresáře
```
home-nas-tools/
├── README.md # Tento soubor (zobecněný)
└── archive-index.md # GITIGNORED lokální index s konkrétními názvy
```
## 🔄 Jak znovuvytvořit na novém stroji
### 1. Připoj NAS
```bash
# macOS
mount -t smbfs //user@nas/Backups/Prace /Volumes/nas-tools
# Nebo zkopíruj archivy přes rsync/scp
rsync -av user@nas:/Backups/Prace/moje-tools/ /Users/Shared/nas-tools/
```
### 2. Rozbal archiv
```bash
cd /Users/Shared/nas-tools
tar -xzf bitcopy-backup-*.tar.gz
unzip 'gesto*pin.zip'
unzip -P <password> zaloha-rpi4-*.zip
```
### 3. Nasaď podle README
Každý projekt má v NAS vlastní README s konkrétním postupem instalace.
## ⚠️ Bezpečnost
- **Archivy obsahují citlivá data** (forenzní dumpy, uniklá hesla, interní utility)
- **NEVER pushuj archivy do Gitea** vždy zůstávají na NAS
- **Některé archivy jsou šifrované** chraň hesla v keychainu
- **Nesdílej tento adresář** na veřejných platformách bez kontroly
- **Pro prezentaci kolegům** použij **jinou verzi** tohoto README (bez konkrétních odkazů)
## 🔐 Doporučené zálohovací schéma
```
┌──────────────────────┐
│ Mac (~/Skripty/) │ ← Pracovní kopie
└──────────┬───────────┘
│ rsync (denně)
┌──────────────────────┐
│ NAS (moje-tools/) │ ← Centrální záloha
└──────────┬───────────┘
│ off-site backup
┌──────────────────────┐
│ Cloud (S3/Backblaze)│ ← Disaster recovery
└──────────────────────┘
```
## 📝 Pro vlastní potřebu (lokální, ne v gitu)
Vytvoř si lokálně soubor `archive-index.md` s **konkrétními** názvy archivů a jejich obsahem:
```bash
# Vytvoř si lokální soukromý index
cat > ~/git-repos/mates/home-nas-tools/.archive-index.md << 'EOF'
# Soukromý index NEVER commit
# Konkrétní názvy archivů na NAS
| Archiv | Cesta k souboru | MD5 | Poznámka |
|---|---|---|---|
| ai-asistent-docker | /Volumes/Backups/Prace/moje-tools/AI_Prepis-docker-verze.7z | abc123 | ... |
...
EOF
# Tento soubor je v .gitignore, takže zůstane jen u tebe
```
-66
View File
@@ -1,66 +0,0 @@
# 📥 Install Scripts
> Bash skripty pro nasazení nového Ubuntu serveru (22.04 / 24.04 LTS).
> Idempotentní, s `--help` a dry-run.
## 📚 Skripty
| Skript | Účel |
|---|---|
| [`bootstrap-ubuntu-server.sh`](bootstrap-ubuntu-server.sh) | Úvodní setup: aktualizace, uživatel, SSH, firewall, fail2ban |
| [`install-docker.sh`](install-docker.sh) | Docker + Docker Compose plugin |
| [`install-portainer.sh`](install-portainer.sh) | Portainer CE |
| [`install-nginx-proxy.sh`](install-nginx-proxy.sh) | Nginx Proxy Manager (s HTTPS) |
| [`backup-all.sh`](backup-all.sh) | Záloha všech Docker dat na NAS |
| [`restore-all.sh`](restore-all.sh) | Obnova z NAS zálohy |
## 🚀 Quickstart (nový server)
```bash
# 1. Bootstrap (úvodní nastavení)
sudo bash bootstrap-ubuntu-server.sh
# 2. Docker
sudo bash install-docker.sh
# 3. Portainer
sudo bash install-portainer.sh
# 4. NPM (reverzní proxy)
sudo bash install-nginx-proxy.sh
# 5. Přidej služby
cd ~/docker-services/portainer
cp .env.example .env && nano .env
docker compose up -d
```
## ⚙️ Společné konvence
- Všechny skripty podporují `--help`
- `set -euo pipefail` (fail-fast)
- Idempotentní (můžeš spustit víckrát)
- Logy do `/var/log/<skript>.log`
- Barvy v terminále (ANSI), automaticky se vypnou v non-TTY
## 🔐 Bezpečnost
- **Nikdy nespouštěj skript, který nečteš** `less <skript>` předem
- **Všechny skripty chtějí root** kontrolují `$EUID`
- **Všechny skripty** podporují dry-run, kde to dává smysl
- **Bez hesel v skriptech** vše z `prompt` nebo `.env`
## 📁 Struktura
```
install-scripts/
├── README.md
├── bootstrap-ubuntu-server.sh
├── install-docker.sh
├── install-portainer.sh
├── install-nginx-proxy.sh
├── backup-all.sh
├── restore-all.sh
└── lib/ # Společné knihovny
└── common.sh
```
-73
View File
@@ -1,73 +0,0 @@
#!/usr/bin/env bash
#
# Záloha všech Docker dat na NAS
# - najde všechny kontejnery s volume mounty v /home/<user>/docker
# - zastaví je (volitelně), zabalí data do tar.gz, pošle na NAS
# - ponechá běžící kontejnery běžet (default)
#
# Použití:
# sudo bash backup-all.sh # zálohuj vše (bez zastavení)
# sudo bash backup-all.sh --stop # zastav před zálohou
# sudo bash backup-all.sh --dry-run # pouze ukaž co by se dělalo
# sudo bash backup-all.sh --only portainer # jen jednu službu
#
set -euo pipefail
DEPLOY_USER="${DEPLOY_USER:-deploy}"
DOCKER_HOME="/home/$DEPLOY_USER/docker"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Backups}"
BACKUP_ROOT="$NAS_MOUNT/Prace/server-backups/$(hostname)"
TS="$(date +%Y%m%d-%H%M%S)"
STOP=false
DRY_RUN=false
ONLY=""
while [[ $# -gt 0 ]]; do
case $1 in
--stop) STOP=true; shift ;;
--dry-run) DRY_RUN=true; shift ;;
--only) ONLY="$2"; shift 2 ;;
*) echo "Neznámý parametr: $1" >&2; exit 1 ;;
esac
done
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
[[ -d "$DOCKER_HOME" ]] || { echo "Adresář $DOCKER_HOME neexistuje" >&2; exit 1; }
run() {
if $DRY_RUN; then
echo "[DRY-RUN] $*"
else
echo "$*"
"$@"
fi
}
mkdir -p "$BACKUP_ROOT"
for SERVICE_DIR in "$DOCKER_HOME"/*/; do
SERVICE=$(basename "$SERVICE_DIR")
[[ -n "$ONLY" && "$SERVICE" != "$ONLY" ]] && continue
[[ -f "$SERVICE_DIR/docker-compose.yml" ]] || continue
BACKUP_DIR="$BACKUP_ROOT/$SERVICE"
BACKUP_FILE="$BACKUP_DIR/${SERVICE}-$TS.tar.zst"
if $STOP; then
run docker compose -f "$SERVICE_DIR/docker-compose.yml" stop
fi
if [[ -d "$SERVICE_DIR/data" ]]; then
run mkdir -p "$BACKUP_DIR"
run tar --zstd -cf "$BACKUP_FILE" -C "$SERVICE_DIR" data
echo "$SERVICE: $BACKUP_FILE"
fi
if $STOP; then
run docker compose -f "$SERVICE_DIR/docker-compose.yml" start
fi
done
echo
echo "🎯 Hotovo. Zálohy v: $BACKUP_ROOT"
-178
View File
@@ -1,178 +0,0 @@
#!/usr/bin/env bash
#
# Bootstrap Ubuntu Server (22.04/24.04 LTS)
# - aktualizace systému
# - vytvoření deploy uživatele (UID 1000)
# - základní SSH hardening
# - UFW firewall
# - fail2ban
# - základní utility (curl, wget, git, vim, …)
#
# Idempotentní můžeš spustit víckrát.
#
# Použití:
# sudo bash bootstrap-ubuntu-server.sh
#
set -euo pipefail
# Barvy
readonly RED=$'\033[0;31m'
readonly GREEN=$'\033[0;32m'
readonly YELLOW=$'\033[1;33m'
readonly BLUE=$'\033[0;34m'
readonly NC=$'\033[0m'
log() { echo -e "${BLUE}[$(date +%H:%M:%S)]${NC} $*"; }
ok() { echo -e "${GREEN}${NC} $*"; }
warn() { echo -e "${YELLOW}${NC} $*" >&2; }
err() { echo -e "${RED}${NC} $*" >&2; exit 1; }
[[ $EUID -eq 0 ]] || err "Tento skript musí běžet jako root (sudo)."
DEPLOY_USER="${DEPLOY_USER:-deploy}"
DEPLOY_UID="${DEPLOY_UID:-1000}"
SSH_PORT="${SSH_PORT:-22}"
TIMEZONE="${TIMEZONE:-Europe/Prague}"
# ────────────────────────────────────────────────────────
# 1. Aktualizace systému
# ────────────────────────────────────────────────────────
log "Aktualizace systému..."
apt-get update -qq
apt-get upgrade -y -qq
apt-get dist-upgrade -y -qq
apt-get autoremove -y -qq
ok "Systém aktualizován"
# ────────────────────────────────────────────────────────
# 2. Základní utility
# ────────────────────────────────────────────────────────
log "Instalace základních utilit..."
apt-get install -y -qq \
curl wget git vim nano htop \
ca-certificates gnupg lsb-release \
software-properties-common apt-transport-https \
ufw fail2ban \
bash-completion
ok "Utility nainstalovány"
# ────────────────────────────────────────────────────────
# 3. Timezone
# ────────────────────────────────────────────────────────
log "Nastavuji timezone: $TIMEZONE"
timedatectl set-timezone "$TIMEZONE"
ok "Timezone: $(timedatectl show -p Timezone --value)"
# ────────────────────────────────────────────────────────
# 4. Deploy uživatel (UID 1000)
# ────────────────────────────────────────────────────────
if id "$DEPLOY_USER" &>/dev/null; then
ok "Uživatel $DEPLOY_USER existuje"
else
log "Vytvářím uživatele $DEPLOY_USER (UID $DEPLOY_UID)..."
adduser --uid "$DEPLOY_UID" --gecos "" --disabled-password --shell /bin/bash "$DEPLOY_USER"
passwd -d "$DEPLOY_USER" # bez hesla (key-based auth)
mkdir -p /home/"$DEPLOY_USER"/.ssh
chmod 700 /home/"$DEPLOY_USER"/.ssh
# Přidání authorized_keys během deploymentu zde necháme prázdné
touch /home/"$DEPLOY_USER"/.ssh/authorized_keys
chmod 600 /home/"$DEPLOY_USER"/.ssh/authorized_keys
chown -R "$DEPLOY_USER":"$DEPLOY_USER" /home/"$DEPLOY_USER"/.ssh
ok "Uživatel $DEPLOY_USER vytvořen"
fi
# Přidání do sudo bez hesla (volitelné, bezpečnostní)
if ! grep -q "^$DEPLOY_USER.*NOPASSWD" /etc/sudoers.d/"$DEPLOY_USER" 2>/dev/null; then
echo "$DEPLOY_USER ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/"$DEPLOY_USER"
chmod 440 /etc/sudoers.d/"$DEPLOY_USER"
ok "$DEPLOY_USER přidán do sudoers (NOPASSWD)"
fi
# ────────────────────────────────────────────────────────
# 5. SSH hardening
# ────────────────────────────────────────────────────────
log "SSH hardening..."
SSHD_CONFIG="/etc/ssh/sshd_config"
cp "$SSHD_CONFIG" "$SSHD_CONFIG.bak.$(date +%Y%m%d)" 2>/dev/null || true
# Nastavit port
sed -i "s/^#\?Port .*/Port $SSH_PORT/" "$SSHD_CONFIG"
# Zakázat root login
sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' "$SSHD_CONFIG"
# Zakázat password auth (jen klíče)
sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' "$SSHD_CONFIG"
# X11 forwarding vypnout
sed -i 's/^#\?X11Forwarding .*/X11Forwarding no/' "$SSHD_CONFIG"
# ClientAliveInterval
sed -i 's/^#\?ClientAliveInterval .*/ClientAliveInterval 300/' "$SSHD_CONFIG"
sed -i 's/^#\?ClientAliveCountMax .*/ClientAliveCountMax 2/' "$SSHD_CONFIG"
# Validace configu
sshd -t && systemctl restart ssh
ok "SSH nakonfigurován (port $SSH_PORT, root login zakázán)"
# ────────────────────────────────────────────────────────
# 6. UFW firewall
# ────────────────────────────────────────────────────────
log "Konfigurace UFW..."
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow "$SSH_PORT"/tcp comment "SSH"
# Služby (zakomentuj co nepoužíváš)
ufw allow 80/tcp comment "HTTP"
ufw allow 443/tcp comment "HTTPS"
# Docker swarm (volitelně)
# ufw allow 2377/tcp comment "Docker swarm"
# ufw allow 7946/tcp comment "Docker swarm gossip"
# ufw allow 7946/udp comment "Docker swarm gossip"
# ufw allow 4789/udp comment "Docker overlay"
# SSH z home (volitelně)
# ufw allow from 192.168.0.0/24 to any port $SSH_PORT proto tcp
ufw --force enable
ok "UFW aktivní, SSH povoleno"
# ────────────────────────────────────────────────────────
# 7. Fail2ban
# ────────────────────────────────────────────────────────
log "Konfigurace fail2ban..."
cat > /etc/fail2ban/jail.local <<EOF
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = $SSH_PORT
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
EOF
systemctl enable --now fail2ban
systemctl restart fail2ban
ok "Fail2ban aktivní"
# ────────────────────────────────────────────────────────
# 8. Čas a DNS
# ────────────────────────────────────────────────────────
log "Konfigurace timesyncd..."
apt-get install -y -qq systemd-timesyncd
sed -i 's/^#NTP=.*/NTP=0.pool.ntp.org 1.pool.ntp.org/' /etc/systemd/timesyncd.conf
systemctl restart systemd-timesyncd
ok "Time sync aktivní"
# ────────────────────────────────────────────────────────
# Hotovo
# ────────────────────────────────────────────────────────
echo
ok "Bootstrap dokončen!"
echo
echo "📋 Další kroky:"
echo " 1. sudo bash install-docker.sh"
echo " 2. sudo bash install-portainer.sh"
echo " 3. sudo bash install-nginx-proxy.sh"
echo " 4. Přidej svůj SSH klíč: sudo -u $DEPLOY_USER bash -c 'echo \"<tvuj-klic>\" >> ~/.ssh/authorized_keys'"
echo
echo "⚠️ Před odhlášením se ujisti, že máš funkční SSH přístup jako $DEPLOY_USER!"
-51
View File
@@ -1,51 +0,0 @@
#!/usr/bin/env bash
#
# Instalace Docker + Docker Compose plugin na Ubuntu 22.04/24.04
# - oficiální Docker repo
# - non-interactive
# - post-instalace: přidá DEPLOY_USER do docker group
#
# Idempotentní.
#
set -euo pipefail
DEPLOY_USER="${DEPLOY_USER:-deploy}"
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
# 1. Příprava
apt-get update -qq
apt-get install -y -qq ca-certificates curl gnupg
# 2. Docker GPG klíč
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
# 3. Docker repo
ARCH=$(dpkg --print-architecture)
CODENAME=$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
echo "deb [arch=$ARCH signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $CODENAME stable" \
> /etc/apt/sources.list.d/docker.list
# 4. Instalace
apt-get update -qq
apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 5. Služba
systemctl enable --now docker
systemctl is-active --quiet docker && echo "✓ Docker běží"
# 6. DEPLOY_USER do docker group (bez sudo pro docker)
if id "$DEPLOY_USER" &>/dev/null; then
usermod -aG docker "$DEPLOY_USER"
echo "$DEPLOY_USER přidán do docker group (odhlas se a prihlas pro efekt)"
fi
# 7. Test
docker --version
docker compose version
echo
echo "🎉 Docker nainstalován!"
echo " Odhlas se a prihlas se jako $DEPLOY_USER pro práci bez sudo."
-64
View File
@@ -1,64 +0,0 @@
#!/usr/bin/env bash
#
# Instalace Nginx Proxy Manager (NPM) s HTTPS
# - MariaDB backend
# - Let's Encrypt ready
# - Web UI na portu 81
#
set -euo pipefail
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
DEPLOY_USER="${DEPLOY_USER:-deploy}"
INSTALL_DIR="/opt/nginx-proxy-manager"
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-}"
if [[ -z "$MYSQL_ROOT_PASSWORD" ]]; then
read -rsp "MySQL root heslo (pro NPM DB): " MYSQL_ROOT_PASSWORD
echo
fi
if [[ -d "$INSTALL_DIR" ]]; then
echo "✓ NPM už v $INSTALL_DIR nainstalován"
else
mkdir -p "$INSTALL_DIR/data" "$INSTALL_DIR/mysql" "$INSTALL_DIR/letsencrypt"
chown -R "$DEPLOY_USER:$DEPLOY_USER" "$INSTALL_DIR"
cat > "$INSTALL_DIR/docker-compose.yml" <<EOF
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:
- TZ=Europe/Prague
- DISABLE_IPV6=true
depends_on:
- db
db:
image: jc21/mariadb-aria:latest
container_name: npm_db
restart: unless-stopped
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
- TZ=Europe/Prague
EOF
cd "$INSTALL_DIR"
docker compose up -d
echo "✓ NPM nasazen"
fi
echo
echo "🌐 NPM Admin: http://$(hostname -I | awk '{print $1}'):81"
echo " Výchozí login: admin@example.com / changeme (ZMĚŇ!)"
-43
View File
@@ -1,43 +0,0 @@
#!/usr/bin/env bash
#
# Instalace Portainer CE
# - nejdřív vyžaduje Docker (spusť install-docker.sh)
# - běží jako docker compose v /opt/portainer
#
set -euo pipefail
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
DEPLOY_USER="${DEPLOY_USER:-deploy}"
INSTALL_DIR="/opt/portainer"
if [[ -d "$INSTALL_DIR" ]]; then
echo "✓ Portainer už v $INSTALL_DIR nainstalován"
else
mkdir -p "$INSTALL_DIR/data"
chown -R "$DEPLOY_USER:$DEPLOY_USER" "$INSTALL_DIR"
cat > "$INSTALL_DIR/docker-compose.yml" <<'EOF'
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:
- TZ=Europe/Prague
EOF
cd "$INSTALL_DIR"
docker compose up -d
echo "✓ Portainer nasazen"
fi
echo
echo "🌐 Portainer: http://$(hostname -I | awk '{print $1}'):9000"
echo " První přihlášení: vytvoř admin účet"
-73
View File
@@ -1,73 +0,0 @@
#!/usr/bin/env bash
#
# Obnova Docker dat z NAS zálohy
# - najde nejnovější zálohu pro danou službu
# - zastaví službu, rozbalí data, nastartuje
#
# Použití:
# sudo bash restore-all.sh # obnov vše
# sudo bash restore-all.sh --only portainer # jen portainer
# sudo bash restore-all.sh --from 20240801-120000 # konkrétní záloha
# sudo bash restore-all.sh --dry-run
#
set -euo pipefail
DEPLOY_USER="${DEPLOY_USER:-deploy}"
DOCKER_HOME="/home/$DEPLOY_USER/docker"
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Backups}"
BACKUP_ROOT="$NAS_MOUNT/Prace/server-backups/$(hostname)"
DRY_RUN=false
ONLY=""
FROM=""
while [[ $# -gt 0 ]]; do
case $1 in
--only) ONLY="$2"; shift 2 ;;
--from) FROM="$2"; shift 2 ;;
--dry-run) DRY_RUN=true; shift ;;
*) echo "Neznámý parametr: $1" >&2; exit 1 ;;
esac
done
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
run() {
if $DRY_RUN; then
echo "[DRY-RUN] $*"
else
echo "$*"
"$@"
fi
}
[[ -d "$BACKUP_ROOT" ]] || { echo "$BACKUP_ROOT neexistuje" >&2; exit 1; }
for SERVICE_DIR in "$DOCKER_HOME"/*/; do
SERVICE=$(basename "$SERVICE_DIR")
[[ -n "$ONLY" && "$SERVICE" != "$ONLY" ]] && continue
[[ -f "$SERVICE_DIR/docker-compose.yml" ]] || continue
if [[ -n "$FROM" ]]; then
BACKUP_FILE="$BACKUP_ROOT/$SERVICE/${SERVICE}-$FROM.tar.zst"
else
# Nejnovější záloha
BACKUP_FILE=$(ls -t "$BACKUP_ROOT/$SERVICE"/${SERVICE}-*.tar.zst 2>/dev/null | head -1 || true)
fi
[[ -z "$BACKUP_FILE" || ! -f "$BACKUP_FILE" ]] && { echo "$SERVICE: žádná záloha, přeskakuji"; continue; }
echo "$SERVICE: obnovuji z $BACKUP_FILE"
if ! $DRY_RUN; then
run docker compose -f "$SERVICE_DIR/docker-compose.yml" stop
run rm -rf "$SERVICE_DIR/data"
run mkdir -p "$SERVICE_DIR/data"
run tar --zstd -xf "$BACKUP_FILE" -C "$SERVICE_DIR"
run chown -R "$DEPLOY_USER:$DEPLOY_USER" "$SERVICE_DIR/data"
run docker compose -f "$SERVICE_DIR/docker-compose.yml" up -d
echo "$SERVICE obnoven"
fi
done
echo
echo "🎯 Obnova dokončena"
-78
View File
@@ -1,78 +0,0 @@
# Brewfile instalace všech macOS aplikací
# Tento soubor použij s: brew bundle --file=Brewfile
# Generováno z produkčního Macu (viz README)
# ───────────── TAPS ─────────────
tap "homebrew/bundle"
tap "homebrew/cask"
tap "homebrew/cask-fonts"
tap "homebrew/core"
# ───────────── FORMULAS (CLI) ─────────────
brew "aom"
brew "bat"
brew "btop"
brew "ca-certificates"
brew "cairo"
brew "certifi"
brew "dav1d"
brew "deno"
brew "diffutils"
brew "exiftool"
brew "eza"
brew "fastfetch"
brew "fd"
brew "ffmpeg"
brew "fish"
brew "fontconfig"
brew "freetype"
brew "fribidi"
brew "fzf"
brew "gettext"
brew "giflib"
brew "glib"
brew "graphite2"
brew "harfbuzz"
brew "htop"
brew "icu4c@78"
brew "img2pdf"
brew "jpeg-turbo"
brew "jq"
brew "json-c"
# ... další nainstalované balíky (viz `brew list --formula`)
# ───────────── CASKS (GUI) ─────────────
cask "alt-tab"
cask "balenaetcher"
cask "bartender"
cask "bitwarden"
cask "copilot-cli"
cask "daisydisk"
cask "discord"
cask "dockdoor"
cask "font-meslo-lg-nerd-font"
cask "google-chrome"
cask "google-drive"
cask "keepassxc"
cask "keepingyouawake"
cask "keka"
cask "microsoft-teams"
cask "nextcloud"
cask "nextcloud-talk"
cask "notion"
cask "nvidia-geforce-now"
cask "obs"
cask "obsidian"
cask "omnidisksweeper"
cask "qbittorrent"
cask "rustdesk"
cask "spotify"
cask "transmission"
cask "visual-studio-code"
cask "vlc"
cask "whatsapp"
cask "whichspace"
# ... další (viz `brew list --cask`)
# ───────────── FONTS ─────────────
cask "font-meslo-lg-nerd-font"
-85
View File
@@ -1,85 +0,0 @@
# 🍎 macOS Setup
> Automatizovaná instalace a konfigurace macOS workstation.
## 📦 Obsah
| Soubor | Účel |
|---|---|
| [`Brewfile`](Brewfile) | Všechny nainstalované CLI/GUI aplikace (Homebrew Bundle) |
| [`install-brew.sh`](install-brew.sh) | Instaluje Homebrew (pokud chybí) |
| [`configure-fish.sh`](configure-fish.sh) | Nastaví Fish shell s aliasy |
| [`osx-defaults.sh`](osx-defaults.sh) | macOS výchozí nastavení (Finder, Dock, klávesnice) |
| [`README.md`](README.md) | Tento soubor |
## 🚀 Quickstart (nový Mac)
```bash
# 1. Instalace Homebrew (pokud chybí)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 2. Instalace všech aplikací
brew bundle --file=Brewfile
# 3. macOS výchozí nastavení (Finder, Dock, ...)
bash osx-defaults.sh
# 4. Fish shell s aliasy
bash configure-fish.sh
```
## 🔧 Fish aliasy
`configure-fish.sh` nastaví tyto aliasy (viz skript):
| Alias | Příkaz |
|---|---|
| `update` | `brew update && brew upgrade` |
| `ll` | `eza -la` |
| `cat` | `bat` |
| `find` | `fd` |
| `top` | `btop` |
| `g` | `git` |
| `k` | `kubectl` |
| `d` | `docker` |
| `dc` | `docker compose` |
## ⚙️ macOS Defaults
`osx-defaults.sh` nastaví:
- **Finder:** zobrazit skryté soubory, všechny přípony, cestu k aktuálnímu adresáři
- **Dock:** auto-hide, rychlejší animace
- **Keyboard:** rychlejší opakování kláves
- **Trackpad:** rychlejší tracking
- **Safari:** vývojářské nástroje
## 🔐 Bezpečnost
- **FileVault** povolit (v System Settings → Privacy & Security)
- **Firewall** povolit (v System Settings → Network → Firewall)
- **XProtect** default zapnutý
- **Gatekeeper** default `App Store a identified developers`
## 📚 Apple ekosystém
- **iCloud** dokumenty, plocha, fotografie
- **Handoff** pokračovat na iOS/iPadOS
- **Universal Clipboard**
- **Sidecar** iPad jako druhá obrazovka
## 🔄 Aktualizace
```bash
# Homebrew
brew update && brew upgrade && brew cleanup
# macOS
System Settings → Software Update
```
## 📚 Dokumentace
- [Homebrew](https://brew.sh/)
- [Brewfile](https://github.com/Homebrew/homebrew-bundle)
- [macOS defaults](https://macos-defaults.com/)
-65
View File
@@ -1,65 +0,0 @@
#!/usr/bin/env bash
#
# Nastaví Fish shell s užitečnými aliasy
# - uloží konfiguraci do ~/.config/fish/config.fish
# - pokud Fish neexistuje, nainstaluje ho
# - idempotentní (přidá/aktualizuje aliasy, nesmaže existující)
#
# Vyžaduje fish 3.0+ a Homebrew
#
set -euo pipefail
FISH_CONFIG="$HOME/.config/fish/config.fish"
# Pokud fish není nainstalovaný, nainstaluj
if ! command -v fish &>/dev/null; then
echo "▶ Instaluji fish..."
if command -v brew &>/dev/null; then
brew install fish
else
echo "✗ Homebrew není nainstalován. Nainstaluj ho ručně: https://brew.sh/" >&2
exit 1
fi
fi
# Vytvoř adresář
mkdir -p "$(dirname "$FISH_CONFIG")"
# Definice aliasů
declare -A ALIASES=(
["update"]="brew update && brew upgrade && brew cleanup"
["ll"]="eza -la --git --time-style=long-iso"
["ls"]="eza"
["cat"]="bat --paging=never"
["find"]="fd"
["grep"]="rg"
["top"]="btop"
["ps"]="procs"
["g"]="git"
["d"]="docker"
["dc"]="docker compose"
["k"]="kubectl"
["llog"]="docker compose logs -f --tail=100"
["dip"]="docker compose logs -f --tail=100 \\\\"
["myip"]="curl -s https://api.ipify.org && echo"
["weather"]="curl -s 'wttr.in?format=3'"
)
# Funkce pro generování
{
echo "# ~/.config/fish/config.fish"
echo "# Generováno configure-fish.sh $(date +%Y-%m-%d)"
echo ""
echo "set -g fish_greeting \"\""
echo "set -gx PATH /opt/homebrew/bin \$PATH"
echo "set -gx EDITOR vim"
echo ""
for alias in "${!ALIASES[@]}"; do
echo "alias $alias='${ALIASES[$alias]}'"
done
} > "$FISH_CONFIG"
echo "✓ Konfigurace Fish v $FISH_CONFIG"
echo
echo "Použití: spusť 'fish' v terminálu"
echo "Ověření: alias ll → ${ALIASES[ll]}"
-83
View File
@@ -1,83 +0,0 @@
#!/usr/bin/env bash
#
# macOS výchozí nastavení (defaults write)
# Spustit JEDNOU po čisté instalaci macOS
#
# Vyžaduje: macOS (testováno na 13+)
#
set -euo pipefail
if [[ "$(uname)" != "Darwin" ]]; then
echo "Tento skript je pouze pro macOS" >&2
exit 1
fi
echo "▶ Nastavuji macOS defaults..."
# ──── Finder ────
# Zobrazit skryté soubory
defaults write com.apple.finder AppleShowAllFiles -bool true
# Zobrazit všechny přípony
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
# Zobrazit cestovní panel
defaults write com.apple.finder ShowPathbar -bool true
# Zobrazit stavový řádek
defaults write com.apple.finder ShowStatusBar -bool true
# Výchozí pohled: seznam
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
# Vyhledávání v aktuálním adresáři (default od Mojave)
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
# Rozšíření "Uložit dialog" o textové lišty
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true
# Default nový Finder okno: domovský adresář
defaults write com.apple.finder NewWindowTarget -string "PfHm"
# ──── Dock ────
# Auto-hide
defaults write com.apple.dock autohide -bool true
# Rychlejší animace
defaults write com.apple.dock autohide-time-modifier -float 0.3
defaults write com.apple.dock expose-animation-duration -float 0.2
# Zobrazit indikátory otevřených aplikací
defaults write com.apple.dock show-process-indicators -bool true
# Velikost ikon
defaults write com.apple.dock tilesize -int 48
# Skrýt nedávné aplikace
defaults write com.apple.dock show-recents -bool false
# ──── Klávesnice ────
# Rychlejší opakování kláves
defaults write NSGlobalDomain KeyRepeat -int 2
defaults write NSGlobalDomain InitialKeyRepeat -int 15
# Plná klávesnice pro přístup
defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
# Funkční klávesy jako F1-F12
defaults write NSGlobalDomain "com.apple.keyboard.fnState" -bool true
# ──── Trackpad ────
# Tap-to-click
defaults write com.apple.AppleMultitouchTrackpad Clicking -bool true
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
# Rychlejší tracking
defaults write NSGlobalDomain com.apple.trackpad.scaling -float 1.5
# ──── Safari ────
# Zobrazit vývojářské nástroje
defaults write com.apple.Safari IncludeDevelopMenu -bool true
defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true
# Privacy: omezit cross-site tracking
defaults write com.apple.Safari WebKitStorageBlockingPolicy -int 1
# ──── TextEdit ────
# Plain text mode
defaults write com.apple.TextEdit RichText -int 0
# ──── Terminal ────
# UTF-8
defaults write com.apple.terminal StringEncodings -array 4
echo "✓ macOS defaults nastaveny"
echo
echo "Pro aplikaci změn: odhlas se a prihlas se, nebo restartuj Finder/Dock:"
echo " killall Finder Dock"