## Змінні для налаштування
Замінити в інструкції нижче:
```
{{APP_NAME}} = App name
{{APP_DIR}} = dir on the server
{{SERVER_IP}} = 0.0.0.0
{{SERVER_USER}} = user
{{GITHUB_USERNAME}} = github username
{{GITHUB_REPO}} = github repo name
{{SSH_KEY_NAME}} = github_deploy
{{NGINX_DOMAIN}} = domain name or ip
{{DOCKER_PORT}} = 8080
```
## На сервері
### 1. Встановлення
```bash
# Docker та Docker Compose
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
rm get-docker.sh
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Додай користувача в docker group
sudo usermod -aG docker $USER
newgrp docker
# Nginx (reverse proxy)
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
```
### 2. Налаштування Nginx
```bash
sudo nano /etc/nginx/sites-available/{{APP_NAME}}
```
```nginx
server {
listen 80;
server_name {{NGINX_DOMAIN}};
location / {
proxy_pass http://localhost:{{DOCKER_PORT}};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
```
```bash
sudo ln -s /etc/nginx/sites-available/{{APP_NAME}} /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```
### 3. SSH ключ для GitHub
```bash
# Генеруй SSH ключ
ssh-keygen -t ed25519 -C "{{APP_DIR}}-deploy" -f ~/.ssh/{{SSH_KEY_NAME}} -N ""
# Скопіюй публічний ключ
cat ~/.ssh/{{SSH_KEY_NAME}}.pub
# Налаштуй SSH config
nano ~/.ssh/config
```
Додай в `~/.ssh/config`:
```
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/{{SSH_KEY_NAME}}
IdentitiesOnly yes
```
```bash
# Права на SSH
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/{{SSH_KEY_NAME}}
```
### 4. Клонування репо
```bash
mkdir -p ~/{{APP_DIR}}
cd ~/{{APP_DIR}}
git clone git@github.com:{{GITHUB_USERNAME}}/{{GITHUB_REPO}}.git
cd {{GITHUB_REPO}}
```
### 5. Перший запуск
```bash
cd ~/{{APP_DIR}}/{{GITHUB_REPO}}
docker compose up -d
```
---
## На GitHub
### 1. Додай Deploy Key
На сервері скопіюй публічний ключ:
```bash
cat ~/.ssh/{{SSH_KEY_NAME}}.pub
```
На GitHub:
- **Settings → Deploy keys → Add deploy key**
- Назва: `{{APP_DIR}}-server`
- Вставь публічний ключ
- ✅ Allow write access
### 2. Додай GitHub Secrets
**Settings → Secrets and variables → Actions → New repository secret**
```
SERVER_IP = {{SERVER_IP}}
SERVER_USER = {{SERVER_USER}}
SERVER_PORT = 22
DEPLOY_KEY = (вміст ~/.ssh/{{SSH_KEY_NAME}} - приватний ключ)
```
### 3. Додай workflow файл
Створи `.github/workflows/deploy.yml` з вмістом нижче.
---
## deploy.yml
```yaml
name: Deploy to Production
on:
push:
branches:
- main
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.DEPLOY_KEY }}
port: ${{ secrets.SERVER_PORT }}
script: |
set -e
cd ~/{{APP_DIR}}/{{GITHUB_REPO}}
echo "📥 Pulling latest code..."
git pull origin main
echo "🏗️ Building Docker images..."
docker compose build --no-cache
echo "⛔ Stopping old containers..."
docker compose down
echo "🚀 Starting new containers..."
docker compose up -d
echo "✅ Deployment complete!"
docker compose ps
```
## Перевірка
з сервера
```bash
git remote -v
```
якщо бачимо https, виконуємо наступну команду:
```bash
git remote set-url origin git@github.com:
```
Має підключатись без помилок:
```bash
ssh -T git@github.com
```