# 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**