Hosting — přehled možností

Kde nasadit web závisí na typu projektu. Statické weby (HTML/CSS/JS bez serveru) jsou nejjednodušší a nejlevnější — mnoho platforem je hostuje zdarma.

VercelZdarma
  • Next.js, React, Vue, Svelte, statické weby
  • Deploy přímo z GitHubu, automatický na push
  • Edge Functions, serverless API routes
  • Preview deployments pro každý PR
  • Globální CDN, HTTPS automaticky
🦋
NetlifyZdarma
  • Statické weby, JAMstack, SPA
  • Netlify Functions (serverless)
  • Form handling bez backendu
  • Split testing, A/B testy
  • Deploy přes drag & drop nebo Git
🐙
GitHub PagesZdarma
  • Statické weby přímo z GitHub repozitáře
  • Ideální pro portfolio, dokumentaci
  • Vlastní doména zdarma
  • Jekyll integrace
  • Omezení: jen statický obsah
🚂
RailwayFreemium
  • Full-stack: Node.js, Python, databáze
  • PostgreSQL, Redis, MongoDB integrace
  • Docker podpora
  • Vhodné pro backend a API servery
🌊
DigitalOceanPlacené
  • VPS (Droplets), App Platform
  • Plná kontrola nad serverem
  • Managed databáze, Kubernetes
  • Pro produkční projekty s větší zátěží
☁️
AWS / GCP / AzureEnterprise
  • Neomezená škálovatelnost
  • S3/Cloud Storage pro statické soubory
  • Serverless (Lambda, Cloud Functions)
  • Složitější setup, enterprise zákazníci
Kapitola 1 / 8 Další: Vercel →

Vercel — deploy za 2 minuty

Vercel je nejjednodušší způsob, jak nasadit moderní web. Vytvoříte účet, připojíte GitHub repozitář a každý push automaticky spustí nový deployment.

První deployment — krok za krokem

bash — Vercel CLI
# 1. Nainstalujte Vercel CLI $ npm install -g vercel # 2. Přihlaste se $ vercel login Vercel CLI 33.0.0 ? Log in to Vercel (Use arrow keys) ❯ Continue with GitHub # 3. Deploy z projektu (první krát — interaktivní setup) $ cd muj-projekt $ vercel ? Set up and deploy "muj-projekt"? Yes ? Which scope? jana-novakova ? Link to existing project? No ? What's your project's name? muj-projekt ? In which directory is your code? ./ ✓ Deployed to https://muj-projekt-abc123.vercel.app # Příští deploymenty — jen push na main! $ git push origin main → Vercel automaticky spustí nový deployment # Deploy na produkci (přes CLI) $ vercel --prod

vercel.json — konfigurace projektu

{
  "buildCommand": "npm run build",
  "outputDirectory": "dist",
  "devCommand": "npm run dev",
  "installCommand": "npm install",

  "rewrites": [
    { "source": "/(.*)", "destination": "/index.html" }
  ],

  "headers": [
    {
      "source": "/static/(.*)",
      "headers": [
        { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }
      ]
    }
  ],

  "redirects": [
    { "source": "/old-url", "destination": "/new-url", "permanent": true }
  ]
}
💡
SPA rewriting: Pro React Router, Vue Router nebo jakýkoliv SPA router přidejte rewrite pravidlo — všechny URL routujte na /index.html. Jinak 404 při přímém přístupu na /o-nas.

🧠 Kvíz: Co jsou "Preview deployments" na Vercelu?

Kapitola 2 / 8 Další: Netlify →

Netlify — JAMstack specialista

Netlify je výbornou alternativou k Vercelu, zvláště pro statické weby a JAMstack. Má jedinečnou funkci — form handling bez backendu.

bash — Netlify CLI
$ npm install -g netlify-cli $ netlify login # Deploy složky dist/ $ netlify deploy --dir=dist ✓ Draft deploy: https://abc123--muj-web.netlify.app # Produkční deploy $ netlify deploy --dir=dist --prod ✓ Deploy live: https://muj-web.netlify.app

netlify.toml — konfigurace

[build]
  command   = "npm run build"
  publish   = "dist"

[[redirects]]
  from = "/*"
  to   = "/index.html"
  status = 200   # SPA routing

[[headers]]
  for = "/static/*"
    [headers.values]
    Cache-Control = "public, max-age=31536000, immutable"

[context.deploy-preview]
  command = "npm run build -- --mode staging"

Netlify Forms — formulář bez backendu

<!-- Přidejte data-netlify="true" — Netlify zpracuje formulář -->
<form name="kontakt" method="POST" data-netlify="true">
  <input type="hidden" name="form-name" value="kontakt">
  <input type="text"  name="jmeno"  placeholder="Jméno" required>
  <input type="email" name="email"  placeholder="Email" required>
  <textarea          name="zprava" placeholder="Zpráva"></textarea>
  <button type="submit">Odeslat</button>
</form>
<!-- Výsledky vidíte v Netlify Dashboard → Forms -->
Kapitola 3 / 8 Další: CI/CD →

CI/CD & GitHub Actions

CI/CD (Continuous Integration / Continuous Deployment) automatizuje testování a nasazení kódu. Každý push spustí pipeline — testy, build, deployment.

⬆️
git push main
🧪
Testy (Jest, ESLint)
🔨
Build (Vite, webpack)
🚀
Deploy (Vercel, Netlify)
📊
Monitoring (Sentry, GA)

GitHub Actions — základní workflow

# .github/workflows/deploy.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

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

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test

      - name: Build
        run: npm run build
        env:
          VITE_API_URL: ${{ secrets.VITE_API_URL }}

  deploy:
    needs: test           # spustí se jen po úspěšných testech!
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'   # jen pro main branch
    steps:
      - uses: actions/checkout@v4

      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'

🧠 Kvíz: Co znamená needs: test v GitHub Actions workflow?

Environment Variables

Proměnné prostředí (env vars) oddělují konfiguraci od kódu. API klíče, URL databáze, tajné tokeny — nikdy ne přímo v kódu, vždy v env vars.

Soubory .env (nikdy do Gitu!)

# .env.local — lokální vývoj (v .gitignore!)
VITE_API_URL=http://localhost:3000
VITE_API_KEY=dev_tajny_klic_123
DATABASE_URL=postgresql://localhost/dev_db
# .env.example — šablona pro tým (DO Gitu!)
VITE_API_URL=https://api.example.com
VITE_API_KEY=your_api_key_here
DATABASE_URL=postgresql://user:pass@host/db
// Vite — prefix VITE_ pro frontend env vars
// (ostatní jsou dostupné jen na serveru!)
const apiUrl = import.meta.env.VITE_API_URL;
const isProd  = import.meta.env.PROD;    // boolean
const isDev   = import.meta.env.DEV;     // boolean
const mode    = import.meta.env.MODE;    // "development" | "production"

// Node.js / server-side
const dbUrl = process.env.DATABASE_URL;
const port  = process.env.PORT ?? 3000;

// TypeScript — rozšíření typů pro env vars
// vite-env.d.ts nebo env.d.ts
interface ImportMetaEnv {
  readonly VITE_API_URL: string;
  readonly VITE_API_KEY: string;
}
interface ImportMeta {
  readonly env: ImportMetaEnv;
}

Nastavení env vars na platformách

PlatformaKde nastavitPoznámka
VercelDashboard → Project → Settings → Environment VariablesLze nastavit pro Production/Preview/Development zvlášť
NetlifySite settings → Build & deploy → EnvironmentKontextové proměnné per branch
GitHub ActionsRepo → Settings → Secrets and variables → ActionsSecrets jsou šifrované, Variables jsou viditelné
RailwayDashboard → VariablesSdílené mezi service instances
🚨
NIKDY do Gitu! API klíče, hesla, connection stringy. Pokud omylem přidáte tajný klíč do Gitu — nestačí smazat commit! Klíč je kompromitován, musíte ho okamžitě zneplatnit a vygenerovat nový. GitHub má automatický secret scanning.
Kapitola 5 / 8 Další: Docker →

Docker — úvod

Docker zabalí aplikaci i všechny závislosti do přenositelného "kontejneru". "Na mém stroji to funguje" problém zmizí — kontejner běží stejně všude.

# Dockerfile — popis jak sestavit kontejner
FROM node:20-alpine AS builder

WORKDIR /app

# Nejdřív zkopírovat package.json (cache layer)
COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

# Produkční stage — jen nginx + build output
FROM nginx:alpine AS production

COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
bash — Docker základní příkazy
# Sestavit image $ docker build -t muj-web:latest . Successfully built abc123def456 Successfully tagged muj-web:latest # Spustit kontejner $ docker run -p 8080:80 muj-web:latest Web server běží na http://localhost:8080 # docker-compose pro více služeb $ docker-compose up -d # Seznam běžících kontejnerů $ docker ps
# docker-compose.yml — vývojové prostředí s databází
version: '3.8'
services:
  web:
    build: .
    ports: ["3000:3000"]
    environment:
      - DATABASE_URL=postgresql://postgres:heslo@db:5432/mydb
    depends_on: [db]
    volumes:
      - .:/app          # live reload pro vývoj
      - /app/node_modules

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: heslo
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

🧠 Kvíz: Co je "multi-stage build" v Dockeru (viz Dockerfile výše s AS builder a AS production)?

Kapitola 6 / 8 Další: Cvičení →

Praktické cvičení — GitHub Actions workflow

Napište GitHub Actions workflow soubor pro projekt s Vite. Pipeline musí: nainstalovat závislosti, spustit ESLint, spustit build, a při push na main deployovat na Vercel.

📋
Checklist: on: push: branches: [main], job test s kroky checkout + setup-node + npm ci + lint + build, job deploy s needs: test + if: github.ref == 'refs/heads/main', env vars z secrets.
# Napište obsah souboru .github/workflows/deploy.yml
# Vzor pro Vite + Vercel deployment

name: CI/CD

on:
  # TODO: trigger na push na main a PR na main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      # TODO: checkout, setup node 20, npm ci, lint, build

  deploy:
    # TODO: needs test, podmínka jen pro main, deploy na Vercel
🚀
Rychlý start pro vlastní projekt: Nejrychlejší cesta k deployment — GitHub + Vercel, žádná konfigurace. Přejděte na vercel.com → "Add New Project" → importujte GitHub repo → Deploy. Hotovo za 2 minuty.
🏅

Odznak: Deployment Engineer

Zvládáte Vercel, Netlify, GitHub Actions, env vars a Docker základy.

Kapitola 7 / 8 Další: Taháček →

Taháček — Deployment reference

Vercel — nejrychlejší start

bash
$ npm i -g vercel && vercel login $ vercel # první deploy $ vercel --prod # produkční deploy

GitHub Actions zkratka

on:
  push:
    branches: [main]
jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20', cache: 'npm' }
      - run: npm ci
      - run: npm run lint
      - run: npm run build

Zlatá pravidla

  • .env.local v .gitignore — vždy
  • .env.example do Gitu — dokumentuje potřebné proměnné
  • ✅ Tajné klíče v GitHub Secrets, ne v kódu
  • ✅ Preview deploy pro každý PR
  • ✅ Deploy jen po úspěšných testech (needs: test)
  • ✅ Multi-stage Dockerfile pro malé produkční image
  • ❌ API klíče přímo v kódu nebo v README
  • ❌ Deploy přímo na produkci bez testů
Lekce 14 dokončena! Lekce 15: Závěr & Next Steps →