kapitola 4

Git, GitHub a nový deploy

Jak jsme oddělili vývoj na lokálním PC od nasazování na VPS.

Repo na VPS

cd ~/docker-static
git init
git branch -m main

Git vytvoří skrytý adresář .git. Ten obsahuje historii a metadata repozitáře.

git status
git add Dockerfile index.html .dockerignore
git diff --cached
git commit -m "Initial Docker static site"

Tok změny:

working directory ↓ git add staging area ↓ git commit Git historie

Remote GitHub

git remote add origin git@github.com:USER/REPO.git
git remote -v

origin je běžná lokální přezdívka pro hlavní vzdálený repozitář.

SSH key na VPS jako Deploy key

ssh-keygen -t ed25519 -C "VPS GitHub"

Vznikne:

~/.ssh/id_ed25519       # private – nikdy neposílat
~/.ssh/id_ed25519.pub   # public – lze přidat na GitHub

Na serveru je vhodné použít Deploy key jen pro konkrétní repo.

ssh -T git@github.com
git push -u origin main

SSH key na vývojářském Windows PC

Existující klíč pro jiný server není dobré bezmyšlenkovitě přepisovat. Pro GitHub jsme vytvořili vlastní:

ssh-keygen -t ed25519 \
  -C "moje@email.cz" \
  -f "$env:USERPROFILE\.ssh\id_ed25519_github"

Do C:\Users\...\ .ssh\config:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
    IdentitiesOnly yes
ssh -T git@github.com

Clone na lokální PC

git clone git@github.com:USER/REPO.git
cd REPO
git status
git log --oneline

Po clone máme stejné commity lokálně i na GitHubu.

Kam na VPS klonovat repozitář?

Git repozitář není potřeba dávat do nginx adresářů ani do Dockeru. Je to pouze zdrojový kód, ze kterého budeme následně stavět Docker image.

Pro náš jednoduchý VPS jsme repozitáře umístili přímo do home adresáře běžného uživatele:

/home/vanekhv/
  ├── docker-static/
  └── docker-vps-tahak/

To má několik výhod:

Důležité: adresář ~/docker-vps-tahak není místo, kde „žije container“. Jsou tam pouze zdrojové soubory projektu.
/home/vanekhv/docker-vps-tahak/ │ │ docker build ▼ Docker image │ │ docker run ▼ Docker container

Docker images a containery si Docker ukládá a spravuje sám ve svém interním úložišti. Nejsou uvnitř adresáře Git repozitáře.

Naklonování projektu

cd ~
  git clone https://github.com/USER/REPO.git
  cd REPO

cd ~ znamená přejít do home adresáře aktuálního uživatele. U našeho uživatele je to:

/home/vanekhv

git clone vytvoří nový adresář, stáhne pracovní soubory a zároveň kompletní Git metadata do skrytého adresáře .git.

ls -la
  git status
  git log --oneline

Před Git příkazy je vždy dobré zkontrolovat, že opravdu stojíme uvnitř správného repozitáře. Po novém SSH přihlášení totiž typicky začínáme znovu v /home/vanekhv.

Celý deploy cyklus

WINDOWS upravím HTML/CSS/JS ↓ git add git commit git push ↓ GITHUB ↓ VPS git pull ↓ docker build ↓ nový image ↓ starý container stop + rm ↓ nový container ↓ nginx pořád proxyuje na stejný port ↓ nová verze webu

Důležitý princip: git pull ještě není deploy

Na VPS:

git pull

změní pouze zdrojové soubory. Běžící container pořád používá starý image.

Nový image:

sudo docker build -t docker-static:v2 .

Pak výměna containeru:

sudo docker stop docker-static
sudo docker rm docker-static

sudo docker run \
  --name docker-static \
  --restart unless-stopped \
  -p 127.0.0.1:8080:80 \
  -d \
  docker-static:v2

Proč ne git pull uvnitř běžícího containeru?

Technicky by to šlo, ale image by zůstal starý a container by byl ručně změněný. Po jeho odstranění by se nově vytvořený container vrátil ke staré verzi.

Lepší princip: konkrétní Git commit → konkrétní Docker image → konkrétní container.

Restart policy

sudo docker update --restart unless-stopped docker-static

sudo docker inspect \
  -f '{{.HostConfig.RestartPolicy.Name}}' \
  docker-static

Díky unless-stopped se aplikace po rebootu VPS automaticky vrátí.

sudo reboot

Po restartu jsme ověřili:

systemctl status nginx
systemctl status docker
sudo docker ps
curl -I https://docker.example.cz