Hoppa till huvudinnehåll

Hosting och Production 🌐

Ditt uppdrag 🎯

Ta din app från utvecklingsdator till internet där alla kan använda den:

  • Förstå skillnaden mellan development och production
  • Konfigurera din app för cloud hosting
  • Hantera environment variables säkert
  • Lösa vanliga deployment-problem

Viktigt: Du ska inte bara följa instruktioner! Du ska förstå VARFÖR varje steg behövs.

Från localhost till världen! 🚀

Hittills har din app bara funnits på localhost:5173. Nu ska vi få den att fungera på en riktig URL som yourapp.render.com som vem som helst kan besöka!

Fas 1: Förstå produktionsmiljöer 🧠

Steg 1: Development vs Production

Före du börjar, förstå skillnaderna:

Development (din dator):

  • npm run dev startar utvecklingsserver
  • Hot reload när du ändrar kod
  • Utvecklingsverktyg och felmeddelanden
  • SQLite-fil på din hårddisk
  • Alla secrets i .env fil

Production (molnet):

  • Optimerad, kompilerad kod
  • Ingen hot reload eller dev tools
  • Begränsade felmeddelanden
  • Databas måste vara persistent
  • Secrets måste hanteras säkert

Frågor att fundera på:

  1. Varför kan du inte bara kopiera din dev-mapp till en server?
  2. Vad händer med din SQLite-fil när servern startas om?
  3. Hur får dina hemligheter (API keys, etc.) till production utan att commita dem?

Steg 2: Välj hosting-provider

Olika alternativ:

ProviderFördelarNackdelarKostnad
RenderEnkelt, gratis tierBegränsad gratis tierGratis → $7/månad
VercelSuveränt för frontendKomplicerat för databaserGratis → $20/månad
RailwayBra för fullstackMindre dokumentation$5/månad
Fly.ioMycket kraftfulltSteep learning curveGratis → variabel

För denna modul använder vi Render eftersom det är enkelt att komma igång med.

Steg 3: Planera din deployment

Frågor att lösa först:

  1. Adapter: Vilken runtime ska din app köras i? (Node.js, Cloudflare, Deno?)
  2. Databas: Ska du använda samma SQLite eller uppgradera till PostgreSQL?
  3. Environment: Vilka variabler behöver vara olika i production?
  4. Build process: Vilka kommandon ska köras för att bygga din app?

Fas 2: Förbered din app för production 🔧

Steg 1: Ändra SvelteKit adapter

Problem: SvelteKit vet inte vilken runtime du ska använda.

Nuvarande situation:

// svelte.config.js
import adapter from '@sveltejs/adapter-auto';

adapter-auto gissar vilken plattform du använder, men det är inte tillförlitligt.

Din uppgift: Byt till Node.js adapter för Render.

# Ta bort auto adapter
npm uninstall @sveltejs/adapter-auto

# Installera Node adapter
npm install @sveltejs/adapter-node

Uppdatera konfiguration:

// svelte.config.js
import adapter from '@sveltejs/adapter-node';

export default {
kit: {
adapter: adapter()
}
};

Frågor att reflektera:

  • Vad tror du händer när du bygger med olika adapters?
  • Vad är skillnaden mellan adapters för Node vs Cloudflare vs Deno?

Steg 2: Konfigurera Node.js version

Problem: Render behöver veta vilken Node.js version din app kräver.

Lägg till i din package.json:

{
"name": "your-app",
"scripts": { ... },
"dependencies": { ... },
"engines": {
"node": ">=18"
}
}

Varför behövs detta?

  • Render kör din app på sina servrar
  • De behöver veta vilken Node.js version du utvecklat för
  • Olika versioner har olika features och buggar

Steg 3: Testa byggprocessen lokalt

Innan du deployer, testa att din app kan byggas:

# Bygg production-version
npm run build

# Testa production-servern lokalt
node build

Besök http://localhost:3000 och kontrollera:

  • Fungerar alla sidor?
  • Fungerar databas-operationer?
  • Finns det några fel i konsolen?

Felsökning om något inte fungerar:

  • Kolla build/ mappen - vad skapades?
  • Läs felmeddelanden noggrant
  • Jämför med din dev-version

Fas 3: Environment variables och säkerhet 🔒

Steg 1: Identifiera secrets

Vad i din app bör INTE vara publikt?

Kontrollera din .env fil:

# Vilka av dessa är känsliga?
DATABASE_URL="file:./dev.db"
API_KEY="sk-1234567890"
APP_URL="http://localhost:5173"

Kategorisera:

  • Secrets: Lösenord, API keys, secrets
  • Konfiguration: URLs, databas-anslutningar
  • Public: App-namn, publika API endpoints

Steg 2: Production environment variables

Fundera: Vilka värden bör vara annorlunda i production?

Development vs Production:

# Development
DATABASE_URL="file:./dev.db"
APP_URL="http://localhost:5173"
NODE_ENV="development"

# Production
DATABASE_URL="file:./prod.db" # Eller PostgreSQL URL
APP_URL="https://yourapp.render.com"
NODE_ENV="production"

Steg 3: Säkra secrets

Kritisk säkerhet: Committa ALDRIG secrets till Git!

Kontrollera din .gitignore:

.env
.env.local
.env.production
*.db
node_modules/

Verifiera:

# Kolla vad som är tracked av Git
git status

# Om .env visas - ta bort det OMEDELBART
git rm --cached .env
git commit -m "Remove .env from tracking"

Fas 4: Deploy till Render 🚀

Steg 1: Förbered Git repository

Render behöver din kod från GitHub/GitLab.

Om du inte redan har det:

# Skapa Git repo
git init
git add .
git commit -m "Initial commit"

# Pusha till GitHub/GitLab
# (Skapa först ett repo på GitHub)
git remote add origin https://github.com/yourname/yourapp.git
git push -u origin main

Steg 2: Skapa Render service

Gå till render.com och:

  1. Skapa konto och länka till GitHub
  2. Klicka "New +" → "Web Service"
  3. Välj din repository
  4. Konfigurera service

Konfigurations-utmaning:

SettingVad ska du sätta?Varför?
Nameyour-app-nameURL blir your-app-name.render.com
Branchmain eller masterVilken branch ska deployas
Root DirectoryTom (om hela repo är appen)Var package.json finns
RuntimeNodeVi använder Node.js adapter
Build Command?Vilka kommandon bygger din app?
Start Command?Vilket kommando startar din app?

Fundera själv: Vad ska Build Command och Start Command vara?

Tips om du fastnar...

Build Command: npm install && npx prisma generate && npm run build

  • Installerar dependencies
  • Genererar Prisma client för produktions-schema
  • Bygger SvelteKit app

Start Command: node build

  • Startar den byggda appen

Steg 3: Konfigurera environment variables

I Render dashboard:

  1. Gå till "Environment"
  2. Lägg till variabler

Vilka variabler behöver du sätta?

  • DATABASE_URL - var ska databas-filen ligga?
  • NODE_ENV - production
  • Andra secrets från din .env

Databas-utmaning: Vart ska du sätta DATABASE_URL?

# Alternativ A: Lokal fil på Render server
DATABASE_URL="file:./prod.db"

# Alternativ B: Extern PostgreSQL (mer robust)
DATABASE_URL="postgresql://user:pass@host:port/db"

För nu, börja med Alternativ A. Vi kan uppgradera senare.

Fas 5: Debug deployment-problem 🔍

Steg 1: Förstå deployment-loggar

När din deploy startar, titta på loggarna i real-time:

Build logs visar:

  • npm install progress
  • Prisma generation
  • SvelteKit build process
  • Eventuella fel

Runtime logs visar:

  • Server startup
  • HTTP requests
  • Fel i din app
  • Databas-operationer

Steg 2: Vanliga problem och lösningar

"Command not found: node"

Problem: Node.js version-problem Lösning: Kontrollera engines i package.json

"Cannot find module '@prisma/client'"

Problem: Prisma client genererades inte i build Lösning: Lägg till npx prisma generate i Build Command

"ENOENT: no such file or directory"

Problem: Databas-fil hittas inte Lösning: Kontrollera DATABASE_URL path

"Port 3000 is already in use"

Problem: Render tilldelar en annan port Lösning: Använd process.env.PORT || 3000

Steg 3: Iterativ debugging

Process för att lösa problem:

  1. Läs felmeddelandet noggrant
  2. Googla det exakta felmeddelandet
  3. Jämför med lokal build (npm run build && node build)
  4. Testa en förändring i taget
  5. Committa och pusha för ny deploy

Tålamod: Varje deploy tar 2-5 minuter!

Fas 6: Produktions-optimeringar 🎯

Steg 1: Prestanda-övervakning

När din app är live:

  1. Testa hastighet: PageSpeed Insights
  2. Testa uptime: Besök din app flera gånger per dag
  3. Övervaka loggar: Kolla Render dashboard regelbundet

Steg 2: Databas-upgrade (valfritt)

SQLite-begränsningar i production:

  • Data försvinner när server startas om
  • Ingen backup automatiskt
  • Begränsad concurrent access

PostgreSQL-fördelar:

  • Persistent data
  • Automatiska backups
  • Bättre prestanda
  • Mer robust

Om du vill uppgradera:

  1. Skapa PostgreSQL databas på Render
  2. Uppdatera DATABASE_URL
  3. Ändra provider i schema.prisma till postgresql
  4. Deploy igen

Steg 3: Custom domain (avancerat)

Standarddomän: your-app.render.com

Custom domain: yourawesomeapp.com

Process:

  1. Köp domän från registrar
  2. Konfigurera DNS records
  3. Lägg till domain i Render
  4. Aktivera SSL certificate

Utmaningar att lösa själv 🎯

Grundnivå:

  1. Få appen live på Render ✓
  2. Konfigurera environment variables
  3. Testa all funktionalitet i production ✓

Mellannivå:

  1. Sätt upp PostgreSQL istället för SQLite
  2. Implementera health check endpoint
  3. Lägg till error monitoring (console logs)

Expertnivå:

  1. Custom domain med SSL
  2. CI/CD pipeline med automatiska tester
  3. Multi-environment setup (staging + production)

Reflektion och lärande 🤔

Efter successful deployment:

Deployment-förståelse:

  • Vad var svårast med deployment-processen?
  • Vilka fel stötte du på och hur löste du dem?
  • Vad förstår du nu om production som du inte förstod innan?

Infrastructure-reflektion:

  • Hur skiljer sig production från development?
  • Vilka säkerhetsaspekter blev tydligare?
  • Vad skulle du göra annorlunda nästa gång?

Användarupplevelse:

  • Känns din app snabb/långsam i production?
  • Fungerar all funktionalitet som förväntat?
  • Vilka förbättringar vill du göra?

Framtida förbättringar 🔮

När du behärskar grunderna:

Säkerhet:

  • HTTPS enforcement
  • Security headers
  • Rate limiting
  • Input sanitization

Prestanda:

  • Caching strategies
  • Image optimization
  • Database indexing
  • CDN för statiska filer

Monitoring:

  • Error tracking (Sentry)
  • Analytics (Google Analytics)
  • Uptime monitoring
  • Performance metrics

Development workflow:

  • Staging environment
  • Automated testing
  • Database migrations
  • Blue-green deployments

Vanliga produktions-misstag ⚠️

Hardkodade development URLs

// DÅLIGT
const API_URL = 'http://localhost:5173/api';

// BÄTTRE
const API_URL = process.env.NODE_ENV === 'production'
? 'https://yourapp.render.com/api'
: 'http://localhost:5173/api';

Glöm environment variables

  • Appen fungerar lokalt men kraschar i production
  • Kontrollera att alla .env variabler finns i Render

Ignorera säkerhet

// DÅLIGT i production
app.use(cors({ origin: '*' }));

// BÄTTRE
app.use(cors({ origin: process.env.FRONTEND_URL }));

Ingen error handling

// DÅLIGT - okontrollerade exceptions krashar appen
await prisma.user.create(data);

// BÄTTRE
try {
await prisma.user.create(data);
} catch (error) {
console.error('Database error:', error);
return { error: 'Internal server error' };
}

Success checklist ✅

Din app är production-ready när:

  • Den är tillgänglig på en publik URL
  • All funktionalitet fungerar (testa allt!)
  • Inga secrets är committade till Git
  • Environment variables är korrekt konfigurerade
  • Error messages är användar-vänliga (inte tekniska stack traces)
  • Data persisteras mellan server-omstarter
  • Prestanda är acceptabel (< 3 sekunder load time)

Grattis! 🎉

Du har nu:

  • Gått från localhost till production
  • Lärt dig skillnaden mellan development och production
  • Förstått hur deployment och hosting fungerar
  • Skapat en app som vem som helst på internet kan använda!

Detta är en STOR milestone! De flesta programmerare tar månader att komma hit.

Du är nu en fullstack-utvecklare! 💪

Med en app live i production kan du visa den för vänner, familj, eller potentiella arbetsgivare. Du förstår hela stacken från databas till frontend till deployment!

Resurser för fördjupning 📚