refactor: split into 6 specialized repos
- docker-services, ansible, install-scripts -> own repos - macos-setup merged with hermes-install - home-nas-tools (metadata only, no binaries) - docs (architecture, security, contributing) - this repo: index + LICENSE + .gitignore only
This commit is contained in:
@@ -1 +0,0 @@
|
|||||||
2026-08-01 16:32:27
|
|
||||||
@@ -1,83 +1,93 @@
|
|||||||
# 🔧 mates — Home Infrastructure
|
# 🏠 mates-infra – Home Infrastructure
|
||||||
|
|
||||||
> Sbírka šablon, skriptů a Ansible playbooků pro rychlé nasazení self-hostované infrastruktury.
|
> Hlavní index pro **home infrastructure as code** projekty.
|
||||||
> Veškerý obsah vychází z reálného běhu na serveru `192.168.0.148` (Ubuntu 24.04, Docker 29.x).
|
> Obsah je **rozdělen do 6 specializovaných repozitářů** pro snadnou orientaci a
|
||||||
|
> samostatné použití. Toto repo slouží jako **orchestrátor + dokumentace**.
|
||||||
**[](http://192.168.0.148:3000)** · **[](http://192.168.0.148:1122)** · **[](LICENSE)**
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🗂 Co je v tomto repo
|
## 📦 Repozitáře (6)
|
||||||
|
|
||||||
| Adresář | Účel | Stav |
|
| Repo | Obsah | URL |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| [`docker-services/`](docker-services/) | Generické `docker-compose.yml` pro 14+ služeb (portainer, vaultwarden, nextcloud, …) | ✅ |
|
| [`mates-docker-services`](https://github.com/mates/mates-docker-services) | 14 generických `docker-compose.yml` (portainer, npm, vaultwarden, gitea, jotty, nextcloud, …) | http://192.168.0.148:3000/mates/mates-docker-services |
|
||||||
| [`install-scripts/`](install-scripts/) | Bash skripty pro nové servery (Ubuntu 22.04/24.04 LTS) | ✅ |
|
| [`mates-ansible`](https://github.com/mates/mates-ansible) | 4 Ansible playbooky (bootstrap, deploy, update, security) | http://192.168.0.148:3000/mates/mates-ansible |
|
||||||
| [`ansible/`](ansible/) | Ansible playbooks + role pro idempotentní deploy | ✅ |
|
| [`mates-install-scripts`](https://github.com/mates/mates-install-scripts) | Bash skripty pro nový Ubuntu server (bootstrap, docker, portainer, npm, backup, restore) | http://192.168.0.148:3000/mates/mates-install-scripts |
|
||||||
| [`hermes-install/`](hermes-install/) | Instalace a konfigurace Hermes Agent (mě) na macOS | ✅ |
|
| [`mates-macos-setup`](https://github.com/mates/mates-macos-setup) | macOS workstation (Brewfile, Fish aliasy, osx defaults, Hermes CLI) | http://192.168.0.148:3000/mates/mates-macos-setup |
|
||||||
| [`macos-setup/`](macos-setup/) | Homebrew `Brewfile` + skripty pro macOS workstation | ✅ |
|
| [`mates-home-nas-tools`](https://github.com/mates/mates-home-nas-tools) | Rejstřík projektů na NAS (metadata only, žádné binárky) | http://192.168.0.148:3000/mates/mates-home-nas-tools |
|
||||||
| [`home-nas-tools/`](home-nas-tools/) | Rejstřík projektů a nástrojů z NAS (`/Volumes/Backups/Prace/`) | ✅ |
|
| [`mates-docs`](https://github.com/mates/mates-docs) | Architektura, bezpečnost, contributing | http://192.168.0.148:3000/mates/mates-docs |
|
||||||
| [`docs/`](docs/) | Architektura, bezpečnost, contributing | ✅ |
|
|
||||||
|
> **Proč 6 repo?** Každý má **jiný scope**, **jiný lifecycle**, **jiné uživatele**.
|
||||||
|
> Např. `mates-install-scripts` se mění zřídka, `mates-docker-services` často.
|
||||||
|
|
||||||
## 🏗 Aktuální infrastruktura
|
## 🏗 Aktuální infrastruktura
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────────────────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
│ Internet (Cloudflare Tunnel) │
|
│ Nginx Proxy Manager (reverzní proxy + HTTPS) │
|
||||||
└────────────────────┬────────────────────────────────────────────────┘
|
└────────────────────┬────────────────────────────────────────┘
|
||||||
│ HTTPS (443)
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ Nginx Proxy Manager (192.168.0.148:81, 443) │
|
|
||||||
│ ├─ DNS: domácí subdomény → LAN IP │
|
|
||||||
│ └─ Let's Encrypt auto-renew │
|
|
||||||
└────────────────────┬────────────────────────────────────────────────┘
|
|
||||||
│
|
│
|
||||||
┌─────────────────┼─────────────────┬──────────────┐
|
┌─────────────────┼─────────────────┬──────────────┐
|
||||||
▼ ▼ ▼ ▼
|
▼ ▼ ▼ ▼
|
||||||
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐
|
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
||||||
│ Nextcloud│ │Vaultwarden│ │ Gitea │ │ Jotty (doc)│
|
│ Nextcloud│ │Vaultwarden│ │ Gitea │ │ Jotty │
|
||||||
│ AIO │ │ :2999 │ │ :3000/222│ │ :1122 │
|
│ AIO │ │ :2999 │ │ :3000/222│ │ :1122 │
|
||||||
│ :11000 │ └──────────┘ └──────────┘ └────────────┘
|
└──────────┘ └──────────┘ └──────────┘ └──────────┘
|
||||||
└──────────┘
|
… dalších 11 služeb (Plex, RustDesk, Audiobookshelf, …)
|
||||||
… dalších 11 služeb (Plex, RustDesk, Calibre, Audiobookshelf, Wikijs, …)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Detailní seznam: [`docker-services/README.md`](docker-services/README.md)
|
Detailní seznam: [`mates-docker-services/README.md`](https://github.com/mates/mates-docker-services)
|
||||||
|
|
||||||
## 🚀 Rychlý start (nový server)
|
## 🚀 Rychlý start (nový server)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Klonuj tento repo
|
# 1. Klonuj všechna relevantní repo
|
||||||
git clone https://github.com/<user>/mates-infra.git ~/infra
|
git clone http://192.168.0.148:3000/mates/mates-install-scripts.git
|
||||||
cd ~/infra
|
git clone http://192.168.0.148:3000/mates/mates-docker-services.git
|
||||||
|
|
||||||
# 2. Spusť bootstrap (Ubuntu 22.04/24.04 LTS)
|
# 2. Bootstrap
|
||||||
sudo bash install-scripts/bootstrap-ubuntu-server.sh
|
cd mates-install-scripts
|
||||||
|
sudo bash bootstrap-ubuntu-server.sh
|
||||||
|
sudo bash install-docker.sh
|
||||||
|
|
||||||
# 3. Nainstaluj všechny služby
|
# 3. Nasaď služby
|
||||||
sudo bash install-scripts/install-docker.sh
|
cd ../mates-docker-services
|
||||||
sudo bash install-scripts/install-portainer.sh
|
cp portainer/.env.example portainer/.env # a další služby
|
||||||
# … další viz install-scripts/
|
docker compose -f portainer/docker-compose.yml up -d
|
||||||
|
# ... atd.
|
||||||
|
|
||||||
# 4. Nebo použij Ansible
|
# 4. (Volitelně) Ansible
|
||||||
cd ansible
|
git clone http://192.168.0.148:3000/mates/mates-ansible.git
|
||||||
|
cd mates-ansible
|
||||||
ansible-playbook -i inventory.example.yml playbooks/deploy-services.yml
|
ansible-playbook -i inventory.example.yml playbooks/deploy-services.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📚 Dokumentace
|
## 📚 Dokumentace
|
||||||
|
|
||||||
- 🏛 [Architektura](docs/architecture.md) – jak to celé funguje
|
- 🏛 [Architektura](https://github.com/mates/mates-docs) – jak to celé funguje
|
||||||
- 🔐 [Bezpečnost](docs/security.md) – hardening, secrets, HTTPS
|
- 🔐 [Bezpečnost](https://github.com/mates/mates-docs) – hardening, secrets
|
||||||
- 🤝 [Contributing](docs/contributing.md) – jak přispívat
|
- 🤝 [Contributing](https://github.com/mates/mates-docs) – jak přispívat
|
||||||
- 📝 [Jotty dokumentace](http://192.168.0.148:1122) – knowledge base v Jotty
|
- 📝 [Jotty knowledge base](http://192.168.0.148:1122) – interní dokumentace
|
||||||
|
|
||||||
|
## 🗂 Mapa závislostí
|
||||||
|
|
||||||
|
```
|
||||||
|
mates-infra (toto repo – index)
|
||||||
|
├──→ mates-docs (architektura, bezpečnost)
|
||||||
|
├──→ mates-docker-services (služby)
|
||||||
|
├──→ mates-install-scripts (nový server)
|
||||||
|
├──→ mates-ansible (idempotentní deploy)
|
||||||
|
├──→ mates-macos-setup (workstation)
|
||||||
|
└──→ mates-home-nas-tools (metadata k NAS)
|
||||||
|
```
|
||||||
|
|
||||||
## 🔒 Bezpečnost
|
## 🔒 Bezpečnost
|
||||||
|
|
||||||
- **Všechna hesla v `.env.example`** – nikdy necommituj `.env`
|
- Všechna hesla v `.env.example` (šablona), nikdy v `docker-compose.yml`
|
||||||
- **HTTPS** – Let's Encrypt přes NPM
|
- API token Gitea uložen v **macOS keychainu** (`gitea:api:192.168.0.148`)
|
||||||
- **Firewall** – UFW + fail2ban
|
- SSH klíče pro git push přes `credential.helper`
|
||||||
- **Bezpečnostní audit**: viz [`docs/security.md`](docs/security.md)
|
- HTTPS terminuje Nginx Proxy Manager (Let's Encrypt)
|
||||||
|
- Detailní security hardening: [`mates-docs/security.md`](https://github.com/mates/mates-docs)
|
||||||
|
|
||||||
## 📜 Licence
|
## 📜 Licence
|
||||||
|
|
||||||
@@ -85,4 +95,4 @@ ansible-playbook -i inventory.example.yml playbooks/deploy-services.yml
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Vyrobeno s ❤️ v homelabu · 2026**
|
**Home lab · 2026 · Poslední update:** 2026-08-01
|
||||||
|
|||||||
@@ -1,88 +0,0 @@
|
|||||||
# 🎭 Ansible Playbooks
|
|
||||||
|
|
||||||
> Ansible role a playbooks pro nasazení a správu home infrastruktury.
|
|
||||||
> Idempotentní, testovatelné, čitelné.
|
|
||||||
|
|
||||||
## 📁 Struktura
|
|
||||||
|
|
||||||
```
|
|
||||||
ansible/
|
|
||||||
├── README.md # Tento soubor
|
|
||||||
├── ansible.cfg # Konfigurace
|
|
||||||
├── requirements.yml # Ansible Galaxy role
|
|
||||||
├── inventory.example.yml # Ukázkový inventory
|
|
||||||
├── playbooks/
|
|
||||||
│ ├── bootstrap-server.yml # Úvodní setup nového serveru
|
|
||||||
│ ├── deploy-services.yml # Nasaď všechny Docker služby
|
|
||||||
│ ├── update-services.yml # Update všech služeb
|
|
||||||
│ └── security-hardening.yml # Bezpečnostní hardening
|
|
||||||
├── roles/
|
|
||||||
│ ├── common/ # Společné úkoly (update, packages, users)
|
|
||||||
│ ├── docker/ # Docker + compose
|
|
||||||
│ ├── portainer/ # Portainer compose
|
|
||||||
│ ├── nginx-proxy/ # Nginx Proxy Manager
|
|
||||||
│ ├── vaultwarden/ # Vaultwarden
|
|
||||||
│ ├── gitea/ # Gitea
|
|
||||||
│ └── ...
|
|
||||||
└── group_vars/
|
|
||||||
└── all.yml.example # Společné proměnné
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🚀 Quickstart
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Příprava
|
|
||||||
pip install ansible
|
|
||||||
ansible-galaxy install -r requirements.yml
|
|
||||||
|
|
||||||
# 2. Inventory
|
|
||||||
cp inventory.example.yml inventory.yml
|
|
||||||
nano inventory.yml # nastavit IP a SSH user
|
|
||||||
|
|
||||||
# 3. Test připojení
|
|
||||||
ansible all -m ping
|
|
||||||
|
|
||||||
# 4. Bootstrap
|
|
||||||
ansible-playbook -i inventory.yml playbooks/bootstrap-server.yml
|
|
||||||
|
|
||||||
# 5. Nasaď služby
|
|
||||||
ansible-playbook -i inventory.yml playbooks/deploy-services.yml --extra-vars "services=[portainer,vaultwarden,gitea]"
|
|
||||||
|
|
||||||
# 6. Update
|
|
||||||
ansible-playbook -i inventory.yml playbooks/update-services.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🎯 Playbooky
|
|
||||||
|
|
||||||
### `bootstrap-server.yml`
|
|
||||||
- Update OS
|
|
||||||
- Setup deploy user (UID 1000)
|
|
||||||
- SSH hardening
|
|
||||||
- UFW firewall
|
|
||||||
- fail2ban
|
|
||||||
- Základní utility
|
|
||||||
|
|
||||||
### `deploy-services.yml`
|
|
||||||
- Nasaď vybrané Docker služby
|
|
||||||
- Idempotentní – můžeš spustit víckrát
|
|
||||||
|
|
||||||
### `update-services.yml`
|
|
||||||
- `docker compose pull && up -d` pro všechny služby
|
|
||||||
- Watchtower notifikace
|
|
||||||
|
|
||||||
### `security-hardening.yml`
|
|
||||||
- Sysctl hardening
|
|
||||||
- AppArmor profily
|
|
||||||
- Auditd pravidla
|
|
||||||
- Automatické security updaty
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Bez hesel v inventory** – použij `ansible-vault` nebo SSH klíče
|
|
||||||
- **Privilege escalation** – `become: true` jen kde potřeba
|
|
||||||
- **Idempotence** – každý task kontroluje stav
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Ansible docs](https://docs.ansible.com/)
|
|
||||||
- [Best practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
[defaults]
|
|
||||||
inventory = inventory.yml
|
|
||||||
roles_path = roles
|
|
||||||
host_key_checking = False
|
|
||||||
retry_files_enabled = False
|
|
||||||
stdout_callback = yaml
|
|
||||||
forks = 10
|
|
||||||
gathering = smart
|
|
||||||
fact_caching = jsonfile
|
|
||||||
fact_caching_connection = local
|
|
||||||
fact_caching_timeout = 86400
|
|
||||||
|
|
||||||
[privilege_escalation]
|
|
||||||
become = True
|
|
||||||
become_method = sudo
|
|
||||||
become_ask_pass = False
|
|
||||||
|
|
||||||
[ssh_connection]
|
|
||||||
pipelining = True
|
|
||||||
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ServerAliveInterval=30
|
|
||||||
control_path = /tmp/ansible-ssh-%%h-%%p-%%r
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
---
|
|
||||||
# Společné proměnné pro všechny playbooks
|
|
||||||
# Zkopíruj na group_vars/all.yml a doplň
|
|
||||||
|
|
||||||
# Docker
|
|
||||||
docker_user: deploy
|
|
||||||
docker_uid: 1000
|
|
||||||
docker_gid: 1000
|
|
||||||
docker_install_compose_plugin: true
|
|
||||||
|
|
||||||
# Služby k nasazení (seznam názvů adresářů v docker-services/)
|
|
||||||
services_to_deploy:
|
|
||||||
- portainer
|
|
||||||
- nginx-proxy-manager
|
|
||||||
- vaultwarden
|
|
||||||
- gitea
|
|
||||||
- jotty
|
|
||||||
- nextcloud-aio
|
|
||||||
- rustdesk
|
|
||||||
- audiobookshelf
|
|
||||||
- calibre-web
|
|
||||||
- plex
|
|
||||||
- erugo
|
|
||||||
- jswiki
|
|
||||||
- speedtest
|
|
||||||
- watchtower
|
|
||||||
|
|
||||||
# NPM admin (po prvním loginu změnit)
|
|
||||||
npm_default_email: admin@example.com
|
|
||||||
npm_default_password: changeme
|
|
||||||
|
|
||||||
# Gitea admin (po instalaci)
|
|
||||||
gitea_admin_user: admin
|
|
||||||
gitea_admin_password: changeme
|
|
||||||
gitea_admin_email: admin@example.com
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
# Ukázkový inventory – zkopíruj na inventory.yml a uprav
|
|
||||||
all:
|
|
||||||
vars:
|
|
||||||
# SSH uživatel (deploy user, UID 1000)
|
|
||||||
ansible_user: deploy
|
|
||||||
# Python na cílovém systému
|
|
||||||
ansible_python_interpreter: /usr/bin/python3
|
|
||||||
# Timezone
|
|
||||||
timezone: Europe/Prague
|
|
||||||
|
|
||||||
children:
|
|
||||||
# Skupina pro všechny home servery
|
|
||||||
homeservers:
|
|
||||||
hosts:
|
|
||||||
homeserver-01:
|
|
||||||
ansible_host: 192.168.0.148
|
|
||||||
# homeserver-02:
|
|
||||||
# ansible_host: 192.168.0.149
|
|
||||||
|
|
||||||
# Skupina pro produkční servery
|
|
||||||
production:
|
|
||||||
hosts:
|
|
||||||
homeserver-01:
|
|
||||||
ansible_host: 192.168.0.148
|
|
||||||
|
|
||||||
# Skupina pro test
|
|
||||||
staging: []
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
---
|
|
||||||
# Bootstrap nového Ubuntu serveru
|
|
||||||
# - aktualizace systému
|
|
||||||
# - deploy user (UID 1000)
|
|
||||||
# - SSH hardening
|
|
||||||
# - UFW firewall
|
|
||||||
# - fail2ban
|
|
||||||
# - Docker
|
|
||||||
#
|
|
||||||
# Použití:
|
|
||||||
# ansible-playbook -i inventory.yml playbooks/bootstrap-server.yml
|
|
||||||
#
|
|
||||||
- name: Bootstrap home server
|
|
||||||
hosts: homeservers
|
|
||||||
become: true
|
|
||||||
gather_facts: true
|
|
||||||
|
|
||||||
vars:
|
|
||||||
deploy_user: deploy
|
|
||||||
deploy_uid: 1000
|
|
||||||
ssh_port: 22
|
|
||||||
deploy_ssh_key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Update apt cache
|
|
||||||
ansible.builtin.apt:
|
|
||||||
update_cache: true
|
|
||||||
cache_valid_time: 3600
|
|
||||||
|
|
||||||
- name: Upgrade all packages
|
|
||||||
ansible.builtin.apt:
|
|
||||||
upgrade: dist
|
|
||||||
update_cache: true
|
|
||||||
|
|
||||||
- name: Install base packages
|
|
||||||
ansible.builtin.apt:
|
|
||||||
name:
|
|
||||||
- curl
|
|
||||||
- wget
|
|
||||||
- git
|
|
||||||
- vim
|
|
||||||
- htop
|
|
||||||
- ca-certificates
|
|
||||||
- gnupg
|
|
||||||
- ufw
|
|
||||||
- fail2ban
|
|
||||||
- bash-completion
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Set timezone
|
|
||||||
community.general.timezone:
|
|
||||||
name: "{{ timezone }}"
|
|
||||||
|
|
||||||
- name: Create deploy user
|
|
||||||
ansible.builtin.user:
|
|
||||||
name: "{{ deploy_user }}"
|
|
||||||
uid: "{{ deploy_uid }}"
|
|
||||||
shell: /bin/bash
|
|
||||||
create_home: true
|
|
||||||
password: ""
|
|
||||||
|
|
||||||
- name: Setup authorized_keys for deploy user
|
|
||||||
ansible.posix.authorized_key:
|
|
||||||
user: "{{ deploy_user }}"
|
|
||||||
state: present
|
|
||||||
key: "{{ deploy_ssh_key }}"
|
|
||||||
|
|
||||||
- name: Allow deploy user sudo without password
|
|
||||||
ansible.builtin.copy:
|
|
||||||
dest: "/etc/sudoers.d/{{ deploy_user }}"
|
|
||||||
content: "{{ deploy_user }} ALL=(ALL) NOPASSWD:ALL\n"
|
|
||||||
mode: "0440"
|
|
||||||
|
|
||||||
- name: SSH hardening
|
|
||||||
ansible.builtin.lineinfile:
|
|
||||||
path: /etc/ssh/sshd_config
|
|
||||||
regexp: "^#?{{ item.key }}"
|
|
||||||
line: "{{ item.key }} {{ item.value }}"
|
|
||||||
state: present
|
|
||||||
loop:
|
|
||||||
- { key: "Port", value: "{{ ssh_port }}" }
|
|
||||||
- { key: "PermitRootLogin", value: "no" }
|
|
||||||
- { key: "PasswordAuthentication", value: "no" }
|
|
||||||
- { key: "X11Forwarding", value: "no" }
|
|
||||||
- { key: "ClientAliveInterval", value: "300" }
|
|
||||||
- { key: "ClientAliveCountMax", value: "2" }
|
|
||||||
notify: Restart ssh
|
|
||||||
|
|
||||||
- name: Configure UFW defaults
|
|
||||||
community.general.ufw:
|
|
||||||
direction: incoming
|
|
||||||
policy: deny
|
|
||||||
notify: Reload ufw
|
|
||||||
|
|
||||||
- name: Allow SSH through UFW
|
|
||||||
community.general.ufw:
|
|
||||||
rule: allow
|
|
||||||
port: "{{ ssh_port }}"
|
|
||||||
proto: tcp
|
|
||||||
|
|
||||||
- name: Allow HTTP and HTTPS through UFW
|
|
||||||
community.general.ufw:
|
|
||||||
rule: allow
|
|
||||||
port: "{{ item }}"
|
|
||||||
proto: tcp
|
|
||||||
loop:
|
|
||||||
- "80"
|
|
||||||
- "443"
|
|
||||||
|
|
||||||
- name: Enable UFW
|
|
||||||
community.general.ufw:
|
|
||||||
state: enabled
|
|
||||||
|
|
||||||
- name: Configure fail2ban
|
|
||||||
ansible.builtin.copy:
|
|
||||||
dest: /etc/fail2ban/jail.local
|
|
||||||
content: |
|
|
||||||
[DEFAULT]
|
|
||||||
bantime = 1h
|
|
||||||
findtime = 10m
|
|
||||||
maxretry = 5
|
|
||||||
|
|
||||||
[sshd]
|
|
||||||
enabled = true
|
|
||||||
port = {{ ssh_port }}
|
|
||||||
filter = sshd
|
|
||||||
logpath = /var/log/auth.log
|
|
||||||
maxretry = 3
|
|
||||||
mode: "0644"
|
|
||||||
notify: Restart fail2ban
|
|
||||||
|
|
||||||
handlers:
|
|
||||||
- name: Restart ssh
|
|
||||||
ansible.builtin.service:
|
|
||||||
name: sshd
|
|
||||||
state: restarted
|
|
||||||
|
|
||||||
- name: Reload ufw
|
|
||||||
community.general.ufw:
|
|
||||||
state: reloaded
|
|
||||||
|
|
||||||
- name: Restart fail2ban
|
|
||||||
ansible.builtin.service:
|
|
||||||
name: fail2ban
|
|
||||||
state: restarted
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
# Nasaď Docker služby z docker-services/ adresáře
|
|
||||||
#
|
|
||||||
# Použití:
|
|
||||||
# ansible-playbook -i inventory.yml playbooks/deploy-services.yml
|
|
||||||
# ansible-playbook -i inventory.yml playbooks/deploy-services.yml --extra-vars "services=[portainer,vaultwarden]"
|
|
||||||
#
|
|
||||||
- name: Deploy Docker services
|
|
||||||
hosts: homeservers
|
|
||||||
become: true
|
|
||||||
gather_facts: true
|
|
||||||
|
|
||||||
vars:
|
|
||||||
services_repo: https://github.com/<user>/mates-infra.git
|
|
||||||
services_path: "/home/{{ docker_user }}/docker-services"
|
|
||||||
services: "{{ services_to_deploy | default(['portainer', 'vaultwarden', 'gitea']) }}"
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Clone services repo
|
|
||||||
ansible.builtin.git:
|
|
||||||
repo: "{{ services_repo }}"
|
|
||||||
dest: "{{ services_path }}"
|
|
||||||
force: false
|
|
||||||
update: true
|
|
||||||
become_user: "{{ docker_user }}"
|
|
||||||
|
|
||||||
- name: Create .env from example
|
|
||||||
ansible.builtin.copy:
|
|
||||||
src: "{{ services_path }}/{{ item }}/.env.example"
|
|
||||||
dest: "{{ services_path }}/{{ item }}/.env"
|
|
||||||
remote_src: true
|
|
||||||
force: false
|
|
||||||
loop: "{{ services }}"
|
|
||||||
become_user: "{{ docker_user }}"
|
|
||||||
|
|
||||||
- name: Deploy services
|
|
||||||
community.docker.docker_compose_v2:
|
|
||||||
project_src: "{{ services_path }}/{{ item }}"
|
|
||||||
state: present
|
|
||||||
pull: missing
|
|
||||||
loop: "{{ services }}"
|
|
||||||
become_user: "{{ docker_user }}"
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
---
|
|
||||||
# Security hardening – sysctl, AppArmor, auditd, auto-updates
|
|
||||||
#
|
|
||||||
# Použití:
|
|
||||||
# ansible-playbook -i inventory.yml playbooks/security-hardening.yml
|
|
||||||
#
|
|
||||||
- name: Security hardening
|
|
||||||
hosts: homeservers
|
|
||||||
become: true
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Kernel hardening via sysctl
|
|
||||||
ansible.posix.sysctl:
|
|
||||||
name: "{{ item.key }}"
|
|
||||||
value: "{{ item.value }}"
|
|
||||||
state: present
|
|
||||||
reload: true
|
|
||||||
loop:
|
|
||||||
- { key: "net.ipv4.conf.all.rp_filter", value: "1" }
|
|
||||||
- { key: "net.ipv4.conf.default.rp_filter", value: "1" }
|
|
||||||
- { key: "net.ipv4.icmp_echo_ignore_broadcasts", value: "1" }
|
|
||||||
- { key: "net.ipv4.conf.all.accept_redirects", value: "0" }
|
|
||||||
- { key: "net.ipv4.conf.default.accept_redirects", value: "0" }
|
|
||||||
- { key: "net.ipv6.conf.all.accept_redirects", value: "0" }
|
|
||||||
- { key: "net.ipv4.conf.all.send_redirects", value: "0" }
|
|
||||||
- { key: "net.ipv4.conf.all.accept_source_route", value: "0" }
|
|
||||||
- { key: "net.ipv4.conf.default.accept_source_route", value: "0" }
|
|
||||||
- { key: "net.ipv4.tcp_syncookies", value: "1" }
|
|
||||||
- { key: "net.ipv4.conf.all.log_martians", value: "1" }
|
|
||||||
|
|
||||||
- name: Install unattended-upgrades
|
|
||||||
ansible.builtin.apt:
|
|
||||||
name:
|
|
||||||
- unattended-upgrades
|
|
||||||
- apt-listchanges
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Enable automatic security updates
|
|
||||||
ansible.builtin.copy:
|
|
||||||
dest: /etc/apt/apt.conf.d/20auto-upgrades
|
|
||||||
content: |
|
|
||||||
APT::Periodic::Update-Package-Lists "1";
|
|
||||||
APT::Periodic::Unattended-Upgrade "1";
|
|
||||||
APT::Periodic::AutocleanInterval "7";
|
|
||||||
mode: "0644"
|
|
||||||
|
|
||||||
- name: Install auditd
|
|
||||||
ansible.builtin.apt:
|
|
||||||
name:
|
|
||||||
- auditd
|
|
||||||
- audispd-plugins
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Enable auditd
|
|
||||||
ansible.builtin.service:
|
|
||||||
name: auditd
|
|
||||||
state: started
|
|
||||||
enabled: true
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
# Update všech Docker služeb (docker compose pull + up -d)
|
|
||||||
#
|
|
||||||
# Použití:
|
|
||||||
# ansible-playbook -i inventory.yml playbooks/update-services.yml
|
|
||||||
#
|
|
||||||
- name: Update Docker services
|
|
||||||
hosts: homeservers
|
|
||||||
become: true
|
|
||||||
|
|
||||||
vars:
|
|
||||||
services_path: "/home/{{ docker_user }}/docker-services"
|
|
||||||
services: "{{ services_to_deploy | default([]) }}"
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- name: Pull and restart services
|
|
||||||
community.docker.docker_compose_v2:
|
|
||||||
project_src: "{{ services_path }}/{{ item }}"
|
|
||||||
state: present
|
|
||||||
pull: always
|
|
||||||
loop: "{{ services }}"
|
|
||||||
become_user: "{{ docker_user }}"
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
# 📦 Docker Services
|
|
||||||
|
|
||||||
> Generické `docker-compose.yml` šablony pro self-hosted služby.
|
|
||||||
> Každá služba má **vlastní složku**, `.env.example` (šablona) a **README** s dokumentací.
|
|
||||||
|
|
||||||
## 🎯 Jak použít
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Vyber službu
|
|
||||||
cd services/<service>
|
|
||||||
|
|
||||||
# 2. Vytvoř .env z šablony
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env # nastav POUZE potřebné hodnoty (hesla, cesty)
|
|
||||||
|
|
||||||
# 3. Nasaď
|
|
||||||
docker compose up -d
|
|
||||||
|
|
||||||
# 4. Ověř
|
|
||||||
docker compose ps
|
|
||||||
docker compose logs -f
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Rejstřík služeb
|
|
||||||
|
|
||||||
| Služba | Účel | Port | Image |
|
|
||||||
|---|---|---|---|
|
|
||||||
| [`portainer`](portainer/) | Docker UI management | `9000`, `9443` | `portainer/portainer-ce` |
|
|
||||||
| [`nginx-proxy-manager`](nginx-proxy-manager/) | Reverse proxy + HTTPS | `80`, `443`, `81` | `jc21/nginx-proxy-manager` |
|
|
||||||
| [`vaultwarden`](vaultwarden/) | Správce hesel | `2999` | `vaultwarden/server` |
|
|
||||||
| [`nextcloud-aio`](nextcloud-aio/) | Cloud (soubory, kalendář) | `11000` | `nextcloud/all-in-one` |
|
|
||||||
| [`gitea`](gitea/) | Git server | `3000`, `222` | `gitea/gitea` |
|
|
||||||
| [`jotty`](jotty/) | Poznámky & checklisty | `1122` | `mrx23dotcom/jotty` |
|
|
||||||
| [`rustdesk`](rustdesk/) | Remote desktop | `21115-21119` | `rustdesk/rustdesk-server` |
|
|
||||||
| [`audiobookshelf`](audiobookshelf/) | Audio knihovna | `13378` | `advplyr/audiobookshelf` |
|
|
||||||
| [`calibre-web`](calibre-web/) | E-knihovna | `8083` | `linuxserver/calibre-web` |
|
|
||||||
| [`plex`](plex/) | Media server | `32400` | `linuxserver/plex` |
|
|
||||||
| [`erugo`](erugo/) | File sharing | `61080` | `wardy784/erugo` |
|
|
||||||
| [`jswiki`](jswiki/) | Wiki | `9180` | `linuxserver/wikijs` |
|
|
||||||
| [`speedtest`](speedtest/) | Speedtest tracker | `8072` | `linuxserver/speedtest-tracker` |
|
|
||||||
| [`watchtower`](watchtower/) | Auto-update kontejnerů | – | `containrrr/watchtower` |
|
|
||||||
|
|
||||||
## 🧱 Společné konvence
|
|
||||||
|
|
||||||
Všechny compose soubory v tomto adresáři dodržují:
|
|
||||||
|
|
||||||
- **Porty:** nikdy nepoužívat konfliktní porty s ostatními službami
|
|
||||||
- **Volume:** `./data:/data` (host container, snadná záloha)
|
|
||||||
- **Restart:** `unless-stopped`
|
|
||||||
- **Network:** výchozí `bridge`, případně vlastní `*-net`
|
|
||||||
- **User:** `1000:1000` pro souborový přístup
|
|
||||||
- **Logging:** `json-file` driver, max 10 MB × 3 soubory
|
|
||||||
- **TZ:** `Europe/Prague`
|
|
||||||
- **Environment:** `.env` soubor (šablona `.env.example` v gitu)
|
|
||||||
|
|
||||||
## 🛡 Bezpečnost
|
|
||||||
|
|
||||||
- ✅ **Žádná hesla v `docker-compose.yml`** – vše v `.env` (gitignored)
|
|
||||||
- ✅ **Restart policy** zamezí nechtěnému spuštění po rebootu
|
|
||||||
- ✅ **Networks** – izolované `bridge` pro každou službu
|
|
||||||
- ✅ **Read-only filesystémy** kde to jde (`/etc/timezone`, `/etc/localtime`)
|
|
||||||
|
|
||||||
## 🗂 Struktura
|
|
||||||
|
|
||||||
```
|
|
||||||
docker-services/
|
|
||||||
├── README.md # Tento soubor
|
|
||||||
├── portainer/
|
|
||||||
│ ├── docker-compose.yml
|
|
||||||
│ ├── .env.example
|
|
||||||
│ └── README.md
|
|
||||||
├── nginx-proxy-manager/
|
|
||||||
│ ├── docker-compose.yml
|
|
||||||
│ ├── .env.example
|
|
||||||
│ └── README.md
|
|
||||||
└── ... (další služby)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔄 Aktualizace služeb
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Pomocí Watchtower (auto-update)
|
|
||||||
docker compose pull && docker compose up -d
|
|
||||||
|
|
||||||
# Nebo ručně
|
|
||||||
cd services/<service>
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📦 Zálohování
|
|
||||||
|
|
||||||
Všechna data jsou v `./data/` uvnitř každé služby. Zálohuj celé adresáře:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Pomocí našeho nástroje z install-scripts/
|
|
||||||
sudo bash install-scripts/backup-all.sh
|
|
||||||
```
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# Audiobookshelf – proměnné
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
# Audiobookshelf – audio knihovna
|
|
||||||
|
|
||||||
> Self-hosted audio knihovna. Stream audioknih, podcastů. Sledování pokroku.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `advplyr/audiobookshelf:latest`
|
|
||||||
- **Port:** `13378` (web)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Web:** `http://<server>:13378`
|
|
||||||
- **Mobile app:** vyhledej "Audiobookshelf" v App Store/Google Play
|
|
||||||
|
|
||||||
## 🎯 Funkce
|
|
||||||
|
|
||||||
- **Audioknihy** – upload (mp3, m4b, m4a, flac, …)
|
|
||||||
- **Podcasty** – RSS subscribe
|
|
||||||
- **Progress tracking** – synchronizace mezi zařízeními
|
|
||||||
- **Multi-user** – každý má svou knihovnu
|
|
||||||
- **Transkripce** – vyhledávání v textu (s AI)
|
|
||||||
- **OPDS** – kompatibilní s jinými čtečkami
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/data` | Databáze, config, cache |
|
|
||||||
| `./audiobooks:/audiobooks` | Tvoje knihovna (readonly) |
|
|
||||||
| `./podcasts:/podcasts` | Auto-download podcasty |
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **2FA** – pro admin účet
|
|
||||||
- **HTTPS** – terminuj v NPM
|
|
||||||
- **Auth proxy** – integrovaný (OIDC)
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Audiobookshelf](https://www.audiobookshelf.org/)
|
|
||||||
- [GitHub](https://github.com/advplyr/audiobookshelf)
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Audiobookshelf – audio knihovna
|
|
||||||
|
|
||||||
services:
|
|
||||||
audiobookshelf:
|
|
||||||
image: advplyr/audiobookshelf:latest
|
|
||||||
container_name: audiobookshelf
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "13378:80"
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
- ./audiobooks:/audiobooks
|
|
||||||
- ./podcasts:/podcasts
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
networks:
|
|
||||||
- audiobookshelf_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
audiobookshelf_net:
|
|
||||||
name: audiobookshelf_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# Calibre-Web – proměnné
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Calibre-Web – e-knihovna
|
|
||||||
|
|
||||||
> Web čtečka e-knihoven. Calibre metadata, OPDS, Kindle send.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `linuxserver/calibre-web:latest`
|
|
||||||
- **Port:** `8083` (web)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
Pak v prohlížeči otevři `http://<server>:8083` a dokonči setup (admin účet, cesta ke knihovně).
|
|
||||||
|
|
||||||
## 🎯 Funkce
|
|
||||||
|
|
||||||
- **Čtení online** – v prohlížeči, EPUB/PDF
|
|
||||||
- **Send to Kindle** – email na Kindle
|
|
||||||
- **OPDS** – kompatibilní s jinými čtečkami
|
|
||||||
- **Multi-user** – s admin/user oprávněními
|
|
||||||
- **Metadata** – z Goodreads, Google Books
|
|
||||||
- **Tagy, série, autoři** – plná Calibre metadata
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/config` | Calibre-Web konfigurace, DB |
|
|
||||||
| `./books:/books` | Tvoje knihovna (knihy) |
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Admin heslo** – silné
|
|
||||||
- **HTTPS** – terminuj v NPM
|
|
||||||
- **Magic link** – email login (vyžaduje SMTP)
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Calibre-Web GitHub](https://github.com/janeczku/calibre-web)
|
|
||||||
- [LinuxServer.io](https://docs.linuxserver.io/images/docker-calibre-web)
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# Calibre-Web – e-knihovna
|
|
||||||
|
|
||||||
services:
|
|
||||||
calibre-web:
|
|
||||||
image: lscr.io/linuxserver/calibre-web:latest
|
|
||||||
container_name: calibre-web
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "8083:8083"
|
|
||||||
volumes:
|
|
||||||
- ./data:/config
|
|
||||||
- ./books:/books
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- DOCKER_MODS=linuxserver/mods:universal-calibre
|
|
||||||
- OAUTHLIB_RELAX_TOKEN_SCOPE=1
|
|
||||||
networks:
|
|
||||||
- calibre-web_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
calibre-web_net:
|
|
||||||
name: calibre-web_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# Erugo – proměnné
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# Erugo – file sharing
|
|
||||||
|
|
||||||
> Jednoduché sdílení souborů s heslem a expirací.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `wardy784/erugo:latest`
|
|
||||||
- **Port:** `61080` (web)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Web:** `http://<server>:61080`
|
|
||||||
|
|
||||||
## 🎯 Funkce
|
|
||||||
|
|
||||||
- **Upload** – drag & drop souborů
|
|
||||||
- **Heslo** – volitelné pro každý upload
|
|
||||||
- **Expirace** – automatické mazání po X dnech
|
|
||||||
- **Linky** – sdílitelné
|
|
||||||
- **API** – pro integraci
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/uploads` | Uložené soubory |
|
|
||||||
| `./db:/db` | SQLite databáze |
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# Erugo – file sharing
|
|
||||||
|
|
||||||
services:
|
|
||||||
erugo:
|
|
||||||
image: wardy784/erugo:latest
|
|
||||||
container_name: erugo
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "61080:80"
|
|
||||||
volumes:
|
|
||||||
- ./data:/uploads
|
|
||||||
- ./db:/db
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
networks:
|
|
||||||
- erugo_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
erugo_net:
|
|
||||||
name: erugo_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# Gitea – proměnné prostředí
|
|
||||||
USER_UID=1000
|
|
||||||
USER_GID=1000
|
|
||||||
TZ=Europe/Prague
|
|
||||||
|
|
||||||
# Po prvním adminovi nastav na false
|
|
||||||
GITEA__service__DISABLE_REGISTRATION=false
|
|
||||||
GITEA__service__REQUIRE_SIGNIN_VIEW=false
|
|
||||||
|
|
||||||
# HTTPS terminuje NPM, takže false
|
|
||||||
GITEA__session__COOKIE_SECURE=false
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# Gitea – self-hosted Git
|
|
||||||
|
|
||||||
> Lehký Git server (alternativa k GitLabu). Web UI, API, SSH.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `docker.gitea.com/gitea:1.27.1`
|
|
||||||
- **Porty:** `3000` (web), `222` (SSH)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
Po startu otevři `http://<server>:3000/` a dokonči install wizard:
|
|
||||||
|
|
||||||
1. **Database:** SQLite3 (default)
|
|
||||||
2. **Site Title:** libovolný
|
|
||||||
3. **Admin Username:** `admin` (nebo `mates`)
|
|
||||||
4. **Admin Password:** silné heslo
|
|
||||||
5. **Admin Email:** tvůj email
|
|
||||||
6. Ostatní default
|
|
||||||
7. **Install Gitea**
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Web:** `http://<server>:3000` (za HTTPS terminuj v NPM)
|
|
||||||
- **SSH git push:** `ssh://git@<server>:222/<user>/<repo>.git`
|
|
||||||
- **API:** `http://<server>:3000/api/v1/`
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Změň admin heslo** hned po instalaci
|
|
||||||
- **DISABLE_REGISTRATION=false** – po registraci prvního admina vypni
|
|
||||||
- **HTTPS** – terminuj v NPM a přesměruj HTTP→HTTPS
|
|
||||||
- **2FA** – aktivuj pro admin účet
|
|
||||||
|
|
||||||
## 🔑 API Token
|
|
||||||
|
|
||||||
Vytvoření tokenu pro skripty:
|
|
||||||
|
|
||||||
1. User Settings → Applications
|
|
||||||
2. Název: `<script-name>`
|
|
||||||
3. Scopes: `read:user`, `write:user`, `read:repository`, `write:repository`
|
|
||||||
4. **Token ulož do keychainu**, ne do chatu
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
# DB migrace probíhá automaticky
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./gitea:/data` | Repozitáře, DB, konfigurace, hooks |
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Gitea Docker install](https://docs.gitea.com/installation/install-with-docker/)
|
|
||||||
- [Gitea API](https://docs.gitea.com/api/)
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
# Gitea – self-hosted Git server
|
|
||||||
|
|
||||||
services:
|
|
||||||
server:
|
|
||||||
image: docker.gitea.com/gitea:1.27.1
|
|
||||||
container_name: gitea
|
|
||||||
environment:
|
|
||||||
- USER_UID=1000
|
|
||||||
- USER_GID=1000
|
|
||||||
- GITEA__webhook__SKIP_TLS_VERIFY=false
|
|
||||||
- GITEA__service__DISABLE_REGISTRATION=false
|
|
||||||
- GITEA__service__REQUIRE_SIGNIN_VIEW=false
|
|
||||||
- GITEA__session__COOKIE_SECURE=false
|
|
||||||
restart: unless-stopped
|
|
||||||
networks:
|
|
||||||
- gitea_net
|
|
||||||
volumes:
|
|
||||||
- ./gitea:/data
|
|
||||||
- /etc/timezone:/etc/timezone:ro
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
ports:
|
|
||||||
- "3000:3000"
|
|
||||||
- "222:22"
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
start_period: 30s
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
gitea_net:
|
|
||||||
name: gitea_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# Jotty – proměnné prostředí
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Jotty – poznámky a checklisty
|
|
||||||
|
|
||||||
> Self-hosted alternativa k Obsidian. Markdown poznámky, checklisty, kategorie.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `mrx23dotcom/jotty:latest`
|
|
||||||
- **Port:** `1122` (web)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Web:** `http://<server>:1122` (za HTTPS terminuj v NPM)
|
|
||||||
- **První registrace:** Setup wizard na hlavní stránce
|
|
||||||
|
|
||||||
## 🎯 Použití
|
|
||||||
|
|
||||||
- **Poznámky** – markdown, interní linky `@note-id`, tagy `#tag`
|
|
||||||
- **Checklisty** – task management
|
|
||||||
- **Kategorie** – organizace
|
|
||||||
- **TipTap editor** – WYSIWYG nebo markdown
|
|
||||||
- **API** – REST API s API klíčem pro integraci
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **API klíč** – generuj v Admin → API
|
|
||||||
- **2FA** – pro admin účet
|
|
||||||
- **HTTPS** – terminuj v NPM
|
|
||||||
- **Registry** – vypni po registraci
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
# Data zůstávají v ./data/notes/
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/app/data` | Poznámky, checklisty, databáze |
|
|
||||||
| `./config:/app/config` | Konfigurace, themes, custom emojis |
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Jotty GitHub](https://github.com/mrx23dotcom/jotty)
|
|
||||||
- [Jotty API](https://github.com/mrx23dotcom/jotty/blob/main/howto/API.md)
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# Jotty – poznámky a checklisty
|
|
||||||
|
|
||||||
services:
|
|
||||||
jotty:
|
|
||||||
image: mrx23dotcom/jotty:latest
|
|
||||||
container_name: jotty
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
restart: unless-stopped
|
|
||||||
networks:
|
|
||||||
- jotty_net
|
|
||||||
volumes:
|
|
||||||
- ./data:/app/data
|
|
||||||
- ./config:/app/config
|
|
||||||
- ./cache:/app/.next/cache
|
|
||||||
ports:
|
|
||||||
- "1122:3000"
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
start_period: 60s
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
jotty_net:
|
|
||||||
name: jotty_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# Wiki.js – proměnné
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
|
|
||||||
# MariaDB hesla (ZMĚŇ!)
|
|
||||||
MYSQL_ROOT_PASSWORD=change-me-strong
|
|
||||||
MYSQL_PASSWORD=change-me-strong
|
|
||||||
WIKIJS_DB_PASS=change-me-strong
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# Wiki.js – wiki
|
|
||||||
|
|
||||||
> Nejvýkonnější open-source wiki. Markdown, WYSIWYG, DB, fulltext.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `linuxserver/wikijs:latest`
|
|
||||||
- **Port:** `9180` (web)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **DB:** PostgreSQL/SQLite (zde SQLite pro jednoduchost)
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
Pak `http://<server>:9180` – setup wizard.
|
|
||||||
|
|
||||||
## 🎯 Funkce
|
|
||||||
|
|
||||||
- **Editor** – WYSIWYG (TinyMCE), Markdown, AsciiDoc
|
|
||||||
- **Verzování** – každá stránka má historii
|
|
||||||
- **Permissions** – skupiny, ACL
|
|
||||||
- **Search** – fulltext
|
|
||||||
- **Multi-language**
|
|
||||||
- **GraphQL API** – pro integrace
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/config` | Wiki.js data, DB, config |
|
|
||||||
| `./db:/db` | SQLite databáze |
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Local auth** – nebo LDAP/OAuth
|
|
||||||
- **HTTPS** – terminuj v NPM
|
|
||||||
- **Rate limiting** – default zapnutý
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Wiki.js](https://wiki.js.org/)
|
|
||||||
- [GitHub](https://github.com/requarks/wiki)
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
# Wiki.js
|
|
||||||
|
|
||||||
services:
|
|
||||||
db:
|
|
||||||
image: linuxserver/mariadb:latest
|
|
||||||
container_name: jswiki_db
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- ./db:/config
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- MYSQL_ROOT_PASSWORD=CHANGE_ME_STRONG
|
|
||||||
- MYSQL_DATABASE=wiki
|
|
||||||
- MYSQL_USER=wiki
|
|
||||||
- MYSQL_PASSWORD=CHANGE_ME_STRONG
|
|
||||||
networks:
|
|
||||||
- jswiki_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
wikijs:
|
|
||||||
image: lscr.io/linuxserver/wikijs:latest
|
|
||||||
container_name: wikijs
|
|
||||||
restart: unless-stopped
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
ports:
|
|
||||||
- "9180:3000"
|
|
||||||
volumes:
|
|
||||||
- ./data:/config
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- WIKIJS_DB_TYPE=mariadb
|
|
||||||
- WIKIJS_DB_HOST=db
|
|
||||||
- WIKIJS_DB_PORT=3306
|
|
||||||
- WIKIJS_DB_USER=wiki
|
|
||||||
- WIKIJS_DB_PASS=CHANGE_ME_STRONG
|
|
||||||
- WIKIJS_DB_NAME=wiki
|
|
||||||
networks:
|
|
||||||
- jswiki_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
jswiki_net:
|
|
||||||
name: jswiki_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Nextcloud AIO – proměnné prostředí
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
|
|
||||||
# Web port (default 11000)
|
|
||||||
APACHE_PORT=11000
|
|
||||||
|
|
||||||
# Data na hostu (NE containeru)
|
|
||||||
NEXTCLOUD_DATADIR=/mnt/data
|
|
||||||
|
|
||||||
# Extra balíky (ImageMagick pro OCR, atd.)
|
|
||||||
NEXTCLOUD_ADDITIONAL_APKS=imagemagick
|
|
||||||
|
|
||||||
# Upload limit
|
|
||||||
NEXTCLOUD_UPLOAD_LIMIT=10G
|
|
||||||
|
|
||||||
# Důvěryhodné certifikáty (firemní CA, Cloudflare Origin)
|
|
||||||
# NEXTCLOUD_TRUSTED_CACERTS_DIR=/usr/local/share/ca-certificates
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Nextcloud AIO – vše v jednom
|
|
||||||
|
|
||||||
> All-in-One Nextcloud: soubory, kalendář, kontakty, fotky, videohovory.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `nextcloud/all-in-one:latest`
|
|
||||||
- **Porty:** `11000` (admin), další interně
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge` + `nextcloud-aio` (interní)
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env # nastavit APACHE_PORT, NEXTCLOUD_DATADIR, NEXTCLOUD_ADDITIONAL_APKS
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
Pak otevři `http://<server>:11000/` a dokonči instalaci.
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Admin:** `http://<server>:11000`
|
|
||||||
- **Nextcloud:** `http://<server>:11000` (nebo za reverse proxy)
|
|
||||||
- **Doporučení:** terminuj HTTPS přes NPM
|
|
||||||
|
|
||||||
## 🔧 Pokročilé nastavení
|
|
||||||
|
|
||||||
- **Cloudflare Tunnel** – pro vzdálený přístup bez veřejné IP
|
|
||||||
- **Talk (videohovory)** – v AIO default
|
|
||||||
- **Imaginary (AI)** – rozpoznávání obrázků
|
|
||||||
- **Fulltextsearch** – indexování souborů
|
|
||||||
- **Whiteboard** – collaborative kreslení
|
|
||||||
- **Borg backup** – integrované zálohování
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **HTTPS terminuj v NPM** (Let's Encrypt)
|
|
||||||
- **2FA** – povinně pro admin
|
|
||||||
- **Brute force protection** – default zapnutý
|
|
||||||
- **Trusted domains** – nastav `NEXTCLOUD_TRUSTED_DOMAINS`
|
|
||||||
- **Backup** – AIO Borg nebo externí rsync
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
# AIO auto-updates Nextcloud a všechny sub-containery
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./nextcloud_aio_mastercontainer:/mnt/docker-aio-config` | AIO master data |
|
|
||||||
| `./data:/mnt/data` | Nextcloud data (files, DB) |
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Nextcloud AIO](https://github.com/nextcloud/all-in-one)
|
|
||||||
- [Nextcloud Admin Manual](https://docs.nextcloud.com/server/latest/admin_manual/)
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# Nextcloud All-in-One
|
|
||||||
|
|
||||||
services:
|
|
||||||
nextcloud-aio-mastercontainer:
|
|
||||||
image: nextcloud/all-in-one:latest
|
|
||||||
container_name: nextcloud-aio-mastercontainer
|
|
||||||
restart: unless-stopped
|
|
||||||
init: true
|
|
||||||
ports:
|
|
||||||
- "11000:8080"
|
|
||||||
volumes:
|
|
||||||
- ./nextcloud_aio_mastercontainer:/mnt/docker-aio-config
|
|
||||||
- ./data:/mnt/data
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- APACHE_PORT=11000
|
|
||||||
- NEXTCLOUD_DATADIR=/mnt/data
|
|
||||||
- NEXTCLOUD_ADDITIONAL_APKS=imagemagick
|
|
||||||
- NEXTCLOUD_TRUSTED_CACERTS_DIR=/usr/local/share/ca-certificates
|
|
||||||
- NEXTCLOUD_UPLOAD_LIMIT=10G
|
|
||||||
networks:
|
|
||||||
- nextcloud_net
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:8080"]
|
|
||||||
interval: 60s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 5
|
|
||||||
start_period: 120s
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
nextcloud_net:
|
|
||||||
name: nextcloud_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# NPM – proměnné prostředí
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
DISABLE_IPV6=true
|
|
||||||
|
|
||||||
# MariaDB heslo pro NPM backend (ZMĚŇ!)
|
|
||||||
MYSQL_ROOT_PASSWORD=change-me-strong-password
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# Nginx Proxy Manager
|
|
||||||
|
|
||||||
> Reverzní proxy s HTTPS (Let's Encrypt), web UI, ACL.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `jc21/nginx-proxy-manager:latest`
|
|
||||||
- **Porty:** `80`, `443`, `81` (admin UI)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Admin UI:** `http://<server>:81` (default `admin@example.com` / `changeme`)
|
|
||||||
- **Změň heslo hned po prvním přihlášení!**
|
|
||||||
|
|
||||||
## 🔒 HTTPS
|
|
||||||
|
|
||||||
NPM umí automaticky generovat Let's Encrypt certifikáty:
|
|
||||||
|
|
||||||
1. **DNS A záznam** domény → server IP
|
|
||||||
2. NPM UI → Proxy Hosts → Add Proxy Host
|
|
||||||
3. Domain Names: `service.example.com`
|
|
||||||
4. Scheme: `http`, Forward: `<server>:PORT`
|
|
||||||
5. Záložka **SSL:** Request SSL Certificate, Let's Encrypt
|
|
||||||
6. Force SSL, HTTP/2, HSTS – vše zapnout
|
|
||||||
|
|
||||||
## 🔧 Pokročilé
|
|
||||||
|
|
||||||
- **Cloudflare DNS-01 challenge** – pro wildcard certifikáty
|
|
||||||
- **Access Lists** – whitelist IP pro citlivé služby
|
|
||||||
- **Redirection** – 301/302 přesměrování
|
|
||||||
- **Streams** – TCP/UDP proxy (SSH, databáze)
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/data` | NPM data, certifikáty, konfigurace |
|
|
||||||
| `./letsencrypt:/etc/letsencrypt` | Let's Encrypt certifikáty |
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
# Certifikáty zůstávají v ./letsencrypt/
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [NPM oficiální dokumentace](https://nginxproxymanager.com/docs/)
|
|
||||||
- [Let's Encrypt s NPM](https://nginxproxymanager.com/advanced-config/#ssl-certificates)
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
# Nginx Proxy Manager
|
|
||||||
|
|
||||||
services:
|
|
||||||
nginx-proxy-manager:
|
|
||||||
image: jc21/nginx-proxy-manager:latest
|
|
||||||
container_name: nginx-proxy-manager
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
- "81:81"
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
- ./letsencrypt:/etc/letsencrypt
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- DISABLE_IPV6=true
|
|
||||||
networks:
|
|
||||||
- npm_net
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:81"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
start_period: 30s
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
# NPM vyžaduje vlastní MariaDB backend
|
|
||||||
db:
|
|
||||||
image: jc21/mariadb-aria:latest
|
|
||||||
container_name: npm_db
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- ./mysql:/var/lib/mysql
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- MYSQL_ROOT_PASSWORD=CHANGE_ME
|
|
||||||
networks:
|
|
||||||
- npm_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
npm_net:
|
|
||||||
name: nginx_proxy_manager_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# Plex – proměnné
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
|
|
||||||
# HW akcelerace (vyber podle sveho GPU)
|
|
||||||
# NVIDIA_VISIBLE_DEVICES=all
|
|
||||||
# INTEL_VISIBLE_DEVICES=true
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
# Plex – media server
|
|
||||||
|
|
||||||
> Stream filmů, seriálů, hudby, fotek. HW transkódování.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `linuxserver/plex:latest`
|
|
||||||
- **Porty:** `32400` (web), `1900` (DLNA), `5353` (Bonjour), `8324` (plex.tv)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `host` (doporučeno) – kvůli HW transkódování
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
Pak `http://<server>:32400/web` – setup wizard.
|
|
||||||
|
|
||||||
## 🎯 Funkce
|
|
||||||
|
|
||||||
- **Hardware transkódování** – Intel/AMD/NVIDIA GPU akcelerace
|
|
||||||
- **Plex Pass** – Live TV, DVR, HW encoding (placené)
|
|
||||||
- **Mobile app** – iOS/Android/Apple TV
|
|
||||||
- **Plex.tv** – vzdálený přístup
|
|
||||||
- **Share** – s přáteli
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/config` | Plex konfigurace, DB |
|
|
||||||
| `./media:/media` | Tvoje knihovna (filmy, seriály, hudba) |
|
|
||||||
|
|
||||||
## 🔧 HW transkódování
|
|
||||||
|
|
||||||
V `.env` nastavit:
|
|
||||||
- `NVIDIA_VISIBLE_DEVICES=all` – pro NVIDIA
|
|
||||||
- `INTEL_VISIBLE_DEVICES=true` – pro Intel QuickSync
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **HTTPS** – terminuj v NPM
|
|
||||||
- **Plex.tv účet** – nepoužívej guest účet
|
|
||||||
- **Network discovery** – vypni pokud nepotřebuješ
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Plex Support](https://support.plex.tv/)
|
|
||||||
- [Plex Media Server](https://www.plex.tv/media-server-downloads/)
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# Plex Media Server
|
|
||||||
|
|
||||||
services:
|
|
||||||
plex:
|
|
||||||
image: lscr.io/linuxserver/plex:latest
|
|
||||||
container_name: plex
|
|
||||||
restart: unless-stopped
|
|
||||||
network_mode: host # Pro HW transkódování a DLNA
|
|
||||||
volumes:
|
|
||||||
- ./data:/config
|
|
||||||
- ./media:/media
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- VERSION=docker
|
|
||||||
- NVIDIA_VISIBLE_DEVICES=all
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# Portainer CE – proměnné prostředí
|
|
||||||
# Zkopíruj tento soubor na .env a doplň skutečné hodnoty
|
|
||||||
|
|
||||||
# Timezone
|
|
||||||
TZ=Europe/Prague
|
|
||||||
|
|
||||||
# UID/GID pro file ownership
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
# Portainer – Docker UI management
|
|
||||||
|
|
||||||
> Webové UI pro správu Dockeru (kontejnery, image, sítě, volumes, swarm, kubernetes).
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `portainer/portainer-ce:latest`
|
|
||||||
- **Porty:** `9000` (HTTP), `9443` (HTTPS)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge` (default)
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env # nastavit SECRET, PUID, PGID
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **HTTP:** `http://<server>:9000`
|
|
||||||
- **HTTPS:** `https://<server>:9443` (self-signed, akceptuj varování)
|
|
||||||
|
|
||||||
**První přihlášení:**
|
|
||||||
1. Vytvoř admin účet (zobrazí se při prvním přístupu)
|
|
||||||
2. Připoj se k lokálnímu Docker endpointu
|
|
||||||
3. Spravuj kontejnery přes web UI
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/data` | Portainer data (DB, certifikáty, zálohy) |
|
|
||||||
| `/var/run/docker.sock:/var/run/docker.sock` | Přístup k Docker daemonu |
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Heslo pro admin:** silné, 12+ znaků
|
|
||||||
- **HTTPS:** nastavit v Settings → SSL (nebo terminovat v NPM)
|
|
||||||
- **2FA:** aktivovat pro admin účet v Settings → Users
|
|
||||||
- **Dostupnost:** portainer nemá remote auth → zařadit za reverse proxy
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Další informace
|
|
||||||
|
|
||||||
- [Oficiální dokumentace](https://docs.portainer.io/)
|
|
||||||
- [Portainer CE vs Business](https://www.portainer.io/pricing)
|
|
||||||
|
|
||||||
## 🛠 Troubleshooting
|
|
||||||
|
|
||||||
**Portainer se nemůže připojit k Dockeru:**
|
|
||||||
- Zkontroluj `/var/run/docker.sock` oprávnění
|
|
||||||
- Portainer musí mít stejný UID jako docker socket (typicky root, ale v CE to funguje)
|
|
||||||
|
|
||||||
**Zapomenuté heslo:**
|
|
||||||
```bash
|
|
||||||
docker exec -u root portainer /bin/sh
|
|
||||||
# Pak resetuj v DB (složitější, doporučuji reinstalaci)
|
|
||||||
```
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# Portainer Community Edition
|
|
||||||
|
|
||||||
services:
|
|
||||||
portainer:
|
|
||||||
image: portainer/portainer-ce:latest
|
|
||||||
container_name: portainer
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "9000:9000"
|
|
||||||
- "9443:9443"
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
networks:
|
|
||||||
- portainer_net
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:9000/api/status"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
start_period: 30s
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
portainer_net:
|
|
||||||
name: portainer_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# RustDesk – proměnné prostředí
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
|
|
||||||
# Poznámka: Po prvním spuštění si ulož veřejný klíč z logu hbbs
|
|
||||||
# Použije se v RustDesk klientovi (Preferences → Network → Key Server)
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# RustDesk Server – remote desktop
|
|
||||||
|
|
||||||
> Vlastní relay server pro RustDesk. Bez závislosti na veřejném RustDesk serveru.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `rustdesk/rustdesk-server:latest`
|
|
||||||
- **Porty:** `21115-21119` (TCP+UDP), `21116` (WebSocket)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `host` (lepší pro P2P)
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Konfigurace klienta
|
|
||||||
|
|
||||||
V RustDesk klientovi (Preferences → Network):
|
|
||||||
|
|
||||||
- **ID Server:** `<tvuj-server>:21116`
|
|
||||||
- **Key Server:** `<tvuj-server>:21116`
|
|
||||||
- **Relay Server:** `<tvuj-server>:21117`
|
|
||||||
|
|
||||||
**Veřejný klíč** získáš z logu kontejneru `hbbs` (první spuštění).
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Firewall:** otevři jen potřebné porty
|
|
||||||
- **HTTPS** – na relay lze nastavit terminaci
|
|
||||||
- **WebSocket** – `ws://` nebo `wss://` (doporučeno za HTTPS)
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/root` | Databáze, klíče, data |
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [RustDesk Server](https://rustdesk.com/docs/en/self-host/)
|
|
||||||
- [Docker compose](https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/docker/)
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# RustDesk Server – vlastní relay
|
|
||||||
|
|
||||||
services:
|
|
||||||
hbbs:
|
|
||||||
image: rustdesk/rustdesk-server:latest
|
|
||||||
container_name: hbbs
|
|
||||||
command: hbbs
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- ./data:/root
|
|
||||||
ports:
|
|
||||||
- "21115:21115"
|
|
||||||
- "21116:21116"
|
|
||||||
- "21116:21116/udp"
|
|
||||||
- "21118:21118"
|
|
||||||
networks:
|
|
||||||
- rustdesk_net
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
hbbr:
|
|
||||||
image: rustdesk/rustdesk-server:latest
|
|
||||||
container_name: hbbr
|
|
||||||
command: hbbr
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- ./data:/root
|
|
||||||
ports:
|
|
||||||
- "21117:21117"
|
|
||||||
- "21119:21119"
|
|
||||||
networks:
|
|
||||||
- rustdesk_net
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
rustdesk_net:
|
|
||||||
name: rustdesk_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# Speedtest Tracker – proměnné
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
|
|
||||||
# APP_KEY: 32+ znaků – vygeneruj: openssl rand -base64 32
|
|
||||||
APP_KEY=change-me-32-char-base64-key
|
|
||||||
|
|
||||||
# URL kde běží Speedtest Tracker
|
|
||||||
APP_URL=http://CHANGE_ME:8765
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Speedtest Tracker – rychlost internetu
|
|
||||||
|
|
||||||
> Sledování rychlosti internetu v čase. Grafy, alerty, statistiky.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `linuxserver/speedtest-tracker:latest`
|
|
||||||
- **Porty:** `8765` (web), `8443` (HTTPS)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Web:** `http://<server>:8765`
|
|
||||||
|
|
||||||
## 🎯 Funkce
|
|
||||||
|
|
||||||
- **Automatický speedtest** – každých X minut
|
|
||||||
- **Grafy** – rychlost stahování, odesílání, ping
|
|
||||||
- **Alert** – notifikace když rychlost klesne
|
|
||||||
- **Multi-server** – sleduj víc linek
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/config` | Speedtest Tracker data |
|
|
||||||
|
|
||||||
## 🔧 Pokročilé
|
|
||||||
|
|
||||||
- **Ookla CLI** – integrovaný
|
|
||||||
- **Cloudflare** – speedtest.cloudflare.com
|
|
||||||
- **Notifikace** – email, Telegram, Discord, Slack
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Speedtest Tracker](https://docs.speedtest-tracker.dev/)
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# Speedtest Tracker
|
|
||||||
|
|
||||||
services:
|
|
||||||
speedtest:
|
|
||||||
image: lscr.io/linuxserver/speedtest-tracker:latest
|
|
||||||
container_name: speedtest
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "8765:80"
|
|
||||||
- "8443:443"
|
|
||||||
volumes:
|
|
||||||
- ./data:/config
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- APP_KEY=CHANGE_ME_32_CHAR_KEY
|
|
||||||
- APP_URL=http://CHANGE_ME:8765
|
|
||||||
networks:
|
|
||||||
- speedtest_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
speedtest_net:
|
|
||||||
name: speedtest_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# Vaultwarden – proměnné prostředí
|
|
||||||
TZ=Europe/Prague
|
|
||||||
PUID=1000
|
|
||||||
PGID=1000
|
|
||||||
|
|
||||||
# URL přes kterou bude Vaultwarden dostupný (musí být https://)
|
|
||||||
DOMAIN=https://vault.example.com
|
|
||||||
|
|
||||||
# Po prvním přihlášení admin účtu nastavte na false
|
|
||||||
SIGNUPS_ALLOWED=true
|
|
||||||
INVITATIONS_ALLOWED=false
|
|
||||||
|
|
||||||
# Bezpečnost
|
|
||||||
SHOW_PASSWORD_HINT=false
|
|
||||||
LOG_LEVEL=warn
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
# Vaultwarden – self-hosted správce hesel
|
|
||||||
|
|
||||||
> Kompatibilní s Bitwarden klienty. Open-source, lehký (Rust).
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `vaultwarden/server:latest`
|
|
||||||
- **Porty:** `2999` (HTTP), `3012` (WebSocket, interní)
|
|
||||||
- **User:** `1000:1000`
|
|
||||||
- **Network:** `bridge`
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env # nastavit DOMAIN, ROCKET_PORT, hesla
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🌐 Přístup
|
|
||||||
|
|
||||||
- **Web vault:** `http://<server>:2999` (za HTTPS terminuj v NPM)
|
|
||||||
- **Bitwarden app:** stejná URL jako vault
|
|
||||||
- **Doporučení:** terminuj HTTPS přes NPM a nepoužívej HTTP přímo
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **DOMAIN** musí být `https://vault.example.com` (ne `http`)
|
|
||||||
- **SIGNUPS_ALLOWED=false** po registraci admin účtu
|
|
||||||
- **INVITATIONS_ALLOWED=false** pokud nechceš zvát další
|
|
||||||
- **SHOW_PASSWORD_HINT=false** (odhalování hesel)
|
|
||||||
- **DATABASE_URL** – zálohuj SQLite pravidelně
|
|
||||||
|
|
||||||
## 🔑 Záloha
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Zastavit kontejner
|
|
||||||
docker compose stop
|
|
||||||
|
|
||||||
# Zazálohovat SQLite DB
|
|
||||||
cp ./data/db.sqlite3 /backup/vaultwarden-$(date +%Y%m%d).sqlite3
|
|
||||||
|
|
||||||
# Restart
|
|
||||||
docker compose start
|
|
||||||
```
|
|
||||||
|
|
||||||
## 👥 Organizace
|
|
||||||
|
|
||||||
- **1 user** (ty) – self-hosted
|
|
||||||
- **2FA** – povinně aktivuj po registraci
|
|
||||||
- **FIDO2/WebAuthn** – podpora hardwarových klíčů (YubiKey)
|
|
||||||
- **Organizace** – pro sdílení hesel s rodinou
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `./data:/data` | SQLite DB, attachmenty, ikony, config |
|
|
||||||
|
|
||||||
## 📚 Klienti
|
|
||||||
|
|
||||||
- **Mobil:** Bitwarden (iOS/Android)
|
|
||||||
- **Desktop:** Bitwarden (Win/Mac/Linux)
|
|
||||||
- **Browser:** Bitwarden extension (Chrome/Firefox/Edge)
|
|
||||||
- **CLI:** `rbw` (Rust) nebo `bitwarden-cli`
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose pull
|
|
||||||
docker compose up -d
|
|
||||||
# DB migrace probíhá automaticky
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Vaultwarden Wiki](https://github.com/dani-garcia/vaultwarden/wiki)
|
|
||||||
- [Bitwarden klienti](https://bitwarden.com/download/)
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# Vaultwarden – kompatibilní Bitwarden server
|
|
||||||
|
|
||||||
services:
|
|
||||||
vaultwarden:
|
|
||||||
image: vaultwarden/server:latest
|
|
||||||
container_name: vaultwarden
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "2999:80"
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
environment:
|
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- DOMAIN=https://CHANGE_ME
|
|
||||||
- ROCKET_PORT=80
|
|
||||||
- SIGNUPS_ALLOWED=true
|
|
||||||
- INVITATIONS_ALLOWED=false
|
|
||||||
- SHOW_PASSWORD_HINT=false
|
|
||||||
- LOG_LEVEL=warn
|
|
||||||
- EXTENDED_LOGGING=true
|
|
||||||
- RUST_BACKTRACE=1
|
|
||||||
networks:
|
|
||||||
- vaultwarden_net
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:80/alive"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
start_period: 30s
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
vaultwarden_net:
|
|
||||||
name: vaultwarden_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# Watchtower – proměnné
|
|
||||||
TZ=Europe/Prague
|
|
||||||
|
|
||||||
# Mód: true = jen upozorni, false = auto-aktualizuje
|
|
||||||
WATCHTOWER_MONITOR_ONLY=true
|
|
||||||
|
|
||||||
# Mazat stare image po update
|
|
||||||
WATCHTOWER_CLEANUP=true
|
|
||||||
|
|
||||||
# Cron schedule (default: kazdou nedeli ve 4:00)
|
|
||||||
WATCHTOWER_SCHEDULE=0 0 4 ? * SUN
|
|
||||||
|
|
||||||
# Email notifikace
|
|
||||||
WATCHTOWER_NOTIFICATIONS=email
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=watchtower@example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=change-me
|
|
||||||
|
|
||||||
# Poznámka: V praxi nastav SMTP podle sveho providera
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# Watchtower – automatické aktualizace
|
|
||||||
|
|
||||||
> Sleduje nové verze Docker image a automaticky restartuje kontejnery.
|
|
||||||
|
|
||||||
## 📋 Přehled
|
|
||||||
|
|
||||||
- **Image:** `containrrr/watchtower:latest`
|
|
||||||
- **Network:** `bridge` (musí mít přístup k Docker socketu)
|
|
||||||
- **Mód:** monitor-only (default) – jen upozorňuje, NEaktualizuje
|
|
||||||
|
|
||||||
## 🚀 Instalace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env # nastavit WATCHTOWER_MONITOR_ONLY podle potřeby
|
|
||||||
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🎯 Módy
|
|
||||||
|
|
||||||
- **Monitor only** (default) – posílá email/notifikaci, NEaktualizuje
|
|
||||||
- **Auto update** – stáhne nový image, restartuje kontejner
|
|
||||||
|
|
||||||
## 📧 Notifikace (email)
|
|
||||||
|
|
||||||
```env
|
|
||||||
WATCHTOWER_NOTIFICATIONS=email
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=watchtower@example.com
|
|
||||||
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=CHANGE_ME
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔧 Pokročilé
|
|
||||||
|
|
||||||
- **Schedule** – cron-like: `0 0 4 ? * SUN` (každou neděli v 4:00)
|
|
||||||
- **Cleanup** – smaže staré image (`WATCHTOWER_CLEANUP=true`)
|
|
||||||
- **Notifications** – shoutrrr (Telegram, Discord, Slack, …)
|
|
||||||
|
|
||||||
## 📁 Volumes
|
|
||||||
|
|
||||||
| Mount | Účel |
|
|
||||||
|---|---|
|
|
||||||
| `/var/run/docker.sock:/var/run/docker.sock` | Přístup k Docker daemonu |
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Doporučeno:** monitor-only s email notifikací
|
|
||||||
- **Auto-update** riskantní – může rozbít službu
|
|
||||||
- **Manuální update:** `docker compose pull && docker compose up -d`
|
|
||||||
|
|
||||||
## 🔄 Restart
|
|
||||||
|
|
||||||
Watchtower se automaticky restartuje. **Nemusíte na něj sahat.**
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Watchtower GitHub](https://github.com/containrrr/watchtower)
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# Watchtower – monitor + auto-update
|
|
||||||
|
|
||||||
services:
|
|
||||||
watchtower:
|
|
||||||
image: containrrr/watchtower:latest
|
|
||||||
container_name: watchtower
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
environment:
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- WATCHTOWER_MONITOR_ONLY=true
|
|
||||||
- WATCHTOWER_CLEANUP=true
|
|
||||||
- WATCHTOWER_SCHEDULE=0 0 4 ? * SUN
|
|
||||||
- WATCHTOWER_NOTIFICATIONS=email
|
|
||||||
- WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
|
|
||||||
- WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
|
|
||||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
|
|
||||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
|
|
||||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=watchtower@example.com
|
|
||||||
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=CHANGE_ME
|
|
||||||
- WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG=Watchtower
|
|
||||||
networks:
|
|
||||||
- watchtower_net
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
options:
|
|
||||||
max-size: "10m"
|
|
||||||
max-file: "3"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
watchtower_net:
|
|
||||||
name: watchtower_default
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,162 +0,0 @@
|
|||||||
# 🏛 Architecture
|
|
||||||
|
|
||||||
> Jak je celá home infrastruktura poskládaná.
|
|
||||||
|
|
||||||
## 🎯 Přehled
|
|
||||||
|
|
||||||
Home lab běží na jednom fyzickém serveru (Ubuntu 22.04/24.04 LTS) s Docker.
|
|
||||||
Všechny služby jsou **containerizované**, za **Nginx Proxy Manager** (reverse proxy + HTTPS).
|
|
||||||
|
|
||||||
## 🌐 Vrstvy
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ Layer 7: Aplikační služby │
|
|
||||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
||||||
│ │Nextcloud │ │Vaultwarden│ │ Gitea │ │ Jotty │ │
|
|
||||||
│ │ :11000 │ │ :2999 │ │ :3000/222│ │ :1122 │ │
|
|
||||||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
||||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
||||||
│ │ Portainer│ │ Plex │ │Audiobook-│ │ Calibre │ │
|
|
||||||
│ │ :9000 │ │ :32400 │ │shelf:13378│ │-Web:8083 │ │
|
|
||||||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
||||||
│ ... dalších 7 služeb (rustdesk, wikijs, speedtest, ...) │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
▲
|
|
||||||
│ HTTPS
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ Layer 4-7: Reverzní proxy + Let's Encrypt │
|
|
||||||
│ ┌──────────────────────────────────────────────────┐ │
|
|
||||||
│ │ Nginx Proxy Manager (:80, :443) │ │
|
|
||||||
│ │ - SSL terminace (Let's Encrypt) │ │
|
|
||||||
│ │ - HTTP → HTTPS redirect │ │
|
|
||||||
│ │ - Access Lists │ │
|
|
||||||
│ │ - Load balancing (volitelně) │ │
|
|
||||||
│ └──────────────────────────────────────────────────┘ │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
▲
|
|
||||||
│ HTTP
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ Layer 2-3: Docker bridge networks │
|
|
||||||
│ Každá služba má vlastní bridge: │
|
|
||||||
│ portainer_default, vaultwarden_default, gitea_default, ... │
|
|
||||||
│ Izolace: služby mezi sebou nekomunikují (default) │
|
|
||||||
│ Komunikace: přes reverzní proxy (NPM) │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
▲
|
|
||||||
│ Docker API
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ Layer 1: Fyzický server │
|
|
||||||
│ ┌──────────────────────────────────────────────────┐ │
|
|
||||||
│ │ Ubuntu 22.04/24.04 LTS │ │
|
|
||||||
│ │ - Docker CE 29.x │ │
|
|
||||||
│ │ - Portainer CE (UI pro Docker) │ │
|
|
||||||
│ │ - Watchtower (auto-update monitoring) │ │
|
|
||||||
│ │ - deploy user (UID 1000) │ │
|
|
||||||
│ │ - UFW firewall + fail2ban │ │
|
|
||||||
│ │ - SSH hardening │ │
|
|
||||||
│ └──────────────────────────────────────────────────┘ │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔌 Služby (detail)
|
|
||||||
|
|
||||||
| Služba | Port | Databáze | Volume | Backup |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| Portainer | 9000, 9443 | SQLite (interní) | `./data` | rsync |
|
|
||||||
| Nginx Proxy Manager | 80, 443, 81 | MariaDB | `./data`, `./letsencrypt` | rsync |
|
|
||||||
| Vaultwarden | 2999 | SQLite | `./data` | rsync (kritické!) |
|
|
||||||
| Nextcloud AIO | 11000 | MariaDB | `./data` | AIO Borg |
|
|
||||||
| Gitea | 3000, 222 | SQLite | `./gitea` | rsync |
|
|
||||||
| Jotty | 1122 | SQLite | `./data` | rsync |
|
|
||||||
| RustDesk | 21115-21119 | SQLite | `./data` | rsync |
|
|
||||||
| Audiobookshelf | 13378 | SQLite | `./data` + `./audiobooks` | rsync |
|
|
||||||
| Calibre-Web | 8083 | SQLite | `./data` + `./books` | rsync |
|
|
||||||
| Plex | 32400 | SQLite | `./data` + `./media` | rsync |
|
|
||||||
| Erugo | 61080 | SQLite | `./data` | rsync |
|
|
||||||
| Wiki.js | 9180 | MariaDB | `./data` | rsync |
|
|
||||||
| Speedtest | 8765 | SQLite | `./data` | rsync |
|
|
||||||
| Watchtower | – | – | – | – |
|
|
||||||
|
|
||||||
## 💾 Zálohovací schéma
|
|
||||||
|
|
||||||
```
|
|
||||||
┌────────────┐
|
|
||||||
│ Server │ rsync (denně, 03:00) → NAS /Volumes/Backups
|
|
||||||
│ /home/.../│
|
|
||||||
└────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌────────────┐
|
|
||||||
│ NAS │ Off-site sync (Backblaze B2, týdně)
|
|
||||||
│ /Backups/ │
|
|
||||||
└────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
Viz `install-scripts/backup-all.sh` a `install-scripts/restore-all.sh`.
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
### Perimetrie
|
|
||||||
- **UFW** – default deny, povoleno: SSH, HTTP, HTTPS
|
|
||||||
- **fail2ban** – ban po 3 neúspěšných SSH pokusech
|
|
||||||
- **Cloudflare Tunnel** (volitelně) – přístup zvenčí bez veřejné IP
|
|
||||||
|
|
||||||
### Auth
|
|
||||||
- **SSH klíče** – hesla zakázána (`PasswordAuthentication no`)
|
|
||||||
- **2FA** – na všech web službách (Gitea, Vaultwarden, Nextcloud, …)
|
|
||||||
- **Vaultwarden** – single source of truth pro hesla
|
|
||||||
|
|
||||||
### Network
|
|
||||||
- **Bridge isolation** – služby spolu nekomunikují (default)
|
|
||||||
- **No host network** – kromě Plex (HW transkódování)
|
|
||||||
- **DNS-over-HTTPS** (volitelně)
|
|
||||||
|
|
||||||
## 🔄 Deployment workflow
|
|
||||||
|
|
||||||
```
|
|
||||||
Developer
|
|
||||||
│
|
|
||||||
├─→ git push (do Gitea)
|
|
||||||
│
|
|
||||||
├─→ Ansible (na server)
|
|
||||||
│ │
|
|
||||||
│ └─→ docker compose pull && up -d
|
|
||||||
│
|
|
||||||
└─→ Watchtower (auto, týdně)
|
|
||||||
└─→ image: pull, container: restart
|
|
||||||
```
|
|
||||||
|
|
||||||
Viz `ansible/playbooks/`.
|
|
||||||
|
|
||||||
## 📊 Monitoring
|
|
||||||
|
|
||||||
- **Watchtower** – Docker image notifikace (email/Telegram)
|
|
||||||
- **Speedtest Tracker** – internet speed
|
|
||||||
- **Nextcloud Talk** – interní chat
|
|
||||||
- **Portainer** – Docker container status
|
|
||||||
|
|
||||||
## 🛠 Maintenance
|
|
||||||
|
|
||||||
| Úkol | Jak často | Skript/Ansible |
|
|
||||||
|---|---|---|
|
|
||||||
| Backup | Denně 03:00 | `backup-all.sh` (cron) |
|
|
||||||
| Update OS | Týdně | `apt update && apt upgrade` |
|
|
||||||
| Update Docker image | Týdně (auto) | Watchtower |
|
|
||||||
| Cert renewal | Auto (Let's Encrypt 30d) | NPM interní |
|
|
||||||
| Health check | Denně | `docker ps` + alerting |
|
|
||||||
|
|
||||||
## 🔮 Roadmap
|
|
||||||
|
|
||||||
- **Kubernetes** – přechod z docker compose na k3s (1 server node, multi-workload)
|
|
||||||
- **GitOps** – ArgoCD pro plnou automatizaci
|
|
||||||
- **CI/CD** – Gitea Actions pro testování Ansible playbooks
|
|
||||||
- **Off-site backup** – Backblaze B2 s encryption
|
|
||||||
- **Monitoring stack** – Prometheus + Grafana + Loki
|
|
||||||
|
|
||||||
## 📚 Reference
|
|
||||||
|
|
||||||
- [Docker docs](https://docs.docker.com/)
|
|
||||||
- [Nginx Proxy Manager](https://nginxproxymanager.com/)
|
|
||||||
- [Ansible best practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)
|
|
||||||
- [12-factor app](https://12factor.net/)
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
# 🤝 Contributing
|
|
||||||
|
|
||||||
> Jak přispívat do tohoto repozitáře.
|
|
||||||
|
|
||||||
## 📝 Pravidla
|
|
||||||
|
|
||||||
### Commit messages
|
|
||||||
|
|
||||||
Používej **Conventional Commits**:
|
|
||||||
|
|
||||||
- `feat:` – nová služba nebo funkce
|
|
||||||
- `fix:` – oprava chyby
|
|
||||||
- `docs:` – pouze dokumentace
|
|
||||||
- `chore:` – údržba, refactoring
|
|
||||||
- `style:` – formatting, bez funkční změny
|
|
||||||
- `refactor:` – přestavba kódu
|
|
||||||
- `test:` – přidání testů
|
|
||||||
|
|
||||||
Příklad: `feat(vaultwarden): přidat 2FA podporu`
|
|
||||||
|
|
||||||
### Branch naming
|
|
||||||
|
|
||||||
- `feature/<name>` – nová feature
|
|
||||||
- `fix/<name>` – bugfix
|
|
||||||
- `docs/<name>` – dokumentace
|
|
||||||
|
|
||||||
Příklad: `feature/audiobookshelf-metadata`
|
|
||||||
|
|
||||||
### Pull Request
|
|
||||||
|
|
||||||
1. Fork → branch → commit → push → PR
|
|
||||||
2. **Titulek PR** – krátký, výstižný
|
|
||||||
3. **Popis** – co, proč, jak
|
|
||||||
4. **Screenshoty** – pokud měníš UI/dokumentaci
|
|
||||||
5. **Testy** – pokud měníš Ansible playbooks
|
|
||||||
|
|
||||||
## 🏗 Struktura
|
|
||||||
|
|
||||||
```
|
|
||||||
repo/
|
|
||||||
├── docker-services/ # Každá služba v samostatném adresáři
|
|
||||||
├── install-scripts/ # Bash skripty pro nové servery
|
|
||||||
├── ansible/ # Playbooky + role
|
|
||||||
├── hermes-install/ # Hermes CLI setup
|
|
||||||
├── macos-setup/ # Homebrew + macOS defaults
|
|
||||||
├── home-nas-tools/ # Metadata (žádné binárky!)
|
|
||||||
└── docs/ # Architektura, bezpečnost
|
|
||||||
```
|
|
||||||
|
|
||||||
## ✅ Checklist pro novou službu
|
|
||||||
|
|
||||||
- [ ] `docker-services/<service>/docker-compose.yml` – generický, placeholders
|
|
||||||
- [ ] `docker-services/<service>/.env.example` – šablona env vars
|
|
||||||
- [ ] `docker-services/<service>/README.md` – dokumentace
|
|
||||||
- [ ] Aktualizován `docker-services/README.md` (tabulka)
|
|
||||||
- [ ] Aktualizován hlavní `README.md` (pokud je service klíčová)
|
|
||||||
- [ ] **Žádné citlivé údaje** v commitu
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- ❌ **NEcommituj** hesla, API klíče, IP adresy serveru
|
|
||||||
- ❌ **NEcommituj** `~/.env` (je v `.gitignore`)
|
|
||||||
- ❌ **NEcommituj** SSH klíče
|
|
||||||
- ✅ **Vždy** používej `.env.example` jako šablonu
|
|
||||||
- ✅ **Vždy** testuj nové compose lokálně před commitem
|
|
||||||
|
|
||||||
## 🧪 Testování
|
|
||||||
|
|
||||||
Před commitem:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Validace YAML
|
|
||||||
python3 -c "import yaml; yaml.safe_load(open('docker-services/<service>/docker-compose.yml'))"
|
|
||||||
|
|
||||||
# Validace compose (na serveru)
|
|
||||||
docker compose -f docker-services/<service>/docker-compose.yml config
|
|
||||||
|
|
||||||
# Syntax check bash
|
|
||||||
shellcheck install-scripts/<script>.sh
|
|
||||||
|
|
||||||
# Lint Ansible
|
|
||||||
ansible-lint ansible/playbooks/<playbook>.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📋 Verzování
|
|
||||||
|
|
||||||
- **Semver** – `MAJOR.MINOR.PATCH`
|
|
||||||
- **Tagy:** `v1.0.0`, `v1.1.0`, …
|
|
||||||
- **Release notes** – v GitHub/Gitea Releases
|
|
||||||
|
|
||||||
## 🐛 Hlášení chyb
|
|
||||||
|
|
||||||
Vytvoř **issue** v Gitea s:
|
|
||||||
|
|
||||||
1. **Název** – krátký popis
|
|
||||||
2. **Kroky k reprodukci** – co jsi udělal
|
|
||||||
3. **Očekávané chování** – co jsi čekal
|
|
||||||
4. **Skutečné chování** – co se stalo
|
|
||||||
5. **Verze** – `git describe` + verze OS
|
|
||||||
|
|
||||||
## 💡 Návrhy features
|
|
||||||
|
|
||||||
1. Otevři **issue** s labelem `enhancement`
|
|
||||||
2. Popiš use case – co chceš dělat
|
|
||||||
3. Jaké alternativy jsi zvážil
|
|
||||||
4. Jak to navrhuješ implementovat
|
|
||||||
|
|
||||||
## 📞 Kontakt
|
|
||||||
|
|
||||||
- **Issues:** Gitea
|
|
||||||
- **Email:** viz Gitea profil
|
|
||||||
- **Diskuze:** Gitea Discussions (pokud povoleno)
|
|
||||||
|
|
||||||
## 📜 Licence
|
|
||||||
|
|
||||||
Přispěním do tohoto repo souhlasíš s licencí [MIT](../LICENSE).
|
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
# 🔐 Security
|
|
||||||
|
|
||||||
> Bezpečnostní checklisty, hardening, threat model.
|
|
||||||
|
|
||||||
## 🛡 Defense in depth
|
|
||||||
|
|
||||||
### Layer 1: Fyzický
|
|
||||||
- Server v uzamčené místnosti
|
|
||||||
- UPS (nepřerušitelný zdroj)
|
|
||||||
- Teplotní monitoring (smart home)
|
|
||||||
|
|
||||||
### Layer 2: Síť (perimetrie)
|
|
||||||
- ✅ UFW firewall (default deny)
|
|
||||||
- ✅ fail2ban (3 SSH pokusy = ban)
|
|
||||||
- ✅ Cloudflare Tunnel (žádná veřejná IP)
|
|
||||||
- ✅ VLAN izolace (IoT vs servery)
|
|
||||||
|
|
||||||
### Layer 3: OS
|
|
||||||
- ✅ Ubuntu LTS (pravidelné bezpečnostní updaty)
|
|
||||||
- ✅ unattended-upgrades (auto security updates)
|
|
||||||
- ✅ SSH klíče (hesla zakázána)
|
|
||||||
- ✅ PermitRootLogin no
|
|
||||||
- ✅ Auditd (logování)
|
|
||||||
|
|
||||||
### Layer 4: Docker
|
|
||||||
- ✅ Bridge network isolation
|
|
||||||
- ✅ Read-only filesystémy kde to jde
|
|
||||||
- ✅ USER_UID/GID pro file ownership
|
|
||||||
- ✅ No `--privileged` (pokud to není nutné)
|
|
||||||
- ✅ No `--net=host` (kromě Plex)
|
|
||||||
- ✅ Health checks pro monitoring
|
|
||||||
- ✅ Logging: json-file driver, 10 MB × 3
|
|
||||||
|
|
||||||
### Layer 5: Aplikace
|
|
||||||
- ✅ HTTPS terminuje NPM (Let's Encrypt)
|
|
||||||
- ✅ 2FA na všech web službách
|
|
||||||
- ✅ API klíče v keychainu, ne v env souborech
|
|
||||||
- ✅ Rate limiting (NPM, fail2ban)
|
|
||||||
|
|
||||||
### Layer 6: Data
|
|
||||||
- ✅ Backup na NAS (denně)
|
|
||||||
- ✅ Off-site backup (Backblaze B2)
|
|
||||||
- ✅ Šifrované citlivé volumes (LUKS, v budoucnu)
|
|
||||||
- ✅ Retention policy (7 dní denně, 4 týdny týdně, 12 měsíců měsíčně)
|
|
||||||
|
|
||||||
## 🔑 Správa hesel
|
|
||||||
|
|
||||||
- **Vaultwarden** – single source of truth
|
|
||||||
- **API klíče** – v macOS keychainu (`security add-generic-password`)
|
|
||||||
- **SSH klíče** – `~/.ssh/id_ed25519`, passphrase v keychainu
|
|
||||||
- **2FA** – TOTP, hardwarový klíč (doporučeno YubiKey)
|
|
||||||
|
|
||||||
## 🚨 Incident Response
|
|
||||||
|
|
||||||
### Detekce
|
|
||||||
- Watchtower notifikace (image outdated)
|
|
||||||
- fail2ban email alert
|
|
||||||
- Speedtest alert (interní outage)
|
|
||||||
- Cloudflare Tunnel logy
|
|
||||||
|
|
||||||
### Postup
|
|
||||||
1. **Identifikuj** – logy, monitoring
|
|
||||||
2. **Izoluj** – zastavit kontejner / odpojit síť
|
|
||||||
3. **Analyzuj** – root cause, scope
|
|
||||||
4. **Oprav** – patch, konfigurace
|
|
||||||
5. **Dokumentuj** – incident log v `~/Skripty/incident-YYYY-MM-DD.md`
|
|
||||||
|
|
||||||
### Recovery
|
|
||||||
- `restore-all.sh` pro Docker data
|
|
||||||
- Vaultwarden backup pro credentials
|
|
||||||
- DNS failover (Cloudflare)
|
|
||||||
|
|
||||||
## 🛠 Hardening checklist
|
|
||||||
|
|
||||||
### Server
|
|
||||||
- [ ] Ubuntu LTS nainstalován
|
|
||||||
- [ ] UFW aktivní, default deny
|
|
||||||
- [ ] fail2ban nakonfigurován
|
|
||||||
- [ ] SSH klíče, root login zakázán
|
|
||||||
- [ ] unattended-upgrades aktivní
|
|
||||||
- [ ] auditd běží
|
|
||||||
- [ ] Docker nainstalován z oficiálního repo
|
|
||||||
|
|
||||||
### Docker
|
|
||||||
- [ ] Bridge networks (žádný host network, kromě Plex)
|
|
||||||
- [ ] USER_UID=1000, USER_GID=1000 pro všechny kontejnery
|
|
||||||
- [ ] Volumes na hostu (./data), ne anonymous
|
|
||||||
- [ ] Health checks v compose
|
|
||||||
- [ ] Logging: 10 MB × 3 soubory
|
|
||||||
- [ ] Restart: unless-stopped
|
|
||||||
|
|
||||||
### Služby
|
|
||||||
- [ ] HTTPS terminuje NPM
|
|
||||||
- [ ] Let's Encrypt auto-renew
|
|
||||||
- [ ] 2FA na všech účtech
|
|
||||||
- [ ] Admin heslo změněno z default
|
|
||||||
- [ ] Registrace vypnuta (pokud ne private)
|
|
||||||
- [ ] SMTP nastaveno (pro notifikace)
|
|
||||||
|
|
||||||
### Zálohy
|
|
||||||
- [ ] rsync skript cron (denně 03:00)
|
|
||||||
- [ ] Off-site backup (Backblaze B2)
|
|
||||||
- [ ] Test obnovy (čtvrtletně)
|
|
||||||
- [ ] Šifrované zálohy (GPG + age)
|
|
||||||
|
|
||||||
## 📜 Compliance
|
|
||||||
|
|
||||||
- **GDPR** – osobní data v Nextcloud (kontrola přístupu)
|
|
||||||
- **PCI DSS** – N/A (žádné platby)
|
|
||||||
- **NIS2** – pokud provozuješ služby pro třetí strany
|
|
||||||
|
|
||||||
## 🔍 Threat model
|
|
||||||
|
|
||||||
| Hrozba | Pravděpodobnost | Dopad | Mitigace |
|
|
||||||
|---|---|---|---|
|
|
||||||
| Brute force SSH | Vysoká | Nízký | fail2ban, key-only |
|
|
||||||
| Phishing | Střední | Vysoký | 2FA, edukace |
|
|
||||||
| Docker escape | Nízká | Kritický | Bridge isolation, USER_UID, pravidelné updaty |
|
|
||||||
| Supply chain (image) | Nízká | Vysoký | Oficiální image, Watchtower, GPG signing |
|
|
||||||
| Insider threat | Nízká | Střední | Audit logy, 2FA, hesla v keychainu |
|
|
||||||
| Ransomware | Nízká | Kritický | Off-site backup, 3-2-1 rule |
|
|
||||||
| DDoS | Střední | Střední | Cloudflare, fail2ban |
|
|
||||||
| DNS hijack | Nízká | Vysoký | DNSSEC, HTTPS |
|
|
||||||
| Zero-day v OS | Střední | Kritický | unattended-upgrades, WAF |
|
|
||||||
|
|
||||||
## 🔐 API token management
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Uložení do keychainu
|
|
||||||
security add-generic-password \
|
|
||||||
-s "service:api:192.168.0.148" \
|
|
||||||
-a "user" \
|
|
||||||
-w "TOKEN" -U
|
|
||||||
|
|
||||||
# Čtení v skriptech
|
|
||||||
TOKEN=$(security find-generic-password \
|
|
||||||
-s "service:api:192.168.0.148" \
|
|
||||||
-a "user" -w)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Pravidla:**
|
|
||||||
- Token **nikdy** v `.env` souborech
|
|
||||||
- Token **nikdy** v `docker-compose.yml`
|
|
||||||
- Token **nikdy** v git history
|
|
||||||
- Token **pouze** v keychainu nebo env variables
|
|
||||||
|
|
||||||
## 📚 Reference
|
|
||||||
|
|
||||||
- [CIS Docker Benchmark](https://www.cisecurity.org/benchmark/docker)
|
|
||||||
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
|
|
||||||
- [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework)
|
|
||||||
- [CIS Ubuntu Linux Benchmark](https://www.cisecurity.org/benchmark/ubuntu_linux)
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
# 🤖 Hermes Install
|
|
||||||
|
|
||||||
> Instalace a konfigurace **Hermes Agent** (AI asistent) na macOS.
|
|
||||||
|
|
||||||
## 📦 Obsah
|
|
||||||
|
|
||||||
| Soubor | Účel |
|
|
||||||
|---|---|
|
|
||||||
| [`install-hermes.sh`](install-hermes.sh) | Instaluje Hermes CLI |
|
|
||||||
| [`configure-hermes.sh`](configure-hermes.sh) | Nastaví API klíče, pracovní adresáře, profily |
|
|
||||||
| [`hermes-config.example.yml`](hermes-config.example.yml) | Ukázková konfigurace |
|
|
||||||
| [`README.md`](README.md) | Tento soubor |
|
|
||||||
|
|
||||||
## 🤖 Co je Hermes?
|
|
||||||
|
|
||||||
Hermes je **AI asistent** (Claude/GPT) integrovaný v terminálu. Umí:
|
|
||||||
|
|
||||||
- Spravovat soubory, Git, Docker
|
|
||||||
- Spouštět skripty (sandbox)
|
|
||||||
- Plánovat a provádět multi-step úkoly
|
|
||||||
- Učit se z paměti
|
|
||||||
- Integrovat se schránkou, poštou, kalendářem
|
|
||||||
|
|
||||||
## 🚀 Quickstart
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Instalace
|
|
||||||
curl -fsSL https://hermes-agent.dev/install.sh | bash
|
|
||||||
# Nebo:
|
|
||||||
bash install-hermes.sh
|
|
||||||
|
|
||||||
# 2. Konfigurace (API klíč)
|
|
||||||
bash configure-hermes.sh
|
|
||||||
# nebo ručně:
|
|
||||||
hermes config set api-key <tvuj-api-klic>
|
|
||||||
hermes config set model claude-sonnet-4.5
|
|
||||||
|
|
||||||
# 3. Test
|
|
||||||
hermes --version
|
|
||||||
hermes chat "Ahoj, kdo jsi?"
|
|
||||||
|
|
||||||
# 4. Přidání Fish aliasu (volitelně)
|
|
||||||
hermes config alias
|
|
||||||
```
|
|
||||||
|
|
||||||
## ⚙️ Konfigurace
|
|
||||||
|
|
||||||
`hermes-config.example.yml` obsahuje:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# API provider
|
|
||||||
provider: anthropic
|
|
||||||
model: claude-sonnet-4.5
|
|
||||||
api_key: ${HERMES_API_KEY}
|
|
||||||
|
|
||||||
# Pracovní adresáře
|
|
||||||
workspace: ~/Skripty
|
|
||||||
memory_dir: ~/.hermes/memory
|
|
||||||
|
|
||||||
# Sandbox: povolené příkazy
|
|
||||||
sandbox:
|
|
||||||
allow:
|
|
||||||
- "ls"
|
|
||||||
- "cat"
|
|
||||||
- "git"
|
|
||||||
- "docker"
|
|
||||||
- "kubectl"
|
|
||||||
deny:
|
|
||||||
- "rm -rf /"
|
|
||||||
- "dd if="
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Sandbox** – Hermes ve výchozím stavu **nesmaže** `rm -rf /` ani podobné destruktivní příkazy
|
|
||||||
- **API klíč** – ulož do **macOS keychainu**, ne do konfiguráku
|
|
||||||
- **Audit log** – `hermes log show` ukáže historii příkazů
|
|
||||||
- **Permissions** – nastav na minimum potřebné
|
|
||||||
|
|
||||||
## 🧠 Memory a kontext
|
|
||||||
|
|
||||||
Hermes si pamatuje:
|
|
||||||
|
|
||||||
- Tvoje preference a workflow
|
|
||||||
- Kontext projektů (~/Skripty, ~/git-repos, …)
|
|
||||||
- Dřívější konverzace
|
|
||||||
|
|
||||||
Reset:
|
|
||||||
```bash
|
|
||||||
hermes memory reset
|
|
||||||
hermes memory show
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔌 Integrace
|
|
||||||
|
|
||||||
- **Gitea** – push/pull, správa issues
|
|
||||||
- **Docker** – compose, logs, restart
|
|
||||||
- **Git** – všechny git operace
|
|
||||||
- **Fish shell** – aliasy
|
|
||||||
- **macOS** – clipboard, notifications
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Hermes docs](https://hermes-agent.nousresearch.com/docs)
|
|
||||||
- [Hermes GitHub](https://github.com/NousResearch/hermes-agent)
|
|
||||||
|
|
||||||
## 🆘 Support
|
|
||||||
|
|
||||||
- **Issues:** [github.com/NousResearch/hermes-agent/issues](https://github.com/NousResearch/hermes-agent/issues)
|
|
||||||
- **Discord:** [discord.gg/hermes](https://discord.gg/hermes)
|
|
||||||
- **Email:** support@hermes-agent.dev
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Konfigurace Hermes Agent
|
|
||||||
# - nastaví API klíč (z keychainu)
|
|
||||||
# - vytvoří výchozí ~/.config/hermes/config.yml
|
|
||||||
# - nastaví pracovní adresáře
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
HERMES_CONFIG_DIR="$HOME/.config/hermes"
|
|
||||||
HERMES_CONFIG="$HERMES_CONFIG_DIR/config.yml"
|
|
||||||
HERMES_MEMORY="$HOME/.hermes/memory"
|
|
||||||
|
|
||||||
# API klíč z keychainu
|
|
||||||
echo "▶ Hledám API klíč v keychainu (služba: hermes:api)..."
|
|
||||||
API_KEY=$(security find-generic-password -s "hermes:api" -a "user" -w 2>/dev/null || true)
|
|
||||||
|
|
||||||
if [[ -z "$API_KEY" ]]; then
|
|
||||||
echo "⚠ API klíč není v keychainu."
|
|
||||||
read -rp "Vlož API klíč (nebo Enter pro přeskočení): " API_KEY
|
|
||||||
if [[ -n "$API_KEY" ]]; then
|
|
||||||
security add-generic-password -s "hermes:api" -a "user" -w "$API_KEY" -U
|
|
||||||
echo "✓ API klíč uložen do keychainu"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Vytvoř config adresář
|
|
||||||
mkdir -p "$HERMES_CONFIG_DIR" "$HERMES_MEMORY"
|
|
||||||
|
|
||||||
# Výchozí config
|
|
||||||
cat > "$HERMES_CONFIG" <<EOF
|
|
||||||
# Hermes configuration
|
|
||||||
# Generováno configure-hermes.sh – $(date +%Y-%m-%d)
|
|
||||||
|
|
||||||
provider: anthropic
|
|
||||||
model: claude-sonnet-4.5
|
|
||||||
api_key: \${HERMES_API_KEY} # čte z env, fallback: security find-generic-password
|
|
||||||
|
|
||||||
# Pracovní adresáře
|
|
||||||
workspace: ~/Skripty
|
|
||||||
memory_dir: $HERMES_MEMORY
|
|
||||||
|
|
||||||
# Sandbox
|
|
||||||
sandbox:
|
|
||||||
enabled: true
|
|
||||||
allow:
|
|
||||||
- "ls"
|
|
||||||
- "cat"
|
|
||||||
- "grep"
|
|
||||||
- "find"
|
|
||||||
- "git"
|
|
||||||
- "docker"
|
|
||||||
- "docker compose"
|
|
||||||
- "kubectl"
|
|
||||||
- "ssh"
|
|
||||||
- "scp"
|
|
||||||
- "rsync"
|
|
||||||
- "curl"
|
|
||||||
- "jq"
|
|
||||||
deny:
|
|
||||||
- "rm -rf /"
|
|
||||||
- "rm -rf /*"
|
|
||||||
- "dd if="
|
|
||||||
- "mkfs"
|
|
||||||
- ":(){:|:&};:"
|
|
||||||
|
|
||||||
# Integrace
|
|
||||||
integrations:
|
|
||||||
gitea:
|
|
||||||
url: http://192.168.0.148:3000
|
|
||||||
token_name: hermes:api:192.168.0.148
|
|
||||||
docker:
|
|
||||||
socket: /var/run/docker.sock
|
|
||||||
git:
|
|
||||||
user_name: "Hermes Agent"
|
|
||||||
user_email: "hermes@localhost"
|
|
||||||
|
|
||||||
# Output
|
|
||||||
output:
|
|
||||||
format: markdown
|
|
||||||
streaming: true
|
|
||||||
language: cs
|
|
||||||
|
|
||||||
# UI
|
|
||||||
ui:
|
|
||||||
theme: dark
|
|
||||||
icons: emoji
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Environment v shellu
|
|
||||||
SHELL_RC="$HOME/.zshrc"
|
|
||||||
if ! grep -q "HERMES_API_KEY" "$SHELL_RC" 2>/dev/null; then
|
|
||||||
cat >> "$SHELL_RC" <<'EOF'
|
|
||||||
|
|
||||||
# Hermes Agent API key (načítá z keychainu)
|
|
||||||
export HERMES_API_KEY=$(security find-generic-password -s "hermes:api" -a "user" -w 2>/dev/null)
|
|
||||||
EOF
|
|
||||||
echo "✓ ~/.zshrc aktualizován"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Fish varianta
|
|
||||||
FISH_CONFIG="$HOME/.config/fish/config.fish"
|
|
||||||
if [[ -f "$FISH_CONFIG" ]] && ! grep -q "HERMES_API_KEY" "$FISH_CONFIG" 2>/dev/null; then
|
|
||||||
cat >> "$FISH_CONFIG" <<'EOF'
|
|
||||||
|
|
||||||
# Hermes Agent API key
|
|
||||||
set -gx HERMES_API_KEY (security find-generic-password -s "hermes:api" -a "user" -w 2>/dev/null)
|
|
||||||
EOF
|
|
||||||
echo "✓ Fish config aktualizován"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "🎉 Hermes nakonfigurován!"
|
|
||||||
echo
|
|
||||||
echo "Test: hermes chat \"Ahoj\""
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
# Hermes Agent – ukázková konfigurace
|
|
||||||
# Zkopíruj na ~/.config/hermes/config.yml a doplň
|
|
||||||
|
|
||||||
# AI provider a model
|
|
||||||
provider: anthropic
|
|
||||||
model: claude-sonnet-4.5
|
|
||||||
api_key: ${HERMES_API_KEY}
|
|
||||||
|
|
||||||
# Pracovní adresáře
|
|
||||||
workspace: ~/Skripty
|
|
||||||
memory_dir: ~/.hermes/memory
|
|
||||||
projects_dir: ~/git-repos
|
|
||||||
|
|
||||||
# Sandbox – bezpečnostní omezení
|
|
||||||
sandbox:
|
|
||||||
enabled: true
|
|
||||||
allow:
|
|
||||||
- "ls"
|
|
||||||
- "cat"
|
|
||||||
- "grep"
|
|
||||||
- "find"
|
|
||||||
- "git"
|
|
||||||
- "docker"
|
|
||||||
- "docker compose"
|
|
||||||
- "kubectl"
|
|
||||||
- "ssh"
|
|
||||||
- "scp"
|
|
||||||
- "rsync"
|
|
||||||
- "curl"
|
|
||||||
- "jq"
|
|
||||||
deny:
|
|
||||||
- "rm -rf /"
|
|
||||||
- "rm -rf /*"
|
|
||||||
- "dd if="
|
|
||||||
- "mkfs"
|
|
||||||
|
|
||||||
# Integrace s existujícími službami
|
|
||||||
integrations:
|
|
||||||
gitea:
|
|
||||||
url: http://CHANGE_ME:3000
|
|
||||||
token_name: "gitea:api:CHANGE_ME"
|
|
||||||
docker:
|
|
||||||
socket: /var/run/docker.sock
|
|
||||||
ssh:
|
|
||||||
default_user: deploy
|
|
||||||
default_key: ~/.ssh/id_ed25519
|
|
||||||
|
|
||||||
# Výstup
|
|
||||||
output:
|
|
||||||
format: markdown
|
|
||||||
streaming: true
|
|
||||||
language: cs
|
|
||||||
color: true
|
|
||||||
|
|
||||||
# UI
|
|
||||||
ui:
|
|
||||||
theme: dark
|
|
||||||
icons: emoji
|
|
||||||
spinner: dots
|
|
||||||
|
|
||||||
# Bezpečnost
|
|
||||||
security:
|
|
||||||
audit_log: true
|
|
||||||
require_approval_for:
|
|
||||||
- "rm"
|
|
||||||
- "docker system prune"
|
|
||||||
- "kubectl delete"
|
|
||||||
- "git push --force"
|
|
||||||
api_key_storage: keychain # macOS keychain
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Instalace Hermes Agent na macOS
|
|
||||||
# - vyžaduje Homebrew a Fish shell
|
|
||||||
# - nainstaluje Hermes CLI
|
|
||||||
# - přidá aliasy do Fish
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if [[ "$(uname)" != "Darwin" ]]; then
|
|
||||||
echo "Tento skript je pouze pro macOS" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Kontrola Homebrew
|
|
||||||
if ! command -v brew &>/dev/null; then
|
|
||||||
echo "▶ Instaluji Homebrew..."
|
|
||||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Kontrola Fish
|
|
||||||
if ! command -v fish &>/dev/null; then
|
|
||||||
echo "▶ Instaluji Fish..."
|
|
||||||
brew install fish
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Instalace Hermes (přes pip)
|
|
||||||
echo "▶ Instaluji Hermes přes pip..."
|
|
||||||
python3 -m pip install --user hermes-agent
|
|
||||||
|
|
||||||
# Přidání do PATH (pokud není)
|
|
||||||
PIP_BIN="$HOME/Library/Python/3.9/bin"
|
|
||||||
if [[ -d "$PIP_BIN" ]] && [[ ":$PATH:" != *":$PIP_BIN:"* ]]; then
|
|
||||||
cat >> ~/.zshrc <<EOF
|
|
||||||
export PATH="\$HOME/Library/Python/3.9/bin:\$PATH"
|
|
||||||
EOF
|
|
||||||
export PATH="$PIP_BIN:$PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ověření
|
|
||||||
if command -v hermes &>/dev/null; then
|
|
||||||
echo "✓ Hermes nainstalován: $(hermes --version)"
|
|
||||||
else
|
|
||||||
echo "⚠ Hermes není v PATH. Přidej ručně: export PATH=\"\$HOME/Library/Python/3.9/bin:\$PATH\""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Fish alias
|
|
||||||
FISH_CONFIG="$HOME/.config/fish/config.fish"
|
|
||||||
mkdir -p "$(dirname "$FISH_CONFIG")"
|
|
||||||
if ! grep -q "alias hermes=" "$FISH_CONFIG" 2>/dev/null; then
|
|
||||||
cat >> "$FISH_CONFIG" <<'EOF'
|
|
||||||
|
|
||||||
# Hermes Agent
|
|
||||||
alias h='hermes'
|
|
||||||
alias hchat='hermes chat'
|
|
||||||
alias hgit='hermes git'
|
|
||||||
alias hd='hermes docker'
|
|
||||||
EOF
|
|
||||||
echo "✓ Fish aliasy přidány"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "🎉 Hotovo! Nastav API klíč:"
|
|
||||||
echo " security add-generic-password -s hermes:api -a user -w <klíč> -U"
|
|
||||||
echo " hermes config set api-key <klíč>"
|
|
||||||
@@ -1,171 +0,0 @@
|
|||||||
# 🗂 home-nas-tools
|
|
||||||
|
|
||||||
> Rejstřík projektů uložených na **NAS**. Tento adresář obsahuje **pouze metadata** –
|
|
||||||
> samotné archivy zůstávají na NAS, do Gitea se **nekopírují**.
|
|
||||||
|
|
||||||
## 🎯 Účel
|
|
||||||
|
|
||||||
- ✅ **Orientace** – vědět co kde je
|
|
||||||
- ✅ **Replikace** – snadné znovuvytvoření na novém stroji
|
|
||||||
- ✅ **Dokumentace** – co archiv obsahuje, jak ho rozbalit, jak nasadit
|
|
||||||
|
|
||||||
## 📍 Cesta k archivům (NAS)
|
|
||||||
|
|
||||||
Všechny archivy jsou uloženy na:
|
|
||||||
|
|
||||||
```
|
|
||||||
/Volumes/Backups/Prace/moje-tools/
|
|
||||||
```
|
|
||||||
|
|
||||||
Tato cesta je **specifická pro tvůj Mac** s připojeným NAS (SMB).
|
|
||||||
Na novém stroji musíš **připojit NAS** (`/Volumes/Backups/...`) nebo
|
|
||||||
**zkopírovat archivy ručně** (např. přes `scp`, USB disk, cloud).
|
|
||||||
|
|
||||||
## 📚 Rejstřík projektů
|
|
||||||
|
|
||||||
> **Názvy projektů** v tomto README jsou **zobecněné popisy** – konkrétní názvy
|
|
||||||
> archivů a popis obsahu zůstávají pouze v NAS. Pokud chceš znát detail, otevři
|
|
||||||
> si `archive-index.md` (gitignored, lokální soubor na tvém Macu) nebo přímo NAS.
|
|
||||||
|
|
||||||
### 🔐 Bezpečnost a utility
|
|
||||||
|
|
||||||
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `web-aplikace` | `web-aplikace.txt` | ~135 B | Poznámky k web nástrojům (OSINT) |
|
|
||||||
| `backup-bitcopy` | `bitcopy-backup-*.tar.gz` | ~9 KB | Bit-perfect zálohovací nástroj (shell) |
|
|
||||||
| `whois-util` | `whois.zip` | ~3 KB | Whois lookup utilita |
|
|
||||||
|
|
||||||
### 🕵️ Forenzika a bezpečnostní analýza
|
|
||||||
|
|
||||||
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `forensic-asistent-1` | `Digitalní*asistent*.zip` | ~9 MB | Asistent pro forenzní výslechy |
|
|
||||||
| `forensic-pipeline` | `forensic-pipeline.zip` | ~53 MB | Forenzní pipeline (zpracování důkazů) |
|
|
||||||
| `gesture-to-pin` | `gesto*pin.zip` | ~54 KB | Web app: gesture → PIN |
|
|
||||||
| `wireless-auditor` | `aircrack-ng.zip` | ~29 MB | Kompilace wireless auditu |
|
|
||||||
| `network-mapper` | `network-topology-mapper.zip` | ~1.2 MB | Mapper síťové topologie |
|
|
||||||
| `rpi4-scanner` | `zaloha-rpi4-*.zip` | ~3 MB | Raspberry Pi 4 scanner |
|
|
||||||
|
|
||||||
### 📄 Konverze dokumentů
|
|
||||||
|
|
||||||
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `json2xml` | `jonson2xml.zip` | ~43 MB | JSON ↔ XML konverze |
|
|
||||||
| `json2xml-batch` | `prevod-json-souboru-do-xml.zip` | ~4 KB | Batch konverze |
|
|
||||||
| `xml-sms-parser` | `prevod-xml-sms-zalohy.zip` | ~16 KB | SMS XML parser |
|
|
||||||
| `ocr2txt` | `ocr2txt.zip` | ~7 KB | OCR extrakce textu |
|
|
||||||
| `ocr2txt-v2` | `ocr2txt-*.zip` | ~31 MB | OCR v2 |
|
|
||||||
| `forensic-helper` | `programAmateriX.zip` | ~47 KB | Forenzní pomůcka |
|
|
||||||
|
|
||||||
### 📧 E-maily
|
|
||||||
|
|
||||||
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `eml-comparator` | `provnani-eml-slozek.zip` | ~12 MB | Porovnání EML složek |
|
|
||||||
|
|
||||||
### 💻 Hardware a utility
|
|
||||||
|
|
||||||
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `usb-share` | `usb-share.zip` | ~7 KB | USB share utilita |
|
|
||||||
| `unique-pw` | `unik-hesel.zip` | ~1 KB | Unique passwords utilita |
|
|
||||||
| `foto-dokumentace` | `_skript-na-fotodokumentaci.zip` | ~154 KB | Skript pro fotodokumentaci |
|
|
||||||
|
|
||||||
### 🤖 AI / Asistenti (velké archivy)
|
|
||||||
|
|
||||||
| Projekt | Archiv (pouze NAS) | Velikost | Účel |
|
|
||||||
|---|---|---|---|
|
|
||||||
| `ai-asistent-docker` | `AI_Prepis-docker-*.7z` | ~1.3 GB | AI asistent – Docker verze |
|
|
||||||
| `ai-asistent-portable` | `AI_Prepis-portable-*.zip` | ~14 GB | AI asistent – Portable |
|
|
||||||
| `ai-asistent-final` | `AI_Prepis-portable-FINAL*.zip` | ~3 GB | AI asistent – finální verze |
|
|
||||||
| `prace-kolekce` | `_prace-programy.zip` | ~1.2 GB | Pracovní programy (kolekce) |
|
|
||||||
|
|
||||||
## 📊 Statistiky (přibližné)
|
|
||||||
|
|
||||||
| Kategorie | Počet | Celková velikost |
|
|
||||||
|---|---|---|
|
|
||||||
| Bezpečnost a utility | 3 | ~12 KB |
|
|
||||||
| Forenzika | 6 | ~4 GB |
|
|
||||||
| Konverze dokumentů | 6 | ~94 MB |
|
|
||||||
| E-maily | 1 | ~12 MB |
|
|
||||||
| Hardware | 3 | ~4 MB |
|
|
||||||
| AI / Asistenti | 4 | ~19 GB |
|
|
||||||
| **Celkem** | **23** | **~23 GB** |
|
|
||||||
|
|
||||||
## 🗂 Struktura adresáře
|
|
||||||
|
|
||||||
```
|
|
||||||
home-nas-tools/
|
|
||||||
├── README.md # Tento soubor (zobecněný)
|
|
||||||
└── archive-index.md # GITIGNORED – lokální index s konkrétními názvy
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔄 Jak znovuvytvořit na novém stroji
|
|
||||||
|
|
||||||
### 1. Připoj NAS
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# macOS
|
|
||||||
mount -t smbfs //user@nas/Backups/Prace /Volumes/nas-tools
|
|
||||||
|
|
||||||
# Nebo zkopíruj archivy přes rsync/scp
|
|
||||||
rsync -av user@nas:/Backups/Prace/moje-tools/ /Users/Shared/nas-tools/
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Rozbal archiv
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /Users/Shared/nas-tools
|
|
||||||
tar -xzf bitcopy-backup-*.tar.gz
|
|
||||||
unzip 'gesto*pin.zip'
|
|
||||||
unzip -P <password> zaloha-rpi4-*.zip
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Nasaď podle README
|
|
||||||
|
|
||||||
Každý projekt má v NAS vlastní README s konkrétním postupem instalace.
|
|
||||||
|
|
||||||
## ⚠️ Bezpečnost
|
|
||||||
|
|
||||||
- **Archivy obsahují citlivá data** (forenzní dumpy, uniklá hesla, interní utility)
|
|
||||||
- **NEVER pushuj archivy do Gitea** – vždy zůstávají na NAS
|
|
||||||
- **Některé archivy jsou šifrované** – chraň hesla v keychainu
|
|
||||||
- **Nesdílej tento adresář** na veřejných platformách bez kontroly
|
|
||||||
- **Pro prezentaci kolegům** použij **jinou verzi** tohoto README (bez konkrétních odkazů)
|
|
||||||
|
|
||||||
## 🔐 Doporučené zálohovací schéma
|
|
||||||
|
|
||||||
```
|
|
||||||
┌──────────────────────┐
|
|
||||||
│ Mac (~/Skripty/) │ ← Pracovní kopie
|
|
||||||
└──────────┬───────────┘
|
|
||||||
│ rsync (denně)
|
|
||||||
▼
|
|
||||||
┌──────────────────────┐
|
|
||||||
│ NAS (moje-tools/) │ ← Centrální záloha
|
|
||||||
└──────────┬───────────┘
|
|
||||||
│ off-site backup
|
|
||||||
▼
|
|
||||||
┌──────────────────────┐
|
|
||||||
│ Cloud (S3/Backblaze)│ ← Disaster recovery
|
|
||||||
└──────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📝 Pro vlastní potřebu (lokální, ne v gitu)
|
|
||||||
|
|
||||||
Vytvoř si lokálně soubor `archive-index.md` s **konkrétními** názvy archivů a jejich obsahem:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Vytvoř si lokální soukromý index
|
|
||||||
cat > ~/git-repos/mates/home-nas-tools/.archive-index.md << 'EOF'
|
|
||||||
# Soukromý index – NEVER commit
|
|
||||||
# Konkrétní názvy archivů na NAS
|
|
||||||
|
|
||||||
| Archiv | Cesta k souboru | MD5 | Poznámka |
|
|
||||||
|---|---|---|---|
|
|
||||||
| ai-asistent-docker | /Volumes/Backups/Prace/moje-tools/AI_Prepis-docker-verze.7z | abc123 | ... |
|
|
||||||
...
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Tento soubor je v .gitignore, takže zůstane jen u tebe
|
|
||||||
```
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# 📥 Install Scripts
|
|
||||||
|
|
||||||
> Bash skripty pro nasazení nového Ubuntu serveru (22.04 / 24.04 LTS).
|
|
||||||
> Idempotentní, s `--help` a dry-run.
|
|
||||||
|
|
||||||
## 📚 Skripty
|
|
||||||
|
|
||||||
| Skript | Účel |
|
|
||||||
|---|---|
|
|
||||||
| [`bootstrap-ubuntu-server.sh`](bootstrap-ubuntu-server.sh) | Úvodní setup: aktualizace, uživatel, SSH, firewall, fail2ban |
|
|
||||||
| [`install-docker.sh`](install-docker.sh) | Docker + Docker Compose plugin |
|
|
||||||
| [`install-portainer.sh`](install-portainer.sh) | Portainer CE |
|
|
||||||
| [`install-nginx-proxy.sh`](install-nginx-proxy.sh) | Nginx Proxy Manager (s HTTPS) |
|
|
||||||
| [`backup-all.sh`](backup-all.sh) | Záloha všech Docker dat na NAS |
|
|
||||||
| [`restore-all.sh`](restore-all.sh) | Obnova z NAS zálohy |
|
|
||||||
|
|
||||||
## 🚀 Quickstart (nový server)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Bootstrap (úvodní nastavení)
|
|
||||||
sudo bash bootstrap-ubuntu-server.sh
|
|
||||||
|
|
||||||
# 2. Docker
|
|
||||||
sudo bash install-docker.sh
|
|
||||||
|
|
||||||
# 3. Portainer
|
|
||||||
sudo bash install-portainer.sh
|
|
||||||
|
|
||||||
# 4. NPM (reverzní proxy)
|
|
||||||
sudo bash install-nginx-proxy.sh
|
|
||||||
|
|
||||||
# 5. Přidej služby
|
|
||||||
cd ~/docker-services/portainer
|
|
||||||
cp .env.example .env && nano .env
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
## ⚙️ Společné konvence
|
|
||||||
|
|
||||||
- Všechny skripty podporují `--help`
|
|
||||||
- `set -euo pipefail` (fail-fast)
|
|
||||||
- Idempotentní (můžeš spustit víckrát)
|
|
||||||
- Logy do `/var/log/<skript>.log`
|
|
||||||
- Barvy v terminále (ANSI), automaticky se vypnou v non-TTY
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **Nikdy nespouštěj skript, který nečteš** – `less <skript>` předem
|
|
||||||
- **Všechny skripty chtějí root** – kontrolují `$EUID`
|
|
||||||
- **Všechny skripty** podporují dry-run, kde to dává smysl
|
|
||||||
- **Bez hesel v skriptech** – vše z `prompt` nebo `.env`
|
|
||||||
|
|
||||||
## 📁 Struktura
|
|
||||||
|
|
||||||
```
|
|
||||||
install-scripts/
|
|
||||||
├── README.md
|
|
||||||
├── bootstrap-ubuntu-server.sh
|
|
||||||
├── install-docker.sh
|
|
||||||
├── install-portainer.sh
|
|
||||||
├── install-nginx-proxy.sh
|
|
||||||
├── backup-all.sh
|
|
||||||
├── restore-all.sh
|
|
||||||
└── lib/ # Společné knihovny
|
|
||||||
└── common.sh
|
|
||||||
```
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Záloha všech Docker dat na NAS
|
|
||||||
# - najde všechny kontejnery s volume mounty v /home/<user>/docker
|
|
||||||
# - zastaví je (volitelně), zabalí data do tar.gz, pošle na NAS
|
|
||||||
# - ponechá běžící kontejnery běžet (default)
|
|
||||||
#
|
|
||||||
# Použití:
|
|
||||||
# sudo bash backup-all.sh # zálohuj vše (bez zastavení)
|
|
||||||
# sudo bash backup-all.sh --stop # zastav před zálohou
|
|
||||||
# sudo bash backup-all.sh --dry-run # pouze ukaž co by se dělalo
|
|
||||||
# sudo bash backup-all.sh --only portainer # jen jednu službu
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
DEPLOY_USER="${DEPLOY_USER:-deploy}"
|
|
||||||
DOCKER_HOME="/home/$DEPLOY_USER/docker"
|
|
||||||
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Backups}"
|
|
||||||
BACKUP_ROOT="$NAS_MOUNT/Prace/server-backups/$(hostname)"
|
|
||||||
TS="$(date +%Y%m%d-%H%M%S)"
|
|
||||||
|
|
||||||
STOP=false
|
|
||||||
DRY_RUN=false
|
|
||||||
ONLY=""
|
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case $1 in
|
|
||||||
--stop) STOP=true; shift ;;
|
|
||||||
--dry-run) DRY_RUN=true; shift ;;
|
|
||||||
--only) ONLY="$2"; shift 2 ;;
|
|
||||||
*) echo "Neznámý parametr: $1" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
|
|
||||||
[[ -d "$DOCKER_HOME" ]] || { echo "Adresář $DOCKER_HOME neexistuje" >&2; exit 1; }
|
|
||||||
|
|
||||||
run() {
|
|
||||||
if $DRY_RUN; then
|
|
||||||
echo "[DRY-RUN] $*"
|
|
||||||
else
|
|
||||||
echo "▶ $*"
|
|
||||||
"$@"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
mkdir -p "$BACKUP_ROOT"
|
|
||||||
|
|
||||||
for SERVICE_DIR in "$DOCKER_HOME"/*/; do
|
|
||||||
SERVICE=$(basename "$SERVICE_DIR")
|
|
||||||
[[ -n "$ONLY" && "$SERVICE" != "$ONLY" ]] && continue
|
|
||||||
[[ -f "$SERVICE_DIR/docker-compose.yml" ]] || continue
|
|
||||||
|
|
||||||
BACKUP_DIR="$BACKUP_ROOT/$SERVICE"
|
|
||||||
BACKUP_FILE="$BACKUP_DIR/${SERVICE}-$TS.tar.zst"
|
|
||||||
|
|
||||||
if $STOP; then
|
|
||||||
run docker compose -f "$SERVICE_DIR/docker-compose.yml" stop
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -d "$SERVICE_DIR/data" ]]; then
|
|
||||||
run mkdir -p "$BACKUP_DIR"
|
|
||||||
run tar --zstd -cf "$BACKUP_FILE" -C "$SERVICE_DIR" data
|
|
||||||
echo "✓ $SERVICE: $BACKUP_FILE"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if $STOP; then
|
|
||||||
run docker compose -f "$SERVICE_DIR/docker-compose.yml" start
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "🎯 Hotovo. Zálohy v: $BACKUP_ROOT"
|
|
||||||
@@ -1,178 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Bootstrap Ubuntu Server (22.04/24.04 LTS)
|
|
||||||
# - aktualizace systému
|
|
||||||
# - vytvoření deploy uživatele (UID 1000)
|
|
||||||
# - základní SSH hardening
|
|
||||||
# - UFW firewall
|
|
||||||
# - fail2ban
|
|
||||||
# - základní utility (curl, wget, git, vim, …)
|
|
||||||
#
|
|
||||||
# Idempotentní – můžeš spustit víckrát.
|
|
||||||
#
|
|
||||||
# Použití:
|
|
||||||
# sudo bash bootstrap-ubuntu-server.sh
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Barvy
|
|
||||||
readonly RED=$'\033[0;31m'
|
|
||||||
readonly GREEN=$'\033[0;32m'
|
|
||||||
readonly YELLOW=$'\033[1;33m'
|
|
||||||
readonly BLUE=$'\033[0;34m'
|
|
||||||
readonly NC=$'\033[0m'
|
|
||||||
|
|
||||||
log() { echo -e "${BLUE}[$(date +%H:%M:%S)]${NC} $*"; }
|
|
||||||
ok() { echo -e "${GREEN}✓${NC} $*"; }
|
|
||||||
warn() { echo -e "${YELLOW}⚠${NC} $*" >&2; }
|
|
||||||
err() { echo -e "${RED}✗${NC} $*" >&2; exit 1; }
|
|
||||||
|
|
||||||
[[ $EUID -eq 0 ]] || err "Tento skript musí běžet jako root (sudo)."
|
|
||||||
|
|
||||||
DEPLOY_USER="${DEPLOY_USER:-deploy}"
|
|
||||||
DEPLOY_UID="${DEPLOY_UID:-1000}"
|
|
||||||
SSH_PORT="${SSH_PORT:-22}"
|
|
||||||
TIMEZONE="${TIMEZONE:-Europe/Prague}"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 1. Aktualizace systému
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
log "Aktualizace systému..."
|
|
||||||
apt-get update -qq
|
|
||||||
apt-get upgrade -y -qq
|
|
||||||
apt-get dist-upgrade -y -qq
|
|
||||||
apt-get autoremove -y -qq
|
|
||||||
ok "Systém aktualizován"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 2. Základní utility
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
log "Instalace základních utilit..."
|
|
||||||
apt-get install -y -qq \
|
|
||||||
curl wget git vim nano htop \
|
|
||||||
ca-certificates gnupg lsb-release \
|
|
||||||
software-properties-common apt-transport-https \
|
|
||||||
ufw fail2ban \
|
|
||||||
bash-completion
|
|
||||||
ok "Utility nainstalovány"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 3. Timezone
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
log "Nastavuji timezone: $TIMEZONE"
|
|
||||||
timedatectl set-timezone "$TIMEZONE"
|
|
||||||
ok "Timezone: $(timedatectl show -p Timezone --value)"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 4. Deploy uživatel (UID 1000)
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
if id "$DEPLOY_USER" &>/dev/null; then
|
|
||||||
ok "Uživatel $DEPLOY_USER existuje"
|
|
||||||
else
|
|
||||||
log "Vytvářím uživatele $DEPLOY_USER (UID $DEPLOY_UID)..."
|
|
||||||
adduser --uid "$DEPLOY_UID" --gecos "" --disabled-password --shell /bin/bash "$DEPLOY_USER"
|
|
||||||
passwd -d "$DEPLOY_USER" # bez hesla (key-based auth)
|
|
||||||
mkdir -p /home/"$DEPLOY_USER"/.ssh
|
|
||||||
chmod 700 /home/"$DEPLOY_USER"/.ssh
|
|
||||||
# Přidání authorized_keys během deploymentu – zde necháme prázdné
|
|
||||||
touch /home/"$DEPLOY_USER"/.ssh/authorized_keys
|
|
||||||
chmod 600 /home/"$DEPLOY_USER"/.ssh/authorized_keys
|
|
||||||
chown -R "$DEPLOY_USER":"$DEPLOY_USER" /home/"$DEPLOY_USER"/.ssh
|
|
||||||
ok "Uživatel $DEPLOY_USER vytvořen"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Přidání do sudo bez hesla (volitelné, bezpečnostní)
|
|
||||||
if ! grep -q "^$DEPLOY_USER.*NOPASSWD" /etc/sudoers.d/"$DEPLOY_USER" 2>/dev/null; then
|
|
||||||
echo "$DEPLOY_USER ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/"$DEPLOY_USER"
|
|
||||||
chmod 440 /etc/sudoers.d/"$DEPLOY_USER"
|
|
||||||
ok "$DEPLOY_USER přidán do sudoers (NOPASSWD)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 5. SSH hardening
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
log "SSH hardening..."
|
|
||||||
SSHD_CONFIG="/etc/ssh/sshd_config"
|
|
||||||
cp "$SSHD_CONFIG" "$SSHD_CONFIG.bak.$(date +%Y%m%d)" 2>/dev/null || true
|
|
||||||
|
|
||||||
# Nastavit port
|
|
||||||
sed -i "s/^#\?Port .*/Port $SSH_PORT/" "$SSHD_CONFIG"
|
|
||||||
# Zakázat root login
|
|
||||||
sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' "$SSHD_CONFIG"
|
|
||||||
# Zakázat password auth (jen klíče)
|
|
||||||
sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' "$SSHD_CONFIG"
|
|
||||||
# X11 forwarding vypnout
|
|
||||||
sed -i 's/^#\?X11Forwarding .*/X11Forwarding no/' "$SSHD_CONFIG"
|
|
||||||
# ClientAliveInterval
|
|
||||||
sed -i 's/^#\?ClientAliveInterval .*/ClientAliveInterval 300/' "$SSHD_CONFIG"
|
|
||||||
sed -i 's/^#\?ClientAliveCountMax .*/ClientAliveCountMax 2/' "$SSHD_CONFIG"
|
|
||||||
|
|
||||||
# Validace configu
|
|
||||||
sshd -t && systemctl restart ssh
|
|
||||||
ok "SSH nakonfigurován (port $SSH_PORT, root login zakázán)"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 6. UFW firewall
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
log "Konfigurace UFW..."
|
|
||||||
ufw --force reset
|
|
||||||
ufw default deny incoming
|
|
||||||
ufw default allow outgoing
|
|
||||||
ufw allow "$SSH_PORT"/tcp comment "SSH"
|
|
||||||
# Služby (zakomentuj co nepoužíváš)
|
|
||||||
ufw allow 80/tcp comment "HTTP"
|
|
||||||
ufw allow 443/tcp comment "HTTPS"
|
|
||||||
# Docker swarm (volitelně)
|
|
||||||
# ufw allow 2377/tcp comment "Docker swarm"
|
|
||||||
# ufw allow 7946/tcp comment "Docker swarm gossip"
|
|
||||||
# ufw allow 7946/udp comment "Docker swarm gossip"
|
|
||||||
# ufw allow 4789/udp comment "Docker overlay"
|
|
||||||
# SSH z home (volitelně)
|
|
||||||
# ufw allow from 192.168.0.0/24 to any port $SSH_PORT proto tcp
|
|
||||||
|
|
||||||
ufw --force enable
|
|
||||||
ok "UFW aktivní, SSH povoleno"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 7. Fail2ban
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
log "Konfigurace fail2ban..."
|
|
||||||
cat > /etc/fail2ban/jail.local <<EOF
|
|
||||||
[DEFAULT]
|
|
||||||
bantime = 1h
|
|
||||||
findtime = 10m
|
|
||||||
maxretry = 5
|
|
||||||
|
|
||||||
[sshd]
|
|
||||||
enabled = true
|
|
||||||
port = $SSH_PORT
|
|
||||||
filter = sshd
|
|
||||||
logpath = /var/log/auth.log
|
|
||||||
maxretry = 3
|
|
||||||
EOF
|
|
||||||
systemctl enable --now fail2ban
|
|
||||||
systemctl restart fail2ban
|
|
||||||
ok "Fail2ban aktivní"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# 8. Čas a DNS
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
log "Konfigurace timesyncd..."
|
|
||||||
apt-get install -y -qq systemd-timesyncd
|
|
||||||
sed -i 's/^#NTP=.*/NTP=0.pool.ntp.org 1.pool.ntp.org/' /etc/systemd/timesyncd.conf
|
|
||||||
systemctl restart systemd-timesyncd
|
|
||||||
ok "Time sync aktivní"
|
|
||||||
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
# Hotovo
|
|
||||||
# ────────────────────────────────────────────────────────
|
|
||||||
echo
|
|
||||||
ok "Bootstrap dokončen!"
|
|
||||||
echo
|
|
||||||
echo "📋 Další kroky:"
|
|
||||||
echo " 1. sudo bash install-docker.sh"
|
|
||||||
echo " 2. sudo bash install-portainer.sh"
|
|
||||||
echo " 3. sudo bash install-nginx-proxy.sh"
|
|
||||||
echo " 4. Přidej svůj SSH klíč: sudo -u $DEPLOY_USER bash -c 'echo \"<tvuj-klic>\" >> ~/.ssh/authorized_keys'"
|
|
||||||
echo
|
|
||||||
echo "⚠️ Před odhlášením se ujisti, že máš funkční SSH přístup jako $DEPLOY_USER!"
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Instalace Docker + Docker Compose plugin na Ubuntu 22.04/24.04
|
|
||||||
# - oficiální Docker repo
|
|
||||||
# - non-interactive
|
|
||||||
# - post-instalace: přidá DEPLOY_USER do docker group
|
|
||||||
#
|
|
||||||
# Idempotentní.
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
DEPLOY_USER="${DEPLOY_USER:-deploy}"
|
|
||||||
|
|
||||||
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
|
|
||||||
|
|
||||||
# 1. Příprava
|
|
||||||
apt-get update -qq
|
|
||||||
apt-get install -y -qq ca-certificates curl gnupg
|
|
||||||
|
|
||||||
# 2. Docker GPG klíč
|
|
||||||
install -m 0755 -d /etc/apt/keyrings
|
|
||||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
||||||
chmod a+r /etc/apt/keyrings/docker.gpg
|
|
||||||
|
|
||||||
# 3. Docker repo
|
|
||||||
ARCH=$(dpkg --print-architecture)
|
|
||||||
CODENAME=$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
|
|
||||||
echo "deb [arch=$ARCH signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $CODENAME stable" \
|
|
||||||
> /etc/apt/sources.list.d/docker.list
|
|
||||||
|
|
||||||
# 4. Instalace
|
|
||||||
apt-get update -qq
|
|
||||||
apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
|
||||||
|
|
||||||
# 5. Služba
|
|
||||||
systemctl enable --now docker
|
|
||||||
systemctl is-active --quiet docker && echo "✓ Docker běží"
|
|
||||||
|
|
||||||
# 6. DEPLOY_USER do docker group (bez sudo pro docker)
|
|
||||||
if id "$DEPLOY_USER" &>/dev/null; then
|
|
||||||
usermod -aG docker "$DEPLOY_USER"
|
|
||||||
echo "✓ $DEPLOY_USER přidán do docker group (odhlas se a prihlas pro efekt)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 7. Test
|
|
||||||
docker --version
|
|
||||||
docker compose version
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "🎉 Docker nainstalován!"
|
|
||||||
echo " Odhlas se a prihlas se jako $DEPLOY_USER pro práci bez sudo."
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Instalace Nginx Proxy Manager (NPM) s HTTPS
|
|
||||||
# - MariaDB backend
|
|
||||||
# - Let's Encrypt ready
|
|
||||||
# - Web UI na portu 81
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
|
|
||||||
|
|
||||||
DEPLOY_USER="${DEPLOY_USER:-deploy}"
|
|
||||||
INSTALL_DIR="/opt/nginx-proxy-manager"
|
|
||||||
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-}"
|
|
||||||
|
|
||||||
if [[ -z "$MYSQL_ROOT_PASSWORD" ]]; then
|
|
||||||
read -rsp "MySQL root heslo (pro NPM DB): " MYSQL_ROOT_PASSWORD
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -d "$INSTALL_DIR" ]]; then
|
|
||||||
echo "✓ NPM už v $INSTALL_DIR nainstalován"
|
|
||||||
else
|
|
||||||
mkdir -p "$INSTALL_DIR/data" "$INSTALL_DIR/mysql" "$INSTALL_DIR/letsencrypt"
|
|
||||||
chown -R "$DEPLOY_USER:$DEPLOY_USER" "$INSTALL_DIR"
|
|
||||||
|
|
||||||
cat > "$INSTALL_DIR/docker-compose.yml" <<EOF
|
|
||||||
services:
|
|
||||||
nginx-proxy-manager:
|
|
||||||
image: jc21/nginx-proxy-manager:latest
|
|
||||||
container_name: nginx-proxy-manager
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
- "81:81"
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
- ./letsencrypt:/etc/letsencrypt
|
|
||||||
environment:
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
- DISABLE_IPV6=true
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
|
|
||||||
db:
|
|
||||||
image: jc21/mariadb-aria:latest
|
|
||||||
container_name: npm_db
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- ./mysql:/var/lib/mysql
|
|
||||||
environment:
|
|
||||||
- MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cd "$INSTALL_DIR"
|
|
||||||
docker compose up -d
|
|
||||||
echo "✓ NPM nasazen"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "🌐 NPM Admin: http://$(hostname -I | awk '{print $1}'):81"
|
|
||||||
echo " Výchozí login: admin@example.com / changeme (ZMĚŇ!)"
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Instalace Portainer CE
|
|
||||||
# - nejdřív vyžaduje Docker (spusť install-docker.sh)
|
|
||||||
# - běží jako docker compose v /opt/portainer
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
|
|
||||||
|
|
||||||
DEPLOY_USER="${DEPLOY_USER:-deploy}"
|
|
||||||
INSTALL_DIR="/opt/portainer"
|
|
||||||
|
|
||||||
if [[ -d "$INSTALL_DIR" ]]; then
|
|
||||||
echo "✓ Portainer už v $INSTALL_DIR nainstalován"
|
|
||||||
else
|
|
||||||
mkdir -p "$INSTALL_DIR/data"
|
|
||||||
chown -R "$DEPLOY_USER:$DEPLOY_USER" "$INSTALL_DIR"
|
|
||||||
|
|
||||||
cat > "$INSTALL_DIR/docker-compose.yml" <<'EOF'
|
|
||||||
services:
|
|
||||||
portainer:
|
|
||||||
image: portainer/portainer-ce:latest
|
|
||||||
container_name: portainer
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "9000:9000"
|
|
||||||
- "9443:9443"
|
|
||||||
volumes:
|
|
||||||
- ./data:/data
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
environment:
|
|
||||||
- TZ=Europe/Prague
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cd "$INSTALL_DIR"
|
|
||||||
docker compose up -d
|
|
||||||
echo "✓ Portainer nasazen"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "🌐 Portainer: http://$(hostname -I | awk '{print $1}'):9000"
|
|
||||||
echo " První přihlášení: vytvoř admin účet"
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Obnova Docker dat z NAS zálohy
|
|
||||||
# - najde nejnovější zálohu pro danou službu
|
|
||||||
# - zastaví službu, rozbalí data, nastartuje
|
|
||||||
#
|
|
||||||
# Použití:
|
|
||||||
# sudo bash restore-all.sh # obnov vše
|
|
||||||
# sudo bash restore-all.sh --only portainer # jen portainer
|
|
||||||
# sudo bash restore-all.sh --from 20240801-120000 # konkrétní záloha
|
|
||||||
# sudo bash restore-all.sh --dry-run
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
DEPLOY_USER="${DEPLOY_USER:-deploy}"
|
|
||||||
DOCKER_HOME="/home/$DEPLOY_USER/docker"
|
|
||||||
NAS_MOUNT="${NAS_MOUNT:-/Volumes/Backups}"
|
|
||||||
BACKUP_ROOT="$NAS_MOUNT/Prace/server-backups/$(hostname)"
|
|
||||||
|
|
||||||
DRY_RUN=false
|
|
||||||
ONLY=""
|
|
||||||
FROM=""
|
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case $1 in
|
|
||||||
--only) ONLY="$2"; shift 2 ;;
|
|
||||||
--from) FROM="$2"; shift 2 ;;
|
|
||||||
--dry-run) DRY_RUN=true; shift ;;
|
|
||||||
*) echo "Neznámý parametr: $1" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
[[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; }
|
|
||||||
|
|
||||||
run() {
|
|
||||||
if $DRY_RUN; then
|
|
||||||
echo "[DRY-RUN] $*"
|
|
||||||
else
|
|
||||||
echo "▶ $*"
|
|
||||||
"$@"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
[[ -d "$BACKUP_ROOT" ]] || { echo "$BACKUP_ROOT neexistuje" >&2; exit 1; }
|
|
||||||
|
|
||||||
for SERVICE_DIR in "$DOCKER_HOME"/*/; do
|
|
||||||
SERVICE=$(basename "$SERVICE_DIR")
|
|
||||||
[[ -n "$ONLY" && "$SERVICE" != "$ONLY" ]] && continue
|
|
||||||
[[ -f "$SERVICE_DIR/docker-compose.yml" ]] || continue
|
|
||||||
|
|
||||||
if [[ -n "$FROM" ]]; then
|
|
||||||
BACKUP_FILE="$BACKUP_ROOT/$SERVICE/${SERVICE}-$FROM.tar.zst"
|
|
||||||
else
|
|
||||||
# Nejnovější záloha
|
|
||||||
BACKUP_FILE=$(ls -t "$BACKUP_ROOT/$SERVICE"/${SERVICE}-*.tar.zst 2>/dev/null | head -1 || true)
|
|
||||||
fi
|
|
||||||
|
|
||||||
[[ -z "$BACKUP_FILE" || ! -f "$BACKUP_FILE" ]] && { echo "⚠ $SERVICE: žádná záloha, přeskakuji"; continue; }
|
|
||||||
|
|
||||||
echo "▶ $SERVICE: obnovuji z $BACKUP_FILE"
|
|
||||||
if ! $DRY_RUN; then
|
|
||||||
run docker compose -f "$SERVICE_DIR/docker-compose.yml" stop
|
|
||||||
run rm -rf "$SERVICE_DIR/data"
|
|
||||||
run mkdir -p "$SERVICE_DIR/data"
|
|
||||||
run tar --zstd -xf "$BACKUP_FILE" -C "$SERVICE_DIR"
|
|
||||||
run chown -R "$DEPLOY_USER:$DEPLOY_USER" "$SERVICE_DIR/data"
|
|
||||||
run docker compose -f "$SERVICE_DIR/docker-compose.yml" up -d
|
|
||||||
echo "✓ $SERVICE obnoven"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "🎯 Obnova dokončena"
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
# Brewfile – instalace všech macOS aplikací
|
|
||||||
# Tento soubor použij s: brew bundle --file=Brewfile
|
|
||||||
# Generováno z produkčního Macu (viz README)
|
|
||||||
|
|
||||||
# ───────────── TAPS ─────────────
|
|
||||||
tap "homebrew/bundle"
|
|
||||||
tap "homebrew/cask"
|
|
||||||
tap "homebrew/cask-fonts"
|
|
||||||
tap "homebrew/core"
|
|
||||||
|
|
||||||
# ───────────── FORMULAS (CLI) ─────────────
|
|
||||||
brew "aom"
|
|
||||||
brew "bat"
|
|
||||||
brew "btop"
|
|
||||||
brew "ca-certificates"
|
|
||||||
brew "cairo"
|
|
||||||
brew "certifi"
|
|
||||||
brew "dav1d"
|
|
||||||
brew "deno"
|
|
||||||
brew "diffutils"
|
|
||||||
brew "exiftool"
|
|
||||||
brew "eza"
|
|
||||||
brew "fastfetch"
|
|
||||||
brew "fd"
|
|
||||||
brew "ffmpeg"
|
|
||||||
brew "fish"
|
|
||||||
brew "fontconfig"
|
|
||||||
brew "freetype"
|
|
||||||
brew "fribidi"
|
|
||||||
brew "fzf"
|
|
||||||
brew "gettext"
|
|
||||||
brew "giflib"
|
|
||||||
brew "glib"
|
|
||||||
brew "graphite2"
|
|
||||||
brew "harfbuzz"
|
|
||||||
brew "htop"
|
|
||||||
brew "icu4c@78"
|
|
||||||
brew "img2pdf"
|
|
||||||
brew "jpeg-turbo"
|
|
||||||
brew "jq"
|
|
||||||
brew "json-c"
|
|
||||||
# ... další nainstalované balíky (viz `brew list --formula`)
|
|
||||||
|
|
||||||
# ───────────── CASKS (GUI) ─────────────
|
|
||||||
cask "alt-tab"
|
|
||||||
cask "balenaetcher"
|
|
||||||
cask "bartender"
|
|
||||||
cask "bitwarden"
|
|
||||||
cask "copilot-cli"
|
|
||||||
cask "daisydisk"
|
|
||||||
cask "discord"
|
|
||||||
cask "dockdoor"
|
|
||||||
cask "font-meslo-lg-nerd-font"
|
|
||||||
cask "google-chrome"
|
|
||||||
cask "google-drive"
|
|
||||||
cask "keepassxc"
|
|
||||||
cask "keepingyouawake"
|
|
||||||
cask "keka"
|
|
||||||
cask "microsoft-teams"
|
|
||||||
cask "nextcloud"
|
|
||||||
cask "nextcloud-talk"
|
|
||||||
cask "notion"
|
|
||||||
cask "nvidia-geforce-now"
|
|
||||||
cask "obs"
|
|
||||||
cask "obsidian"
|
|
||||||
cask "omnidisksweeper"
|
|
||||||
cask "qbittorrent"
|
|
||||||
cask "rustdesk"
|
|
||||||
cask "spotify"
|
|
||||||
cask "transmission"
|
|
||||||
cask "visual-studio-code"
|
|
||||||
cask "vlc"
|
|
||||||
cask "whatsapp"
|
|
||||||
cask "whichspace"
|
|
||||||
# ... další (viz `brew list --cask`)
|
|
||||||
|
|
||||||
# ───────────── FONTS ─────────────
|
|
||||||
cask "font-meslo-lg-nerd-font"
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
# 🍎 macOS Setup
|
|
||||||
|
|
||||||
> Automatizovaná instalace a konfigurace macOS workstation.
|
|
||||||
|
|
||||||
## 📦 Obsah
|
|
||||||
|
|
||||||
| Soubor | Účel |
|
|
||||||
|---|---|
|
|
||||||
| [`Brewfile`](Brewfile) | Všechny nainstalované CLI/GUI aplikace (Homebrew Bundle) |
|
|
||||||
| [`install-brew.sh`](install-brew.sh) | Instaluje Homebrew (pokud chybí) |
|
|
||||||
| [`configure-fish.sh`](configure-fish.sh) | Nastaví Fish shell s aliasy |
|
|
||||||
| [`osx-defaults.sh`](osx-defaults.sh) | macOS výchozí nastavení (Finder, Dock, klávesnice) |
|
|
||||||
| [`README.md`](README.md) | Tento soubor |
|
|
||||||
|
|
||||||
## 🚀 Quickstart (nový Mac)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Instalace Homebrew (pokud chybí)
|
|
||||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
||||||
|
|
||||||
# 2. Instalace všech aplikací
|
|
||||||
brew bundle --file=Brewfile
|
|
||||||
|
|
||||||
# 3. macOS výchozí nastavení (Finder, Dock, ...)
|
|
||||||
bash osx-defaults.sh
|
|
||||||
|
|
||||||
# 4. Fish shell s aliasy
|
|
||||||
bash configure-fish.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔧 Fish aliasy
|
|
||||||
|
|
||||||
`configure-fish.sh` nastaví tyto aliasy (viz skript):
|
|
||||||
|
|
||||||
| Alias | Příkaz |
|
|
||||||
|---|---|
|
|
||||||
| `update` | `brew update && brew upgrade` |
|
|
||||||
| `ll` | `eza -la` |
|
|
||||||
| `cat` | `bat` |
|
|
||||||
| `find` | `fd` |
|
|
||||||
| `top` | `btop` |
|
|
||||||
| `g` | `git` |
|
|
||||||
| `k` | `kubectl` |
|
|
||||||
| `d` | `docker` |
|
|
||||||
| `dc` | `docker compose` |
|
|
||||||
|
|
||||||
## ⚙️ macOS Defaults
|
|
||||||
|
|
||||||
`osx-defaults.sh` nastaví:
|
|
||||||
|
|
||||||
- **Finder:** zobrazit skryté soubory, všechny přípony, cestu k aktuálnímu adresáři
|
|
||||||
- **Dock:** auto-hide, rychlejší animace
|
|
||||||
- **Keyboard:** rychlejší opakování kláves
|
|
||||||
- **Trackpad:** rychlejší tracking
|
|
||||||
- **Safari:** vývojářské nástroje
|
|
||||||
|
|
||||||
## 🔐 Bezpečnost
|
|
||||||
|
|
||||||
- **FileVault** – povolit (v System Settings → Privacy & Security)
|
|
||||||
- **Firewall** – povolit (v System Settings → Network → Firewall)
|
|
||||||
- **XProtect** – default zapnutý
|
|
||||||
- **Gatekeeper** – default `App Store a identified developers`
|
|
||||||
|
|
||||||
## 📚 Apple ekosystém
|
|
||||||
|
|
||||||
- **iCloud** – dokumenty, plocha, fotografie
|
|
||||||
- **Handoff** – pokračovat na iOS/iPadOS
|
|
||||||
- **Universal Clipboard**
|
|
||||||
- **Sidecar** – iPad jako druhá obrazovka
|
|
||||||
|
|
||||||
## 🔄 Aktualizace
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Homebrew
|
|
||||||
brew update && brew upgrade && brew cleanup
|
|
||||||
|
|
||||||
# macOS
|
|
||||||
System Settings → Software Update
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📚 Dokumentace
|
|
||||||
|
|
||||||
- [Homebrew](https://brew.sh/)
|
|
||||||
- [Brewfile](https://github.com/Homebrew/homebrew-bundle)
|
|
||||||
- [macOS defaults](https://macos-defaults.com/)
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# Nastaví Fish shell s užitečnými aliasy
|
|
||||||
# - uloží konfiguraci do ~/.config/fish/config.fish
|
|
||||||
# - pokud Fish neexistuje, nainstaluje ho
|
|
||||||
# - idempotentní (přidá/aktualizuje aliasy, nesmaže existující)
|
|
||||||
#
|
|
||||||
# Vyžaduje fish 3.0+ a Homebrew
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
FISH_CONFIG="$HOME/.config/fish/config.fish"
|
|
||||||
|
|
||||||
# Pokud fish není nainstalovaný, nainstaluj
|
|
||||||
if ! command -v fish &>/dev/null; then
|
|
||||||
echo "▶ Instaluji fish..."
|
|
||||||
if command -v brew &>/dev/null; then
|
|
||||||
brew install fish
|
|
||||||
else
|
|
||||||
echo "✗ Homebrew není nainstalován. Nainstaluj ho ručně: https://brew.sh/" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Vytvoř adresář
|
|
||||||
mkdir -p "$(dirname "$FISH_CONFIG")"
|
|
||||||
|
|
||||||
# Definice aliasů
|
|
||||||
declare -A ALIASES=(
|
|
||||||
["update"]="brew update && brew upgrade && brew cleanup"
|
|
||||||
["ll"]="eza -la --git --time-style=long-iso"
|
|
||||||
["ls"]="eza"
|
|
||||||
["cat"]="bat --paging=never"
|
|
||||||
["find"]="fd"
|
|
||||||
["grep"]="rg"
|
|
||||||
["top"]="btop"
|
|
||||||
["ps"]="procs"
|
|
||||||
["g"]="git"
|
|
||||||
["d"]="docker"
|
|
||||||
["dc"]="docker compose"
|
|
||||||
["k"]="kubectl"
|
|
||||||
["llog"]="docker compose logs -f --tail=100"
|
|
||||||
["dip"]="docker compose logs -f --tail=100 \\\\"
|
|
||||||
["myip"]="curl -s https://api.ipify.org && echo"
|
|
||||||
["weather"]="curl -s 'wttr.in?format=3'"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Funkce pro generování
|
|
||||||
{
|
|
||||||
echo "# ~/.config/fish/config.fish"
|
|
||||||
echo "# Generováno configure-fish.sh – $(date +%Y-%m-%d)"
|
|
||||||
echo ""
|
|
||||||
echo "set -g fish_greeting \"\""
|
|
||||||
echo "set -gx PATH /opt/homebrew/bin \$PATH"
|
|
||||||
echo "set -gx EDITOR vim"
|
|
||||||
echo ""
|
|
||||||
for alias in "${!ALIASES[@]}"; do
|
|
||||||
echo "alias $alias='${ALIASES[$alias]}'"
|
|
||||||
done
|
|
||||||
} > "$FISH_CONFIG"
|
|
||||||
|
|
||||||
echo "✓ Konfigurace Fish v $FISH_CONFIG"
|
|
||||||
echo
|
|
||||||
echo "Použití: spusť 'fish' v terminálu"
|
|
||||||
echo "Ověření: alias ll → ${ALIASES[ll]}"
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
#
|
|
||||||
# macOS výchozí nastavení (defaults write)
|
|
||||||
# Spustit JEDNOU po čisté instalaci macOS
|
|
||||||
#
|
|
||||||
# Vyžaduje: macOS (testováno na 13+)
|
|
||||||
#
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if [[ "$(uname)" != "Darwin" ]]; then
|
|
||||||
echo "Tento skript je pouze pro macOS" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "▶ Nastavuji macOS defaults..."
|
|
||||||
|
|
||||||
# ──── Finder ────
|
|
||||||
# Zobrazit skryté soubory
|
|
||||||
defaults write com.apple.finder AppleShowAllFiles -bool true
|
|
||||||
# Zobrazit všechny přípony
|
|
||||||
defaults write NSGlobalDomain AppleShowAllExtensions -bool true
|
|
||||||
# Zobrazit cestovní panel
|
|
||||||
defaults write com.apple.finder ShowPathbar -bool true
|
|
||||||
# Zobrazit stavový řádek
|
|
||||||
defaults write com.apple.finder ShowStatusBar -bool true
|
|
||||||
# Výchozí pohled: seznam
|
|
||||||
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
|
|
||||||
# Vyhledávání v aktuálním adresáři (default od Mojave)
|
|
||||||
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
|
|
||||||
# Rozšíření "Uložit dialog" o textové lišty
|
|
||||||
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
|
|
||||||
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true
|
|
||||||
# Default nový Finder okno: domovský adresář
|
|
||||||
defaults write com.apple.finder NewWindowTarget -string "PfHm"
|
|
||||||
|
|
||||||
# ──── Dock ────
|
|
||||||
# Auto-hide
|
|
||||||
defaults write com.apple.dock autohide -bool true
|
|
||||||
# Rychlejší animace
|
|
||||||
defaults write com.apple.dock autohide-time-modifier -float 0.3
|
|
||||||
defaults write com.apple.dock expose-animation-duration -float 0.2
|
|
||||||
# Zobrazit indikátory otevřených aplikací
|
|
||||||
defaults write com.apple.dock show-process-indicators -bool true
|
|
||||||
# Velikost ikon
|
|
||||||
defaults write com.apple.dock tilesize -int 48
|
|
||||||
# Skrýt nedávné aplikace
|
|
||||||
defaults write com.apple.dock show-recents -bool false
|
|
||||||
|
|
||||||
# ──── Klávesnice ────
|
|
||||||
# Rychlejší opakování kláves
|
|
||||||
defaults write NSGlobalDomain KeyRepeat -int 2
|
|
||||||
defaults write NSGlobalDomain InitialKeyRepeat -int 15
|
|
||||||
# Plná klávesnice pro přístup
|
|
||||||
defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
|
|
||||||
# Funkční klávesy jako F1-F12
|
|
||||||
defaults write NSGlobalDomain "com.apple.keyboard.fnState" -bool true
|
|
||||||
|
|
||||||
# ──── Trackpad ────
|
|
||||||
# Tap-to-click
|
|
||||||
defaults write com.apple.AppleMultitouchTrackpad Clicking -bool true
|
|
||||||
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
|
|
||||||
# Rychlejší tracking
|
|
||||||
defaults write NSGlobalDomain com.apple.trackpad.scaling -float 1.5
|
|
||||||
|
|
||||||
# ──── Safari ────
|
|
||||||
# Zobrazit vývojářské nástroje
|
|
||||||
defaults write com.apple.Safari IncludeDevelopMenu -bool true
|
|
||||||
defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true
|
|
||||||
# Privacy: omezit cross-site tracking
|
|
||||||
defaults write com.apple.Safari WebKitStorageBlockingPolicy -int 1
|
|
||||||
|
|
||||||
# ──── TextEdit ────
|
|
||||||
# Plain text mode
|
|
||||||
defaults write com.apple.TextEdit RichText -int 0
|
|
||||||
|
|
||||||
# ──── Terminal ────
|
|
||||||
# UTF-8
|
|
||||||
defaults write com.apple.terminal StringEncodings -array 4
|
|
||||||
|
|
||||||
echo "✓ macOS defaults nastaveny"
|
|
||||||
echo
|
|
||||||
echo "Pro aplikaci změn: odhlas se a prihlas se, nebo restartuj Finder/Dock:"
|
|
||||||
echo " killall Finder Dock"
|
|
||||||
Reference in New Issue
Block a user