Tutorial

Od git push do prod w 90 sekund

Konkretny pipeline: SSH key → Terraform → GitHub Actions → deploy. Pięć komend, gotowe. Bez Dockera, bez K8s, bez Helma.

SimpleCloud· 28 kwietnia 2026· 7 min czytania
Pipeline Git → Terraform → Server → Globe z 5 krokami — deployment workflow

Standardowa droga „od commita do produkcji" w Big Tech world to:

Razem 30+ minut. Dla solo-deva z aplikacją Node/Python/Go to często overkill. Można szybciej.

Setup raz, używaj zawsze

1. Wygeneruj klucz SSH (10 sekund)

ssh-keygen -t ed25519 -f ~/.ssh/simplecloud -N ""

2. Postaw VM-kę przez Terraform (40 sekund)

Stwórz main.tf:

terraform {
  required_providers {
    poland-whitesky-cloud = {
      source = "poland-whitesky-cloud/poland-whitesky-cloud"
    }
  }
}

provider "poland-whitesky-cloud" {
  client_jwt = var.jwt
}

resource "poland-whitesky-cloud_cloudspace" "main" {
  name                = "prod"
  customer_id         = var.customer_id
  location            = "pl-war-dc01-002"
  external_network_id = 1
}

resource "poland-whitesky-cloud_machine" "app" {
  name          = "app1"
  cloudspace_id = poland-whitesky-cloud_cloudspace.main.id
  vcpus         = 2
  memory        = 4096
  disk_size     = 30
  image_id      = 11   # Ubuntu Server 24.04
  user_data     = templatefile("cloud-init.yaml", {
    pubkey = file("~/.ssh/simplecloud.pub")
  })
}

resource "poland-whitesky-cloud_port_forwarding" "ssh" {
  cloudspace_id = poland-whitesky-cloud_cloudspace.main.id
  vm_id         = poland-whitesky-cloud_machine.app.id
  public_port   = 22
  local_port    = 22
  protocol      = "tcp"
}

resource "poland-whitesky-cloud_port_forwarding" "https" {
  cloudspace_id = poland-whitesky-cloud_cloudspace.main.id
  vm_id         = poland-whitesky-cloud_machine.app.id
  public_port   = 443
  local_port    = 443
  protocol      = "tcp"
}

output "public_ip" {
  value = poland-whitesky-cloud_cloudspace.main.external_network_ip
}

I cloud-init.yaml:

#cloud-config
users:
  - name: deploy
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    ssh-authorized-keys:
      - ${pubkey}
package_update: true
packages:
  - nginx
  - git
  - nodejs
  - npm
runcmd:
  - mkdir -p /var/www/app && chown deploy:deploy /var/www/app
  - systemctl enable --now nginx

terraform init && terraform apply — czterdzieści sekund i masz VM-kę z gotowym stackiem, kluczem SSH i otwartymi portami.

3. Dodaj GitHub Actions deploy (10 sekund)

W repo aplikacji stwórz .github/workflows/deploy.yml:

on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SSH_HOST }}
          username: deploy
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /var/www/app
            git pull
            npm ci --production
            sudo systemctl restart app

W GitHub repo Settings → Secrets dodaj:

4. Pierwszy deploy (30 sekund)

ssh -i ~/.ssh/simplecloud deploy@$(terraform output -raw public_ip) \
  'git clone https://github.com/you/repo /var/www/app && cd /var/www/app && npm ci'

5. Loop: git push (90 sekund e2e)

Od teraz każdy git push origin main triggeruje workflow → deploy w 60-90 sekund.

Co dostałeś

Pro tip. Rozdziel terraform.tfstate od repo aplikacji — trzymaj infra w osobnym repo (np. my-infra). Wtedy app deploy nie wpływa na infra state, a każda zmiana w infrastrukturze idzie przez osobny PR z terraform plan w komentarzu.

Kiedy ten setup pęka

Dla 95% MVP scenariuszy ten setup wystarczy do pierwszego klienta enterprise.

SimpleCloud sign-off

terraform apply, git push, curl healthcheck. To wszystko, czego potrzebujesz na MVP. SimpleCloud daje API + Terraform + 14 zł/mc startowo. Hourly billing = wyłącz na noc, wpłać 60% mniej.