diff --git a/README.md b/README.md index 57ddebb..fbc62da 100644 --- a/README.md +++ b/README.md @@ -1,119 +1,255 @@ # mates-ansible -Ansible role a playbooky pro přípravu nového serveru a nasazení home infrastruktury. +Ansible playbooky pro přípravu nového serveru a správu home infrastruktury. -## Playbooky +> **Jsi začátečník?** Čti od [Začínáme](#zaciname) – vše je tu vysvětleno krok za krokem. -| Playbook | Účel | +--- + +## 📚 Co je Ansible? + +Ansible je nástroj, který **automatizuje konfiguraci serverů**. Místo toho, aby ses ručně přihlašoval přes SSH a psal 50 příkazů, napíšeš **jeden příkaz** a Ansible udělá všechno za tebe. + +**Příklad:** Místo +```bash +ssh server "apt update && apt install -y docker docker-compose-plugin && usermod -aG docker deploy" +``` + +napíšeš +```bash +ansible-playbook -i inventory.yml playbooks/priprav-novy-server.yml +``` + +a Ansible to udělá **na všech serverech** najednou. + +--- + +## 📦 Obsah repozitáře + +### 🎯 Playbooky (hlavní úkoly) + +| Playbook | Co dělá | |---|---| -| `prepare-new-server.yml` | Kompletní příprava nového serveru (od nuly) | -| `deploy-services.yml` | Nasaď Docker služby z `mates-docker-services/` | -| `update-services.yml` | Update všech služeb (`docker compose pull && up -d`) | -| `security-hardening.yml` | Sysctl, auditd, auto-updates | +| **`priprav-novy-server.yml`** | Kompletní příprava nového serveru od nuly (update + user + SSH + Docker + adresáře + fail2ban) | +| **`nasad-sluzby.yml`** | Nasaď Docker služby z `mates-docker-services/` (Portainer, Vaultwarden, Gitea, …) | +| **`aktualizuj-sluzby.yml`** | Aktualizuj všechny běžící služby (`docker compose pull && up -d`) | +| **`zabezpec-server.yml`** | Bezpečnostní hardening (sysctl, auditd, automatické security updaty) | -## Quickstart pro nový server +### 🧩 Role (znovupoužitelné bloky) -### 1. Příprava inventory +| Role | Co dělá | +|---|---| +| `zaklad` | Základ: update systému, base balíky (btop, mc, tree, curl, …), timezone | +| `uzivatel-deploy` | Vytvoří uživatele `deploy` (UID 1000) s uzamknutým heslem | +| `ssh-klice` | Nasadí SSH klíč pro `deploy` (heslo = klíč, ne heslo) | +| `docker` | Docker Engine + Compose plugin + nastavení daemon.json | +| `adresare` | `/home/deploy/{docker,scripts,backups,logs,~/.local/bin}` + 14 složek pro služby | + +### ⚙️ Konfigurace + +| Soubor | Co obsahuje | +|---|---| +| `inventory.example.yml` | Ukázkový inventory – seznam serverů | +| `group_vars/all.yml.example` | Společné proměnné (SSH klíč, porty, balíky, …) | +| `ansible.cfg` | Konfigurace Ansible (cesty, SSH optimalizace, …) | + +--- + +## 🚀 Začínáme + +### Krok 1: Nainstaluj Ansible + +```bash +# macOS +brew install ansible + +# Linux (apt) +sudo apt install -y ansible +``` + +### Krok 2: Naklonuj repo + +```bash +git clone http://:3000/mates/mates-ansible.git +cd mates-ansible +``` + +### Krok 3: Vytvoř inventory.yml + +Zkopíruj ukázkový soubor a uprav: ```bash cp inventory.example.yml inventory.yml -nano inventory.yml # nastavit IP a SSH klíč +nano inventory.yml ``` -### 2. Přidání svého SSH klíče - -```bash -# Verejny klic z Macu -cat ~/.ssh/id_ed25519.pub - -# Pridej do group_vars/all.yml: -deploy_ssh_public_keys: - - "ssh-ed25519 AAAAC3Nz... hermes@mac" -``` - -### 3. První připojení (s heslem) +**Co v inventory nastavit:** ```yaml -# inventory.yml - pro prvni pripojeni (jeste pred SSH klicem) -homeservers: - hosts: - novy-server: - ansible_host: - ansible_user: ubuntu # nebo root - ansible_ssh_pass: heslo # POZOR: jen docasne - ansible_become_pass: heslo # POZOR: jen docasne +all: + vars: + ansible_user: ubuntu # SSH user na novém serveru + ansible_become: true # potřebuje sudo (povinné) + ansible_ssh_pass: tvujHeslo # heslo pro první připojení (jen dočasně!) + + children: + homeservers: + hosts: + novy-server: + ansible_host: 192.168.1.50 # IP nového serveru ``` -### 4. Spuštění playbooku +### Krok 4: Přidej svůj SSH klíč ```bash -ansible-playbook -i inventory.yml playbooks/prepare-new-server.yml +# Na Macu – zobraz svuj verejny klic +cat ~/.ssh/id_ed25519.pub +# ssh-ed25519 AAAAC3Nz... hermes@mac + +# Pridej do group_vars/all.yml.example +cp group_vars/all.yml.example group_vars/all.yml +nano group_vars/all.yml ``` -Playbook provede: -- ✅ Update systému (apt) -- ✅ Vytvoří `deploy` usera (UID 1000) bez hesla -- ✅ Nastaví SSH klíč pro `deploy` -- ✅ Vytvoří adresářovou strukturu (`/home/deploy/docker//`) -- ✅ Nainstaluje Docker Engine + Compose plugin -- ✅ Přidá `deploy` do `docker` group (docker bez sudo) -- ✅ Nastaví UFW firewall (povoleno 22, 80, 443) -- ✅ Nainstaluje fail2ban +V souboru najdi řádek: +```yaml +deploy_ssh_public_keys: + - "ssh-ed25519 AAAAC3Nz... hermes@mac" # ← sem vlož svůj klíč +``` -### 5. Po dokončení +### Krok 5: Spusť playbook ```bash -# Prihlas se jako deploy +ansible-playbook -i inventory.yml playbooks/priprav-novy-server.yml +``` + +**Co se stane:** +1. ✅ Ansible se připojí na server přes SSH (s heslem) +2. ✅ Stáhne seznam balíků (`apt update`) +3. ✅ Nainstaluje 17 základních balíků (btop, mc, tree, curl, …) +4. ✅ Vytvoří uživatele `deploy` (UID 1000) +5. ✅ Zamkne mu heslo (přístup jen přes SSH klíč) +6. ✅ Přidá tvůj SSH klíč do `~/.ssh/authorized_keys` +7. ✅ Nainstaluje Docker Engine + Compose plugin +8. ✅ Přidá `deploy` do `docker` group (docker **bez sudo**) +9. ✅ Vytvoří adresářovou strukturu pro 14 Docker služeb +10. ✅ Nainstaluje fail2ban (ochrana proti brute-force SSH) + +**Trvání:** 5-10 minut. + +### Krok 6: Ověř + +```bash +# Prihlas se jako deploy (s klicem, bez hesla) ssh deploy@ -# Over Docker bez sudo -docker ps +# Over Docker +docker ps # melo by fungovat bez sudo +docker compose version -# Nasad sluzby z docker-services -git clone http://:3000/mates/mates-docker-services.git -cd mates-docker-services/portainer -cp .env.example .env -docker compose up -d +# Adresare +ls /home/deploy/ # melo byt: docker, scripts, backups, logs, ... ``` -## Role +--- -| Role | Účel | -|---|---| -| `common` | Update systému, base packages, timezone | -| `deploy-user` | Vytvoření `deploy` usera (UID 1000) | -| `ssh-keys` | Nasazení authorized_keys | -| `firewall` | UFW konfigurace | -| `docker` | Docker Engine + Compose + user v docker group | -| `directories` | `/home/deploy/{docker,scripts,backups,logs,...}` | +## 🎬 Práce s playbooky -## Struktura +### Příprava nového serveru (úplně od nuly) + +```bash +ansible-playbook -i inventory.yml playbooks/priprav-novy-server.yml +``` + +### Nasazení Docker služeb + +```bash +# Nasaď všechny (portainer, gitea, vaultwarden, ...) +ansible-playbook -i inventory.yml playbooks/nasad-sluzby.yml + +# Nasaď jen vybrané +ansible-playbook -i inventory.yml playbooks/nasad-sluzby.yml \ + --extra-vars "sluzby=[portainer,vaultwarden]" +``` + +### Aktualizace služeb + +```bash +# Aktualizuj všechny běžící služby (docker compose pull && up -d) +ansible-playbook -i inventory.yml playbooks/aktualizuj-sluzby.yml +``` + +### Bezpečnostní hardening + +```bash +ansible-playbook -i inventory.yml playbooks/zabezpec-server.yml +``` + +Tento playbook nastavuje: +- **sysctl** – hardening síťových parametrů jádra +- **auditd** – logování bezpečnostních událostí +- **unattended-upgrades** – automatické bezpečnostní aktualizace + +--- + +## 🏗 Struktura projektu ``` mates-ansible/ -├── README.md -├── ansible.cfg -├── inventory.example.yml -├── group_vars/all.yml.example +├── README.md # Tento soubor +├── LICENSE # MIT +├── ansible.cfg # Konfigurace Ansible +├── inventory.example.yml # Ukázkový inventory +├── group_vars/ +│ └── all.yml.example # Společné proměnné ├── playbooks/ -│ ├── prepare-new-server.yml -│ ├── deploy-services.yml -│ ├── update-services.yml -│ └── security-hardening.yml -├── roles/ -│ ├── common/ -│ ├── deploy-user/ -│ ├── ssh-keys/ -│ ├── firewall/ -│ ├── docker/ -│ └── directories/ -└── requirements.yml +│ ├── priprav-novy-server.yml # Příprava nového serveru +│ ├── nasad-sluzby.yml # Nasaď Docker služby +│ ├── aktualizuj-sluzby.yml # Aktualizuj služby +│ └── zabezpec-server.yml # Bezpečnostní hardening +└── roles/ + ├── zaklad/ # Update + base balíky + ├── uzivatel-deploy/ # Vytvoření deploy usera + ├── ssh-klice/ # Nasazení SSH klíče + ├── docker/ # Docker Engine + Compose + └── adresare/ # Adresářová struktura ``` -## Detailní návody +--- + +## 🔑 Kde co nastavit + +| Co | Kde | +|---|---| +| IP serverů | `inventory.yml` | +| SSH klíč pro deploy | `group_vars/all.yml` → `deploy_ssh_public_keys` | +| Base balíky | `roles/zaklad/defaults/main.yml` → `base_packages` | +| Porty | `group_vars/all.yml` → `allowed_ports` | +| Docker daemon nastavení | `roles/docker/defaults/main.yml` → `docker_daemon_config` | +| Služby k nasazení | `group_vars/all.yml` → `services_to_deploy` | + +--- + +## 🔐 Bezpečnost + +- ✅ **Deploy user má zamknuté heslo** – přístup jen přes SSH klíč +- ✅ **Bez hesel v inventory** – použij `ansible-vault` nebo SSH klíče +- ✅ **Docker bez sudo** – user `deploy` je v `docker` group +- ✅ **fail2ban** – 3 pokusy o SSH = ban na 1 hodinu +- ✅ **Firewall se nenastavuje automaticky** – viz `priprav-novy-server.yml` pro vysvětlení + +--- + +## 📚 Další zdroje Detailní postupy najdeš v Jotty knowledge base. -## Licence +--- + +## 📜 Licence MIT – viz [LICENSE](LICENSE) + +--- + +**Poslední update:** 2026-08-01 diff --git a/playbooks/update-services.yml b/playbooks/aktualizuj-sluzby.yml similarity index 100% rename from playbooks/update-services.yml rename to playbooks/aktualizuj-sluzby.yml diff --git a/playbooks/bootstrap-server.yml b/playbooks/bootstrap-server.yml deleted file mode 100644 index bc55391..0000000 --- a/playbooks/bootstrap-server.yml +++ /dev/null @@ -1,147 +0,0 @@ ---- -# Bootstrap noveho Ubuntu serveru -# - aktualizace systemu -# - deploy user (UID 1000) -# - SSH hardening -# - UFW firewall -# - fail2ban -# - Docker -# -# Pouziti: -# 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 - # Verejny klic pro deploy uzivatele (nastav pred spustenim) - # deploy_ssh_key: "ssh-ed25519 AAAAC3Nz... hermes@mac" - - tasks: - - name: Update apt cache - ansible.builtin.apt: - update_cache: true - cache_valid_time: 3600 - - - name: Upgrade vsech baliku - ansible.builtin.apt: - upgrade: dist - update_cache: true - - - name: Instalace zakladnich baliku - ansible.builtin.apt: - name: - - curl - - wget - - git - - vim - - htop - - ca-certificates - - gnupg - - ufw - - fail2ban - - bash-completion - state: present - - - name: Nastav timezone - community.general.timezone: - name: "{{ timezone }}" - - - name: Vytvor deploy uzivatele - ansible.builtin.user: - name: "{{ deploy_user }}" - uid: "{{ deploy_uid }}" - shell: /bin/bash - create_home: true - password: "" - - - name: Nastav SSH klic pro deploy uzivatele - ansible.posix.authorized_key: - user: "{{ deploy_user }}" - state: present - key: "{{ deploy_ssh_key }}" - when: deploy_ssh_key is defined - - - name: Povol deploy uzivateli sudo bez hesla - 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: UFW vychozi pravidla - community.general.ufw: - direction: incoming - policy: deny - notify: Reload ufw - - - name: Povol SSH pres UFW - community.general.ufw: - rule: allow - port: "{{ ssh_port }}" - proto: tcp - - - name: Povol HTTP a HTTPS - community.general.ufw: - rule: allow - port: "{{ item }}" - proto: tcp - loop: - - "80" - - "443" - - - name: Aktivuj UFW - community.general.ufw: - state: enabled - - - name: Konfigurace 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 diff --git a/playbooks/deploy-services.yml b/playbooks/nasad-sluzby.yml similarity index 100% rename from playbooks/deploy-services.yml rename to playbooks/nasad-sluzby.yml diff --git a/playbooks/prepare-new-server.yml b/playbooks/priprav-novy-server.yml similarity index 78% rename from playbooks/prepare-new-server.yml rename to playbooks/priprav-novy-server.yml index f9dfc5f..6d9d22f 100644 --- a/playbooks/prepare-new-server.yml +++ b/playbooks/priprav-novy-server.yml @@ -1,21 +1,23 @@ --- -# Playbook: prepare-new-server.yml +# Playbook: priprav-novy-server.yml # -# Kompletni priprava noveho Ubuntu serveru: +# Kompletni priprava noveho Ubuntu serveru (od nuly): # 1. Update systemu (apt) -# 2. Deploy user (UID 1000, heslo zamknuto) -# 3. SSH klice (pro deploy uzivatele) -# 4. Adresarova struktura (/home/deploy/docker, ...) +# 2. Zakladni baliky (btop, mc, tree, curl, wget, git, ...) +# 3. Uzivatel deploy (UID 1000, heslo zamknuto) +# 4. SSH klice (z keychainu / group_vars) # 5. Docker Engine + Compose plugin -# 6. Deploy user v docker group (docker bez sudo) -# 7. fail2ban +# 6. Uzivatel deploy v docker group (docker bez sudo) +# 7. Adresarova struktura (/home/deploy/{docker,scripts,backups,logs,...}) +# 8. fail2ban (SSH jail) +# +# Poznamka: firewall (UFW) se nenastavuje - podle pozadavku uzivatele. +# Pro produkcni nasazeni doporucujeme nastavit firewall externe +# (Cloudflare Tunnel, security group na VPS, docker-network oddeleni, ...). # -# Poznamka: firewall (UFW) se nenastavuje - podle pozadavku uzivatele -# neni firewalled nasazen potreba. Pro produkcni nasazeni doporucujeme -# nastavit firewall externe (Cloudflare Tunnel, security group na VPS, ...). # Pouziti: # # 1. Nastavit inventory.yml a pridat svuj verejny klic do group_vars/all.yml -# # 2. ansible-playbook -i inventory.yml playbooks/prepare-new-server.yml +# # 2. ansible-playbook -i inventory.yml playbooks/priprav-novy-server.yml # # Co playbook predpoklada: # - Server ma Ubuntu 22.04 nebo 24.04 LTS @@ -57,16 +59,16 @@ when: confirm_run | default(true) | bool roles: - - role: common - tags: [common, base] - - role: deploy-user - tags: [user, deploy] - - role: ssh-keys - tags: [ssh, keys] + - role: zaklad + tags: [zaklad, base] + - role: uzivatel-deploy + tags: [uzivatel, deploy] + - role: ssh-klice + tags: [ssh, klice] - role: docker tags: [docker] - - role: directories - tags: [directories, docker] + - role: adresare + tags: [adresare, docker] post_tasks: - name: Nainstaluj fail2ban diff --git a/playbooks/security-hardening.yml b/playbooks/zabezpec-server.yml similarity index 100% rename from playbooks/security-hardening.yml rename to playbooks/zabezpec-server.yml diff --git a/roles/directories/defaults/main.yml b/roles/adresare/defaults/main.yml similarity index 100% rename from roles/directories/defaults/main.yml rename to roles/adresare/defaults/main.yml diff --git a/roles/directories/tasks/main.yml b/roles/adresare/tasks/main.yml similarity index 100% rename from roles/directories/tasks/main.yml rename to roles/adresare/tasks/main.yml diff --git a/roles/ssh-keys/defaults/main.yml b/roles/ssh-klice/defaults/main.yml similarity index 100% rename from roles/ssh-keys/defaults/main.yml rename to roles/ssh-klice/defaults/main.yml diff --git a/roles/ssh-keys/tasks/main.yml b/roles/ssh-klice/tasks/main.yml similarity index 100% rename from roles/ssh-keys/tasks/main.yml rename to roles/ssh-klice/tasks/main.yml diff --git a/roles/deploy-user/defaults/main.yml b/roles/uzivatel-deploy/defaults/main.yml similarity index 100% rename from roles/deploy-user/defaults/main.yml rename to roles/uzivatel-deploy/defaults/main.yml diff --git a/roles/deploy-user/tasks/main.yml b/roles/uzivatel-deploy/tasks/main.yml similarity index 100% rename from roles/deploy-user/tasks/main.yml rename to roles/uzivatel-deploy/tasks/main.yml diff --git a/roles/common/defaults/main.yml b/roles/zaklad/defaults/main.yml similarity index 100% rename from roles/common/defaults/main.yml rename to roles/zaklad/defaults/main.yml diff --git a/roles/common/tasks/main.yml b/roles/zaklad/tasks/main.yml similarity index 100% rename from roles/common/tasks/main.yml rename to roles/zaklad/tasks/main.yml