# Docker + Portainer

Instalace dockeru a portaineru

# Instalace Dockeru

# [Instalace Dockeru](https://pimylifeup.com/raspberry-pi-docker/)

Díky šikovnému instalačnímu skriptu vyvinutému týmem Docker je instalace softwaru kontejneru neuvěřitelně jednoduchá.

Následující kroky můžete dokonce dokončit pomocí [připojení SSH k vašemu Raspberry Pi ](https://pimylifeup.com/raspberry-pi-ssh/).

**1.** Naším prvním úkolem je aktualizovat všechny naše stávající balíčky, než přistoupíme k instalaci Dockeru.

Všechny stávající balíčky můžeme upgradovat spuštěním následujících dvou příkazů na Raspberry Pi.

```bash
sudo apt update
sudo apt upgrade
```

<div class="toolbar" id="bkmrk-"><div class="toolbar-item">  
</div></div>**2.** S naším Raspberry Pi zcela aktuálním můžeme nyní pokračovat a nainstalovat Docker na Raspberry Pi.

Naštěstí pro nás Docker tento proces neuvěřitelně zrychlil a zjednodušil tím, že poskytl bash skript, který vše nainstaluje za vás.

Můžete si stáhnout a spustit oficiální instalační skript Docker spuštěním následujícího příkazu.

```bash
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
```

<div class="toolbar" id="bkmrk--1"><div class="toolbar-item">  
</div></div>Tento příkaz převede skript přímo do příkazového řádku. Obvykle by bylo nejlepší, kdybyste to neudělali; Docker je však důvěryhodný zdroj.

Pokud si nejste jisti, zda to spustit přímo bez předchozí kontroly, můžete [přímo na get.docker.com . ](https://get.docker.com)skript zobrazit

Dokončení tohoto skriptu může nějakou dobu trvat, protože automaticky detekuje a nainstaluje vše, co potřebuje ke spuštění Dockeru na Raspberry Pi.

## Nastavení uživatele pro Docker

Než budeme moci začít používat Docker bez problémů, musíme provést mírné úpravy našeho uživatele.

Souvisí to se způsobem, jakým [systém oprávnění Linux ](https://pimylifeup.com/file-permissions-in-linux/)pracuje s Dockerem. Ve výchozím nastavení může s Dockerem komunikovat pouze uživatel Dockeru, ale existuje způsob, jak to obejít.

**1.** Jakmile Docker dokončí instalaci do vašeho Raspberry Pi, musíme udělat ještě několik věcí.

Aby mohl jiný uživatel komunikovat s Dockerem, musí být přidán do `docker`skupina.

Takže naším dalším krokem je přidání našeho aktuálního uživatele do `docker`skupinu [pomocí příkazu usermod ](https://pimylifeup.com/usermod-command/), jak je uvedeno níže. Používáním " `$USER`” vkládáme proměnnou prostředí, která ukládá jméno aktuálního uživatele.

```bash
sudo usermod -aG docker $USER
```

<div class="toolbar" id="bkmrk--2"><div class="toolbar-item">  
</div></div>Pokud do skupiny nepřidáme našeho uživatele, nebudeme moci komunikovat s Dockerem bez spuštění jako uživatel root.

Chcete-li se dozvědět více o oprávněních a skupinách v Linuxu, podívejte se na naše [oprávnění k souborům v příručce Linux ](https://pimylifeup.com/file-permissions-in-linux/).

**2.** Protože jsme u našeho uživatele provedli nějaké změny, budeme se nyní muset odhlásit a znovu přihlásit, aby se změny projevily.

Můžete se odhlásit spuštěním následujícího příkazu v terminálu.

```bash
logout
```

<div class="toolbar" id="bkmrk--3"><div class="toolbar-item">  
</div></div>**3.** Jakmile se znovu přihlásíte, můžete si ověřit, že skupina dockerů byla úspěšně přidána k vašemu uživateli spuštěním následujícího příkazu.

```plaintext
groups
```

<div class="toolbar" id="bkmrk--4"><div class="toolbar-item">  
</div></div>Tento příkaz zobrazí seznam všech skupin, kterých je aktuální uživatel součástí. Pokud vše fungovalo, jak má, skupina `docker`by zde mělo být uvedeno.

## Testování instalace Dockeru na Raspberry Pi

Když je Docker nyní nastaven na našem Raspberry Pi, měli bychom nyní pokračovat a testovat, abychom se ujistili, že funguje.

**1.** Chcete-li otestovat, zda Docker funguje, budeme pokračovat a spustíme následující příkaz na našem Pi.

Tento příkaz řekne Dockeru, aby si stáhl, nastavil a spustil kontejner dockeru s názvem „ **hello-world** .

```plaintext
docker run hello-world
```

<div class="toolbar" id="bkmrk--5"><div class="toolbar-item">  
</div></div>**2.** Pokud jste úspěšně nainstalovali Docker do vašeho Raspberry Pi, měli byste vidět zprávu s následujícím textem.

```plaintext
Hello from Docker!
This message shows that your installation appears to be working correctly.
```

<div class="toolbar" id="bkmrk--6"><div class="toolbar-item">  
</div></div>## Závěr

Nyní můžete bezpečně začít používat Docker pro svůj projekt, jako je nastavení Docker swarm s vaším Raspberry Pi.

Docker kontejnery jsou skvělý způsob, jak rychle nasadit software do vašeho zařízení.

Chcete-li si usnadnit život při správě kontejnerů Docker, [můžete také nastavit Portainer na zařízení Pi ](https://pimylifeup.com/raspberry-pi-portainer/). Portainer je úhledný kus softwaru, který vám umožňuje vytvářet a spravovat kontejnery ve webovém rozhraní.

Pokud jste našli nějaké problémy s instalací Dockeru, pak neváhejte napsat komentář níže.

# Instalace Portaineru

### Instalace a aktualizace Portaineru (Docker)

Tento návod slouží k instalaci Portainer CE pomocí Dockeru. Veškerá data a nastavení budou uložena v Docker volume, takže o ně při aktualizaci nepřijdete.

## 1. Instalace Portaineru

Nejdříve vytvoříme svazek pro data a následně spustíme samotný kontejner.

**Krok 1: Vytvoření volume pro trvalá data**

```
sudo docker volume create portainer_data
```

Ověření:

```yaml
docker volume inspect portainer_data
```

****Krok 2: Spuštění kontejneru Portainer****

```yaml
docker run -d \
  --name=portainer \
  --restart=always \
  -p 9000:9000 \
  -p 9443:9443 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

```

- **-p 9000:9000**: Přístup přes HTTP (nezabezpečený).
- **-p 9443:9443**: Přístup přes HTTPS (zabezpečený – doporučeno).
- **--name=portainer**: Pojmenování kontejneru pro snadnou správu.
- **--restart=always**: Portainer se automaticky spustí po restartu serveru.
- **-v /var/run/docker.sock...**: Umožňuje Portaineru ovládat Docker na vašem serveru.
- **-v portainer\_data:/data**: Propojení vytvořeného svazku s vnitřkem kontejneru (vaše data).

### Co je kritické:

<div class="TyagGW_tableContainer" id="bkmrk-parametr-pro%C4%8D--v-por"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>Parametr</th><th>Proč</th></tr></thead><tbody><tr><td>`-v portainer_data:/data`</td><td>**ukládá stack YAML, uživatele, nastavení**</td></tr><tr><td>`--restart=always`</td><td>přežije reboot</td></tr><tr><td>`docker.sock`</td><td>správa Dockeru</td></tr></tbody></table>

</div></div>3️⃣ Ověření správné instalace (POVINNÉ)

```
docker inspect portainer | grep -A10 Mounts
```

Správný výstup MUSÍ obsahovat:

"Type": "volume",  
"Source": "/var/lib/docker/volumes/portainer\_data/\_data",  
"Destination": "/data"

Pokud to tam není → **OKAMŽITĚ STOP** – instalace je špatně.

---

#### 🔁 BEZPEČNÁ AKTUALIZACE PORTAINERU

#### (bez ztráty YAML)

> Aktualizuje se **POUZE kontejner**, **NIKDY volume**

Tento postup použijte vždy, když chcete přejít na novější verzi. Data zůstanou zachována.

**Krok 1: Stažení nejnovější verze obrazu z internetu**

```
sudo docker pull portainer/portainer-ce:latest
```

**Krok 2: Zastavení aktuálně běžícího Portaineru + **Krok 3: Odstranění starého kontejneru** *(Nebojte se, data jsou bezpečně v portainer\_data volume)***

```
sudo docker stop portainer
sudo docker rm portainer
```

***Krok 4: Spuštění Portaineru znovu (už z nové verze)***

```yaml
docker run -d \
  --name=portainer \
  --restart=always \
  -p 9000:9000 \
  -p 9443:9443 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

```

➡️ Po přihlášení:

- Stacky
- YAML
- Historie
- Credentials  
    **= VŠECHNO ZACHOVÁNO**

### Přihlášení do rozhraní

Po instalaci nebo aktualizaci otevřete prohlížeč a zadejte:

- **HTTP:** `http://vase-ip-adresa:9000`
- **HTTPS:** `https://vase-ip-adresa:9443`

*Poznámka: Jak jsme si potvrdili, veškeré další programy už budete instalovat přes Portainer UI v sekci **Stacks** s využitím Environment Variables.*

##### ⚠️ 2) SMAZAT VŠECHNY IMAGE, KTERÉ NEPOUŽÍVÁ ŽÁDNÝ KONTEJNER

Tímto smažeš:

- **i staré image, které nejsou dangling, ale nemá je přiřazen žádný kontejner:**

```yaml
docker image prune -a -f
```

#### App Templates:

<div class="col-sm-12 mb-2 mt-4 pl-0 font-medium text-base" id="bkmrk--5"></div>```
https://raw.githubusercontent.com/Lissy93/portainer-templates/main/templates_v3.json
```

### Konfigurace Porttaineru na vašem Raspberry Pi

Když se poprvé připojíte k webovému rozhraní Portaineru, budete muset provést některé počáteční kroky nastavení.

Nebojte se, protože tyto jsou neuvěřitelně přímočaré a pomáhají zajistit, že bude fungovat tak, jak chceme.

**1.** Při prvním spuštění webového rozhraní Portaineru si budete muset vytvořit účet správce.

Chcete-li vytvořit tento administrátorský účet, musíte mu dát uživatelské jméno ( **1.** ).

Dále budete muset tomuto novému účtu přiřadit heslo ( **2.** ). Portainer vyžaduje, abyste měli hesla dlouhá alespoň 12 znaků.

Jakmile nastavíte požadované uživatelské jméno a heslo, click" `Create user`” pro dokončení jeho vytváření.

<figure class="image" id="bkmrk--6">![Vytvoření uživatele správce](https://pimylifeup.com/wp-content/uploads/2021/03/Raspberry-Pi-Portainer-01-Creating-an-administrator-user.jpg)</figure>**2.** Nyní musíme vybrat, jaký druh prostředí kontejneru chceme, aby Porttainer spravoval.

V našem případě musíme vybrat `Docker`Možnost **1.** ).

Jakmile tuto možnost vyberete, clicka `Connect`tlačítko ( **2.** ).

<figure class="image" id="bkmrk--7">![Vyberte Prostředí Portainer Docker](https://pimylifeup.com/wp-content/uploads/2021/03/Raspberry-Pi-Portainer-02-Choose-Docker-Enviornment.jpg)</figure>**3.** Nyní byste měli mít Porttainer úspěšně spuštěný na vašem Raspberry Pi.

Nyní jej můžete použít ke správě kontejnerů Docker běžících na vašem zařízení.

<figure class="image" id="bkmrk--8">![Otevřeno webové uživatelské rozhraní Raspberry Pi Portainer](https://pimylifeup.com/wp-content/uploads/2021/03/Raspberry-Pi-Portainer-03-Portainer-Web-UI-Opened.jpg)</figure>### Základní použití uživatelského rozhraní Portainer

Tato část ukáže základy používání Portainer UI k vytvoření nového kontejneru Docker.

Podle těchto kroků si Portainer stáhne obrázek kontejneru do vašeho Raspberry Pi a nastaví jej.

**1.** Když vstoupíte do rozhraní Portainer, měli byste vidět obrazovku jako níže.

Můžete vidět, že naše instalace Raspberry Pi Docker je uvedena jako koncový bod Portainer. Clicktento koncový bod otevřete jeho nastavení.

<figure class="image" id="bkmrk--9">![Otevřete Docker Endpoint](https://pimylifeup.com/wp-content/uploads/2021/03/Raspberry-Pi-Portainer-04-Open-Docker-Endpoint.jpg)</figure>**2.** Zde uvidíte rychlý přehled Dockeru spuštěného ve vašem systému.

Na této obrazovce se zobrazí počet kontejnerů, svazků, obrazů a sítí ve vašem systému.

Chcete-li zjistit, jaké kontejnery běží na vašem Raspberry Pi, click" `Containers`“ na postranním panelu.

<figure class="image" id="bkmrk--10">![Přejděte na kartu Kontejnery](https://pimylifeup.com/wp-content/uploads/2021/03/Raspberry-Pi-Portainer-05-Change-to-Containers-Tab.jpg)</figure>**3.** Porttaineru se nyní zobrazí seznam kontejnerů aktuálně nastavených na vašem zařízení ( **1.** ).

Když vyberete kontejner, budete jej moci ovládat volbou, zda chcete kontejner spustit, zastavit, zabít ( **2.** ).

Pokud chcete přidat zcela nový kontejner, můžete click" `Add container`tlačítko “ ( **3.** ).

<figure class="image" id="bkmrk--11">![Přehled seznamu kontejnerů](https://pimylifeup.com/wp-content/uploads/2021/03/Raspberry-Pi-Portainer-06-Container-List-Overview.jpg)</figure>**3.** A konečně, tato obrazovka je ta, která vám umožní vytvářet nové kontejnery v Porttaineru.

Pomocí této možnosti můžete zvolit různá nastavení.

Nejprve musíte definovat název, který chcete tomuto kontejneru přidělit ( **1.** ).

Poté musíte vybrat obrázek, který má Portainer natáhnout do vašeho Raspberry Pi ( **2.** ).

Je dokonce možné nastavit síťové porty, které má váš kontejner Docker používat ( **3.** ).

Kromě toho můžete také ovládat, kdo může tento kontejner spravovat ve webovém rozhraní Portaineru ( **4.** ).

Nakonec je zde řada pokročilých možností, které můžete nastavit pomocí pole v dolní části stránky ( **5.** ). Ten, který budete pravděpodobně konfigurovat nejvíce, je „ `Restart Policy`“.

Pomocí toho můžete zajistit, že se váš kontejner dockeru automaticky restartuje, když se Raspberry Pi restartuje.

Jakmile budete spokojeni se všemi nastaveními nového kontejneru Docker, můžete click" `Deploy the container`tlačítko “ (6.)

<figure class="image" id="bkmrk--12">![Vytvořte nové kontejnery v Porttaineru pro Raspberry Pi](https://pimylifeup.com/wp-content/uploads/2021/03/Raspberry-Pi-Portainer-07-Create-New-Containers.jpg)</figure>## Závěr

V tuto chvíli byste měli mít úspěšně spuštěn Portainer na vašem Raspberry Pi.

Portainer je šikovný software, který vám umožní snadno spravovat vaše kontejnery Docker.

Pomocí webového rozhraní můžete vytvářet, upravovat a mazat své kontejnery.

Pokud máte nějaké problémy se spuštěním Porttaineru na vašem Raspberry Pi, zanechte prosím komentář níže.

Měli byste se také podívat na naše další [projekty Raspberry Pi ](https://pimylifeup.com/category/projects/), abyste viděli, jak jinak můžete využít své Pi.

# Instalace Portaineru NEW

Tady máš **CELÝ POSTUP OD NULY**, přesně **tak, jak chceš**:

- ✔ Portainer **instalovaný jako stack přes YML**
- ✔ **VŠECHNO v `/opt/stack/`**
- ✔ **file-based stack** (Portainer YAML **nevlastní**)
- ✔ **aktualizace / reinstalace Portaineru = BEZ `LIMITED`**
- ✔ odpovídá tomu, co chceš dlouhodobě provozovat

Žádné alternativy, žádné teorie. **Toto je správný a bezpečný způsob.**

---

# 🎯 CÍLOVÝ STAV

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-%2Fopt%2Fstack%2F-%E2%94%9C%E2%94%80%E2%94%80-port"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`/opt/stack/├── portainer/│   └── docker-compose.yml├── portainer-data/└── (ostatní stacky později stejným stylem)`</div></div>---

# 0️⃣ PŘEDPOKLADY

- Docker **už máš** ✅
- Používáš **docker compose plugin** (`docker compose`)
- Vše děláš jako `root` nebo přes `sudo`

Ověření (jen pro klid):

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-docker---version-doc"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`docker --versiondocker compose version`</div></div>---

# 1️⃣ VYTVOŘ STRUKTURU (POVINNÉ)

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-mkdir--p-%2Fopt%2Fstack%2F"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-built_in">mkdir</span> -p /opt/stack/portainer<span class="hljs-built_in">mkdir</span> -p /opt/stack/portainer-data`</div></div>📌 **DŮLEŽITÉ**

- `portainer-data` je **perzistence**
- **nikdy** nepoužívej Docker volume typu `portainer_data`
- jen **bind mount do `/opt`**

---

# 2️⃣ VYTVOŘ YML PRO PORTAINER (FILE-BASED STACK)

Soubor:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-nano-%2Fopt%2Fstack%2Fport"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`nano /opt/stack/portainer/docker-compose.yml`</div></div>Obsah **VLOŽ DOSLOVA**:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-version%3A-%223.8%22-servi"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-attr">version:</span> <span class="hljs-string">"3.8"</span><span class="hljs-attr">services:</span>  <span class="hljs-attr">portainer:</span>    <span class="hljs-attr">image:</span> <span class="hljs-string">portainer/portainer-ce:latest</span>    <span class="hljs-attr">container_name:</span> <span class="hljs-string">portainer</span>    <span class="hljs-attr">restart:</span> <span class="hljs-string">unless-stopped</span>    <span class="hljs-attr">ports:</span>      <span class="hljs-bullet">-</span> <span class="hljs-string">"9000:9000"</span>      <span class="hljs-bullet">-</span> <span class="hljs-string">"9443:9443"</span>    <span class="hljs-attr">volumes:</span>      <span class="hljs-bullet">-</span> <span class="hljs-string">/var/run/docker.sock:/var/run/docker.sock</span>      <span class="hljs-bullet">-</span> <span class="hljs-string">/opt/stack/portainer-data:/data</span>`</div></div>✔ YAML je **soubor na disku**  
✔ Portainer ho **nikdy nebude ukládat do DB**  
✔ upgrade-safe

---

# 3️⃣ NASAZENÍ STACKU (RUČNĚ, BEZ UI)

⚠️ **Tohle je záměr** – první start vždy ručně.

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-cd-%2Fopt%2Fstack%2Fportai"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-built_in">cd</span> /opt/stack/portainerdocker compose up -d`</div></div>Ověření:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-docker-ps-%7C-grep-por"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`docker ps | grep portainer`</div></div>---

# 4️⃣ PRVNÍ PŘIHLÁŠENÍ DO PORTAINERU (KRITICKÉ)

Otevři v prohlížeči:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-https%3A%2F%2Fip_serveru%3A9"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`https:<span class="hljs-comment">//IP_SERVERU:9443</span>`</div></div>### Nastav:

- vytvoř **JEDEN admin účet**
- **neměň ho**
- **nemaž**
- **žádní další uživatelé** (pokud nejsou nutní)

📌 **RBAC změny = častý zdroj LIMITED**

---

# 5️⃣ JAK TENHLE STACK ZAREGISTRUJEŠ DO PORTAINERU (SPRÁVNĚ)

Teď to důležité.

### V Portainer UI:

1. **Stacks → Add stack**
2. **Build method: *File upload / Path***
3. **NE web editor**
4. Zadej **cestu k souboru**:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-%2Fopt%2Fstack%2Fportainer"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-regexp">/opt/</span>stack<span class="hljs-regexp">/portainer/</span>docker<span class="hljs-operator">-</span>compose.yml`</div></div>5. Deploy

📌 Portainer:

- uloží si **jen cestu**
- **NEOBSAH** YML
- **nevznikne LIMITED**
- upgrade je bezpečný

---

# 6️⃣ AKTUALIZACE PORTAINERU (BEZ RIZIKA)

Kdykoliv později:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-cd-%2Fopt%2Fstack%2Fportai-1"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-built_in">cd</span> /opt/stack/portainerdocker compose pulldocker compose up -d`</div></div>➡️ NIC jiného se nedotkne  
➡️ ŽÁDNÝ stack se nepřepne do LIMITED

---

# 7️⃣ REINSTALACE PORTAINERU (NUCLEAR SAFE)

Když se cokoliv posere:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-docker-stop-portaine"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`docker stop portainerdocker <span class="hljs-built_in">rm</span> portainer`</div></div>❗ **Stacky mimo Portainer běží dál** ❗

Pak znovu:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-cd-%2Fopt%2Fstack%2Fportai-2"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-built_in">cd</span> /opt/stack/portainerdocker compose up -d`</div></div>A v Portainer UI:

- znovu **Stacks → Add stack**
- znovu **Path**
- stejný soubor
- hotovo

---

# 8️⃣ PRAVIDLA, KTERÁ NESMÍŠ PORUŠIT (DŮLEŽITÉ)

❌ nepoužívej **Web editor**  
❌ nepoužívej **Git stack**  
❌ nekopíruj YML do UI  
❌ neupravuj stack v Portaineru

✔ YML **VŽDY** upravuj v:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-%2Fopt%2Fstack%2F%3Cnazev%3E%2Fd"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`/opt/stack/<nazev>/docker-compose.yml`</div></div>✔ Pak:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-docker-compose-up--d"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`docker compose up -d`</div></div>nebo **Redeploy** (file-based je OK)

---

# 🧠 PROČ TOHLE FUNGUJE (STRUČNĚ)

- Portainer **nevlastní YAML**
- nemá co porovnávat při upgradu
- nemá co označit jako „externí“
- ownership zůstává konzistentní
- **LIMITED NEMÁ JAK VZNIKNOUT**

---

# ✅ FINÁLNÍ CHECKLIST

✔ `/opt/stack/portainer/docker-compose.yml` existuje  
✔ Portainer stack je **file-based**  
✔ Data jsou v `/opt/stack/portainer-data`  
✔ Žádné Docker volume  
✔ Jeden admin  
✔ Žádný Web editor

➡️ **MÁŠ HOTOVO A BEZPEČNO**