 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  GitHub Actions: deployment na VPS

# GitHub Actions: deployment na VPS — pełny workflow SSH

Opublikowano: 9 kwietnia 2026 · Kategoria: DevOps

GitHub Actions to platforma CI/CD zintegrowana bezpośrednio z repozytoriami GitHub. Pozwala automatyzować testy, budowanie i deployment bez konieczności utrzymywania zewnętrznego Jenkinsa czy GitLab CI. W tym artykule pokażemy kompletny workflow deploymentu aplikacji Node.js na VPS przez SSH, z użyciem secrets, matrix builds i cachingu — gotowy do skopiowania i dostosowania do twojego projektu.

## Struktura katalogu .github/workflows

GitHub Actions szuka plików YAML w katalogu `.github/workflows/` w głównym katalogu repozytorium. Każdy plik YAML to osobny workflow, który może mieć wiele jobów i kroków. Najpopularniejsze konwencje nazewnictwa to `ci.yml` (testy), `deploy.yml` (deployment produkcyjny) oraz `release.yml` (publikacja paczek).

Workflow można uruchomić na różne zdarzenia: push na branch, pull request, tag, cron, ręcznie przez UI (workflow\_dispatch) lub przez API. Dla deploymentu produkcyjnego zalecamy trigger na push do main albo tylko na tagi wersji (np. v1.0.0), żeby uniknąć przypadkowych deploy-ów.

## Pełny workflow deploy.yml z SSH

Poniżej kompletny workflow deploymentu aplikacji Node.js na VPS. Używa akcji `appleboy/ssh-action`, która zestawia połączenie SSH na podstawie secretów i wykonuje polecenia na zdalnym serwerze.

```
name: Deploy to VPS

on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [18, 20, 22]
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node.js ${{ matrix.node }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: 'pnpm'
      - run: pnpm install --frozen-lockfile
      - run: pnpm test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'pnpm'

      - name: Build
        run: |
          pnpm install --frozen-lockfile
          pnpm build

      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USER }}
          key: ${{ secrets.VPS_SSH_KEY }}
          port: 22
          script: |
            cd /var/www/app
            git pull origin main
            pnpm install --frozen-lockfile --prod
            pnpm build
            pm2 reload ecosystem.config.js --update-env
```

## Zarządzanie secrets i kluczami SSH

Secrets w GitHub Actions są szyfrowane i dostępne w workflowie przez notację `${{ secrets.NAZWA }}`. Do deploymentu potrzebujesz minimum trzech: host VPS, username i klucz prywatny SSH. Nigdy nie logują się do plików workflow, ale uważaj na `echo` — GitHub automatycznie maskuje tylko wartości, które dokładnie pasują do secretu.

Wygeneruj dedykowany klucz SSH tylko do deploymentu:

```
# Na lokalnej maszynie
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/deploy_key

# Dodaj klucz publiczny do VPS
ssh-copy-id -i ~/.ssh/deploy_key.pub deploy@twoj-vps.pl

# Skopiuj klucz prywatny do GitHub Secret VPS_SSH_KEY
cat ~/.ssh/deploy_key
```

Na VPS utwórz osobnego użytkownika `deploy` z ograniczonymi uprawnieniami (np. tylko do katalogu aplikacji i restart PM2). Nie używaj roota. Dodatkowo warto skonfigurować `sudoers` tak, żeby użytkownik deploy mógł wykonywać konkretne polecenia bez hasła.

## Porównanie typów runnerów

Runner

Cena/minuta

Użycie

Kiedy wybrać

ubuntu-latest

0.008 USD

x1 (baseline)

Domyślny — Node/Python/Go

windows-latest

0.016 USD

x2

Build .NET, MSVC, WinUI

macos-latest

0.08 USD

x10

iOS/macOS apps

self-hosted

darmowy

własny VPS

Dużo buildów, własny hardware

## Matrix builds i caching

Matrix strategy pozwala uruchomić ten sam job równolegle z różnymi parametrami. Najczęstsze zastosowania to testowanie kilku wersji Node.js, Pythona, albo testowanie na różnych systemach operacyjnych. Matrix dramatycznie skraca czas CI — zamiast sekwencyjnie sprawdzać 4 wersje (30 min łącznie), uruchamiamy 4 joby równolegle (7 min łącznie).

Cache to drugi wielki booster wydajności. `actions/cache@v4` zapisuje katalogi między runami workflow, dzięki czemu nie musisz pobierać node\_modules przy każdym buildzie. Klucz cache powinien zawierać hash pliku lock (package-lock.json, pnpm-lock.yaml), żeby automatycznie invalidować cache po zmianie dependencji.

Dla aplikacji Docker używaj `docker/build-push-action@v5` z parametrem `cache-from: type=gha` i `cache-to: type=gha,mode=max` — GitHub Actions cache obsługuje layer caching Dockera, co skraca rebuild image z 8 minut do 30 sekund przy drobnych zmianach kodu.

## Najczęstsze pytania

Czy GitHub Actions jest darmowy dla prywatnych repozytoriów? +

Tak, GitHub daje 2000 minut miesięcznie dla kont Free i 3000 minut dla kont Pro. Dla publicznych repozytoriów jest całkowicie darmowy. Po przekroczeniu limitu płacisz 0.008 USD za minutę (Linux runner).

Jak bezpiecznie przechowywać klucz SSH w GitHub Actions? +

Dodaj klucz prywatny jako GitHub Secret (Settings > Secrets and variables > Actions > New repository secret). Nigdy nie commituj kluczy do repozytorium. Używaj dedykowanego klucza tylko do deploymentu, z ograniczonymi uprawnieniami na VPS.

Co to jest matrix build w GitHub Actions? +

Matrix build pozwala uruchomić ten sam workflow równolegle z różnymi kombinacjami parametrów, np. testować aplikację na Node 18, 20 i 22 jednocześnie. Definiujesz go w strategy.matrix i GitHub automatycznie rozgałęzia joby.

Jak przyspieszyć build w GitHub Actions? +

Używaj actions/cache@v4 do cachowania node\_modules, Docker layer cache, artifacts do dzielenia plików między jobami. Unikaj niepotrzebnych kroków, używaj lekkich obrazów runner (ubuntu-latest zamiast windows-latest gdy możliwe).

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z rootem i SSH, idealny do deploymentu z GitHub Actions. Tanie plany i duża przestrzeń.

VPS

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

LH.pl

Hosting z dostępem SSH — możesz deployować przez GitHub Actions i rsync.

Hosting

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

Mikrus

Tani VPS do testowania pipelineów CI/CD i eksperymentów z deploymentem.

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

## Powiązane strony

-   [GitLab Runner: self-hosted setup](/baza-wiedzy/gitlab-runner-self-hosted)
-   [PM2 cluster mode dla Node.js](/baza-wiedzy/pm2-cluster-mode-nodejs)
-   [Zero-downtime deployment z Nginx](/baza-wiedzy/zero-downtime-deployment-nginx)
-   [Wszystkie artykuły](/baza-wiedzy/)