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:
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:
- soubory vlastní uživatel
vanekhv, - pro
git pullnepotřebujemesudo, - zdrojáky jsou oddělené od systémové konfigurace v
/etc, - zdrojáky jsou oddělené i od interního Docker storage.
~/docker-vps-tahak není místo, kde „žije container“.
Jsou tam pouze zdrojové soubory projektu.
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
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.
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