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