Prototypdriven utveckling
Från ren Windows-installation till en containeriserad webbprototyp som auto-deployas till Sundsvalls testbädd. Detta material är ett stöd för utvecklare som arbetar med prototyper enligt Sundsvalls kommuns metod för prototypdriven utveckling.
Om materialet
Det här materialet fungerar som en genomgång att följa från början första gången du sätter upp miljön, och som ett löpande referensstöd under utvecklingen av idéprototyper inom Nivå 02 av Sundsvalls kommuns metod för prototypdriven utveckling. Använd innehållsförteckningen för att hoppa direkt till den fas du befinner dig i.
Vad du kan när du gått igenom materialet
- Sätta upp en utvecklingsmiljö för prototyparbete i WSL med Claude Code
- Skapa idéprototyp i Claude.ai och översätta den till en utvecklingsplan
- Bygga lösningen med stöd för tillgänglighetskrav och testdriven utveckling
- Köra tillgänglighetstester innan du driftsätter
- Auto-deploya en containeriserad app till Sundsvalls Dokploy-testbädd via GitHub-webhook
Förkrav
Innan du börjar behöver du:
- Windows 10 (version 2004 eller senare) eller Windows 11
- Administratörsbehörighet på datorn
- Ett GitHub-konto — skapa på github.com om du inte har ett
- Ett Claude-konto med Pro-, Max-, Team-, Enterprise- eller Console-plan — gratisplanen på Claude.ai inkluderar inte Claude Code
- Aktiverad virtualisering i BIOS — för det mesta påslaget från fabrik på moderna datorer
- För deployment-steget: tillgång till Sundsvalls Dokploy-instans samt en användare med rätt att skapa applikationer
Fas I
Teknisk guide
Installation och setup. Engångsarbete som etablerar din lokala utvecklingsmiljö — WSL, Ubuntu, Node.js, Claude Code och Git mot GitHub.
Steg ett
Installera WSL med Ubuntu
WSL (Windows Subsystem for Linux) låter dig köra ett riktigt Linux-system inuti Windows. Det är där Claude Code kommer att leva.
Öppna PowerShell som administratör. Högerklicka på Start-menyn och välj "Terminal (administratör)" eller "Windows PowerShell (administratör)".
Kör installationskommandot:
wsl --install -d Ubuntu
Det här kommandot installerar både WSL 2 och Ubuntu på en gång.
Starta om datorn när du blir ombedd.
Efter omstart öppnas Ubuntu vanligtvis automatiskt i ett nytt fönster. Om det inte händer inom någon minut: tryck på Windows-tangenten, skriv "Ubuntu" och klicka på Ubuntu-appen.
Vänta tills installationen är klar — det kan ta några minuter — och skapa sedan:
- Ett användarnamn — små bokstäver, inga mellanslag (t.ex.
anna) - Ett lösenord — du kommer inte se några tecken när du skriver, det är normalt
sudo.Kontrollera att du är inne i Ubuntu. Din prompt ska se ut ungefär så här:
anna@datornamn:~$
Om du ser PS C:\... är du fortfarande i PowerShell — då har något gått fel.
Så öppnar du Ubuntu i framtiden
Det är viktigt att förstå att Ubuntu är en separat applikation från PowerShell. Resten av guiden förutsätter att du står i Ubuntu-terminalen. Om du stängt fönstret eller startat om datorn:
- Tryck på Windows-tangenten och börja skriva "Ubuntu"
- Klicka på Ubuntu-appen som dyker upp
- Ett terminalfönster öppnas direkt — inget lösenord behövs för att öppna det (men sudo-kommandon inuti kräver det)
+ i flikraden och välj Ubuntu för att öppna en ny Ubuntu-flik.Med Ubuntu öppet, kontrollera att allt fungerar genom att fråga efter Ubuntu-versionen:
lsb_release -a
Du ska se något i stil med Ubuntu 24.04 LTS. Då är du redo för nästa steg.
Steg två
Uppdatera Ubuntu & installera nödvändiga verktyg
anna@dator:~$ betyder Ubuntu, PS C:\... betyder PowerShell.Uppdatera systemet:
sudo apt update && sudo apt upgrade -y
Detta kan ta några minuter första gången. Skriv ditt Ubuntu-lösenord när det efterfrågas.
Installera grundläggande verktyg:
sudo apt install -y curl git build-essential
Installera nvm (Node Version Manager) — det enklaste sättet att hantera Node.js:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
Ladda om terminalen så att nvm blir tillgängligt:
source ~/.bashrc
Installera senaste LTS-versionen av Node.js:
nvm install --lts
nvm use --lts
Verifiera installationen:
# bör visa v20.x.x eller senare
node --version
# bör visa 10.x.x eller senare
npm --version
which node och kontrollera att den inte börjar med /mnt/c/....Steg tre
Installera Claude Code
Den rekommenderade metoden är den nya native-installern, som inte kräver Node.js för själva binären.
Kör (fortfarande i Ubuntu-terminalen):
curl -fsSL https://claude.ai/install.sh | bash
Verifiera installationen:
claude --version
Om kommandot inte hittas, stäng terminalen och öppna en ny — PATH behöver uppdateras.
Starta Claude Code för första gången:
claude
Första gången du kör claude får du några frågor i terminalen:
- Välj autentiseringsmetod — välj "Claude account with subscription" om du har Pro/Max/Team. Välj "Anthropic Console (API)" om du har en Console-plan med API-nycklar.
- Bekräfta i webbläsaren — en webbläsare öppnas i Windows där du loggar in på ditt Claude-konto och godkänner åtkomsten. Om webbläsaren inte öppnas automatiskt: kopiera URL:en som visas i terminalen och klistra in den manuellt.
- Återgå till terminalen — när du godkänt i webbläsaren ser du en bekräftelse i terminalen, och Claude Code startar i interaktivt läge.
Du är nu inne i Claude Code och kan börja chatta. För att avsluta skriver du /exit och trycker Enter (eller Ctrl+C två gånger).
Kontrollera att allt är friskt. Tillbaka i Ubuntu-terminalen (utanför Claude Code), kör:
claude doctor
Detta diagnostiserar din installation och flaggar eventuella problem.
npm install -g @anthropic-ai/claude-code. Använd inte sudo med npm — det skapar behörighetsproblem.Steg fyra
Konfigurera Git och GitHub
För att kunna synka mot GitHub behöver Git veta vem du är, och GitHub behöver kunna verifiera dig.
Sätt namn och e-post (använd e-postadressen kopplad till ditt GitHub-konto):
git config --global user.name "Ditt Namn"
git config --global user.email "din.epost@example.com"
Sätt main som standard för nya repon (modern konvention):
git config --global init.defaultBranch main
Generera en SSH-nyckel för GitHub:
ssh-keygen -t ed25519 -C "din.epost@example.com"
Tryck Enter för att acceptera standardplats. Du kan välja en passphrase eller lämna tomt (Enter två gånger).
Starta SSH-agenten och lägg till nyckeln:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Kopiera den publika nyckeln. Den enklaste metoden i WSL är att skicka direkt till Windows-urklipp:
cat ~/.ssh/id_ed25519.pub | clip.exe
Nyckeln ligger nu i urklippet — redo att klistras in på GitHub. Vill du se den först, kör cat ~/.ssh/id_ed25519.pub separat. Den börjar med ssh-ed25519 och slutar med din e-post.
Lägg till nyckeln i GitHub:
# 1. Gå till github.com/settings/keys
# 2. Klicka "New SSH key"
# 3. Title: "WSL Ubuntu – min laptop"
# 4. Klistra in nyckeln och klicka "Add SSH key"
Testa anslutningen:
ssh -T git@github.com
Du får en varning om okänd värd första gången — skriv yes. Sedan ska du se: Hi <ditt-användarnamn>! You've successfully authenticated...
Fas II
Skapa idéprototyp
Förberedelser inför utveckling. Här går du från idé till en konkret plan med tydliga ramar för teknikval, tillgänglighet och testning innan en enda rad kod skrivs i utvecklingsmiljön.
Steg fem · Fas II
Skapa idéprototyp i Claude.ai
Innan en lösning byggs på riktigt skapar du en idéprototyp i Claude.ai — en klickbar skiss av tjänsten som visar vad den gör och hur den känns att använda. Syftet är att tidigt få fram något konkret att resonera kring, både internt i teamet och med tilltänkta användare.
Logga in på claude.ai och starta en ny chatt. Beskriv vad prototypen ska göra — fokus ska ligga på användarvärde och flöde, inte teknik.
Skapa en interaktiv prototyp av en webbtjänst där en medborgare kan anmäla en felaktig gatlykta. Användaren ska kunna ange plats på en karta, ladda upp en bild, och få bekräftelse med ett ärendenummer. Gör det som en artefakt i React.
Claude svarar med en körbar artefakt — en interaktiv komponent som öppnas i en panel till höger. Du kan klicka runt i prototypen direkt.
Iterera. Begär ändringar i naturligt språk:
Lägg till ett steg där användaren kan välja typ av fel (släckt, blinkar, skadad armatur). Lägg också till en bekräftelse-skärm med ett uppskattat åtgärdsdatum.
Claude uppdaterar artefakten utan att du behöver börja om. Fortsätt tills prototypen visar de viktigaste flödena och du har något att visa upp.
Dela prototypen för feedback. Klicka på "Publish"-knappen i artefakten — det skapar en publik länk till en körbar version som du kan skicka till intressenter eller tilltänkta användare för feedback.
Spara prototypen och chatten som underlag inför utvecklingsfasen. Du kommer behöva både den körande prototypen och den dialog som ledde fram till den när du senare skapar en utvecklingsplan.
[Platshållare: komplettera med Sundsvalls kommuns specifika riktlinjer för idéprototyper inom Nivå 02 — t.ex. krav på dokumentation, godkännandeprocess innan utveckling, vilka intressenter som ska involveras.]
Steg sex · Fas II
Skapa en utvecklingsplan
När idéprototypen är godkänd för vidare utveckling är nästa steg att översätta den till en konkret utvecklingsplan. Planen är det styrdokument som följer med projektet hela vägen genom utvecklingsfasen och fungerar både som kontrakt med beställare och som instruktion till Claude Code.
Be Claude.ai (samma chatt där prototypen skapades) sammanfatta prototypen i en utvecklingsplan:
Baserat på prototypen ovan, skapa en utvecklingsplan som innehåller: (1) en kort produktbeskrivning, (2) en lista över viktigaste funktionerna i prioritetsordning, (3) datamodell, (4) tekniska beroenden, (5) en föreslagen utvecklingsordning i konkreta steg. Returnera som markdown.
Komplettera planen med tre avgörande tilläggsavsnitt — dessa är obligatoriska för prototyper inom Nivå 02 och behandlas i detalj i steg 7–9:
- Teknikstack & ramverk — vilka verktyg, språk och bibliotek ska användas?
- Tillgänglighetskrav — vilken WCAG-nivå ska uppnås och vilka funktioner är särskilt känsliga?
- Testdriven utveckling — vilka delar är affärskritiska och kräver tester?
Planen är inte komplett förrän dessa tre områden är tydligt definierade.
Spara den färdiga planen som PLAN.md i projektets framtida rot. Den används senare av Claude Code för att förstå projektets sammanhang.
/init som genererar en CLAUDE.md baserad på koden — men om PLAN.md redan finns kommer Claude automatiskt läsa den och använda den som kontext för all utveckling.Steg sju · Fas II
Teknikstack & ramverk
Innan utvecklingen börjar ska planen vara explicit om vilka tekniker som används. Det här minskar friktion senare och säkerställer att prototypen kan deployas och förvaltas inom kommunens befintliga infrastruktur.
- Frontend-ramverk (t.ex. React, Vue, Svelte — eller specifik version/meta-ramverk som Next.js)
- Stylinglösning (t.ex. Tailwind, CSS Modules, vanilla CSS, kommunens designsystem om sådant finns)
- Backend-ramverk (t.ex. Node.js + Express, Python + FastAPI, .NET)
- Databas (PostgreSQL, SQLite för prototyper, etc.)
- Autentisering (om kommunen har en standardlösning, t.ex. SITHS, BankID, eIDAS)
- API-konventioner (REST, GraphQL, OpenAPI-spec)
- Förbjudna eller starkt avrådda val (licens, säkerhet, etc.)
Generella riktlinjer i väntan på spec
Tills den kommunala specifikationen är klar, följ dessa principer:
- Välj välbeprövat. En prototyp ska bevisa idén, inte teknikvalet. Använd ramverk med stora communities och god dokumentation.
- Välj samma stack som tidigare prototyper. Om kollegor använt en viss kombination — anslut till den. Förvaltning blir billigare.
- Föredra TypeScript framför JavaScript. Typer ger Claude Code bättre möjlighet att resonera om koden och fångar fel tidigt.
- Server-side rendering om SEO eller initial laddtid är viktig. Renodlade SPA:er fungerar för interna verktyg men sämre för medborgartjänster.
Steg åtta · Fas II
Tillgänglighetskrav
Tillgänglighet är inte en finish-fas — det är ett grundkrav som ska finnas med från start. För prototyper som ska deployas inom Sundsvalls kommuns testbädd gäller samma lagstiftning som för produktionssystem.
Lagrum och standard
- Lag (2018:1937) om tillgänglighet till digital offentlig service — den så kallade DOS-lagen. Gäller alla offentliga aktörer inklusive kommuner.
- WCAG 2.1 nivå AA — den tekniska standard som DOS-lagen hänvisar till. Detta är den miniminivå alla offentliga digitala tjänster ska uppnå.
- EN 301 549 — europeisk standard som inkluderar WCAG plus krav på mobilappar och hårdvara.
- DIGG — Myndigheten för digital förvaltning är tillsynsmyndighet och kan granska tillgängligheten.
Fyra principer från WCAG som ska genomsyra planen
Strukturera tillgänglighetsavsnittet i utvecklingsplanen kring WCAG:s fyra principer:
- Möjlig att uppfatta. Innehåll måste presenteras så användare kan uppfatta det — alt-texter på bilder, textalternativ för audio, tillräcklig kontrast (4.5:1 för brödtext), responsiv layout.
- Hanterbar. All funktionalitet ska gå att nå med tangentbordet. Fokusindikatorer ska vara synliga. Inga tidsbegränsningar utan möjlighet till förlängning.
- Begriplig. Klar och enkel svenska (klarspråk). Konsekvent navigering. Tydliga felmeddelanden med förslag på åtgärd.
- Robust. Semantisk HTML — använd
<button>,<nav>,<main>rätt. Korrekta ARIA-attribut där HTML inte räcker.
Konkreta krav att ta med i planen
- Tangentbordsnavigering — alla interaktiva element ska gå att nå och aktivera utan mus.
- Skärmläsarstöd — testa med NVDA (Windows) eller VoiceOver (Mac). Korrekta rubriknivåer (h1 → h2 → h3 utan hopp).
- Färgkontrast — minst 4.5:1 för normal text, 3:1 för stor text (24px+) och UI-komponenter.
- Förenkla aldrig genom att ta bort funktion — om en feature inte går att göra tillgänglig, fundera om designen istället.
- Tillgänglighetsredogörelse — alla offentliga digitala tjänster ska ha en sådan. Planera in den redan nu.
Steg nio · Fas II
Testdriven utveckling
Testdriven utveckling (TDD) handlar om att skriva testet innan koden — det tvingar fram en tydlig specifikation av vad varje del faktiskt ska göra. Det är extra värdefullt när du utvecklar tillsammans med Claude Code, eftersom testerna fungerar som ett kontrakt: Claude skriver kod tills testerna går igenom, varken mer eller mindre.
TDD-cykeln i tre steg
- Red. Skriv ett test för en funktion som ännu inte finns. Testet ska misslyckas (rött).
- Green. Skriv minimal kod som får testet att gå igenom (grönt). Inget extra, ingen optimering.
- Refactor. Förbättra koden — strukturera om, namnge om, ta bort dubblettkod — med testet som säkerhetsnät.
Vad ska testas i en prototyp?
Alla prototyper behöver inte 100% testtäckning. Fokusera testerna på:
- Affärslogik. Beräkningar, valideringar, regler — sådant som inte syns men gör tjänsten korrekt.
- Integrationer. API-anrop mot externa system. Använd mockar i tester men säkerställ att kontraktet stämmer.
- Tillgänglighetskritiska komponenter. Mer om detta i steg 12.
- Edge cases. Tomma listor, fel inmatning, nätverksfel.
Arbetsflödet med Claude Code
Be Claude Code följa TDD när du implementerar en feature:
Implementera funktionen för att räkna ut handläggningstid. Följ TDD: skriv testerna först i en testfil, kör dem och visa att de misslyckas, implementera sedan funktionen tills alla tester går igenom.
Claude Code kommer då först skapa testfilen med konkreta test cases, köra dem och se att de misslyckas, och därefter implementera funktionen. Du får en tydlig audit-trail i din git-historik.
Fas III
Utveckling
Från plan till körande kod. Här etablerar du projektstrukturen i WSL, utvecklar funktionerna med Claude Code som parprogrammerare, och säkerställer tillgängligheten innan driftsättning.
Steg tio · Fas III
Skapa upp projektet i WSL
Skapa en projektmapp i ditt Linux-hem (snabbare än Windows-filsystemet):
mkdir -p ~/projekt/mitt-forsta-projekt
cd ~/projekt/mitt-forsta-projekt
/mnt/c/...? Filer på Windows-sidan är betydligt långsammare att läsa från WSL. Förvara alltid aktiva projekt under ~/ (alltså /home/dittnamn/).Initiera ett Git-repo:
git init
Skapa en startfil:
echo "# Mitt första projekt" > README.md
Skapa en .gitignore (anpassad för Node.js — ändra för andra språk):
cat > .gitignore <<EOF
node_modules/
.env
.DS_Store
*.log
EOF
Starta Claude Code i projektmappen:
claude
Första gången du startar Claude Code i en ny mapp händer två saker:
- Förtroendefråga. Claude Code frågar om du litar på filerna i mappen. Svara Yes — mappen är ju tom och skapad av dig.
- Behörigheter. När Claude vill skriva filer eller köra kommandon kommer den att be om ditt godkännande första gången per typ av operation. Du kan välja Yes, Yes, and don't ask again for this session, eller No. Var sparsam med "don't ask again" tills du litar på vad Claude gör.
Be Claude hjälpa dig komma igång. Skriv till exempel:
Skapa en enkel Node.js-applikation med en index.js som loggar "Hej världen", samt en package.json. Lägg också till instruktioner i README.md.
Claude visar vilka filer den vill skapa eller ändra och väntar på din bekräftelse innan den gör något. När du är nöjd, lämna Claude Code med /exit (eller Ctrl+C två gånger).
Kontrollera att filerna faktiskt skapades:
ls -la
Du bör se index.js, package.json, README.md, .gitignore och mappen .git/.
Steg elva · Fas III
Utveckling med Claude Code och löpande GitHub-synk
Skapa ett nytt repo på GitHub:
# 1. Repository name: mitt-forsta-projekt
# 2. Public eller Private — välj Private om du inte vill
# att andra ska kunna se din kod (kan ändras senare)
# 3. "Initialize this repository with:" — lämna ALLA
# rutor obockade (du har redan README, .gitignore lokalt)
# 4. Klicka "Create repository"
Efter att du klickat skapa visar GitHub en sida med kommandon under rubriken "…or push an existing repository from the command line". Ovanför kommandona finns två flikar: HTTPS och SSH — klicka på SSH (vi har redan satt upp SSH-nyckel).
Kopiera SSH-URL:en, som ser ut så här: git@github.com:dittnamn/mitt-forsta-projekt.git.
Tillbaka i Ubuntu-terminalen (i din projektmapp), koppla det lokala repot till GitHub:
git remote add origin git@github.com:dittnamn/mitt-forsta-projekt.git
Verifiera att det blev rätt:
git remote -v
Du ska se URL:en två gånger — en för fetch, en för push.
Gör din första commit och push:
git add .
git commit -m "Initial commit"
git branch -M main
git push -u origin main
Ladda om GitHub-sidan — dina filer ska nu synas där.
Det löpande arbetsflödet
Varje gång du har gjort ändringar du vill spara på GitHub:
# Se vad som ändrats
git status
# Stage alla ändringar
git add .
# Spara ändringen lokalt med beskrivande meddelande
git commit -m "Beskrivande meddelande"
# Skicka upp till GitHub
git push
Om du jobbar från flera datorer eller någon annan har pushat till repot, hämta först ändringarna:
git pull
Tips: be Claude Code hjälpa till med Git
Du kan be Claude Code direkt:
Committa de senaste ändringarna med ett bra meddelande och pusha till GitHub.
Claude Code kommer då att granska diffarna, formulera ett vettigt commit-meddelande och köra kommandona åt dig — med din bekräftelse.
Steg tolv · Fas III
Tillgänglighetstester
Innan något deployas till testbädden ska tillgängligheten ha verifierats. Det här steget är obligatoriskt för prototyper inom Nivå 02 — inte ett "om vi hinner"-moment. Använd en kombination av automatiserade tester, manuella tester och stickprov med riktiga hjälpmedel.
Tre lager av testning
Automatiserade tester fångar omkring 30–40% av tillgänglighetsproblem. De manuella testerna är minst lika viktiga. Använd alla tre lager:
Automatiserade tester i webbläsaren. Använd axe DevTools som tillägg i Chrome eller Edge. Det är samma motor som många kommersiella tjänster använder och fångar de flesta WCAG-överträdelser direkt.
- Installera axe DevTools-tillägget
- Öppna din körande app i WSL via
npm run dev - Öppna DevTools (F12), klicka på axe-fliken, kör en scan på varje vy
- Åtgärda alla "Critical" och "Serious"-fel innan deploy
Komplettera med Lighthouse (inbyggt i Chrome DevTools) för en oberoende score.
Automatiserade tester i koden. Lägg in tillgänglighetstester i din test-suite så att regressioner fångas vid varje push. För en JavaScript-stack är jest-axe eller vitest-axe standardvalet:
npm install --save-dev vitest-axe @testing-library/react
Be Claude Code skriva tillgänglighetstester för dina komponenter:
Skriv tillgänglighetstester med vitest-axe för formulärkomponenten. Testet ska köra axe-motorn på den renderade komponenten och misslyckas om någon överträdelse hittas. Använd realistiska testdata.
Tangentbordstest manuellt. Lägg undan musen och navigera hela appen med bara tangentbordet:
- Tab — flytta framåt mellan interaktiva element
- Shift+Tab — flytta bakåt
- Enter / Space — aktivera knappar och länkar
- Pilar — navigera inom komponenter (menyer, listor, radioknappar)
- Esc — stäng dialoger
Kontrollera att: fokusringen alltid är synlig, fokus aldrig fastnar, modal-dialoger fångar fokus korrekt, och tab-ordningen följer den visuella ordningen.
Skärmläsartest. Installera NVDA — kostnadsfri skärmläsare för Windows. Öppna NVDA i Windows och navigera till din app i WSL via localhost.
- Lyssna på hur sidan annonseras vid laddning — får du grepp om vad sidan handlar om?
- Navigera via rubriker (H-tangenten i NVDA) — finns en logisk hierarki?
- Fyll i ett formulär — är fältens namn och felmeddelanden tydliga?
- Testa dynamiska uppdateringar — annonseras nya meddelanden via
aria-live?
Dokumentera resultat och åtgärder. Skapa en TILLGANGLIGHET.md i projektets rot där du listar:
- Datum för senaste granskning
- Verktyg som använts
- Funna problem och deras status (åtgärdat / planerat / accepterat med motivering)
- Vilka delar som inte uppfyller WCAG 2.1 AA och varför
Detta dokument är grund för den tillgänglighetsredogörelse som krävs enligt DOS-lagen om prototypen vidareutvecklas till produktion.
Fas IV
Driftsättning
Från lokalt repo till publikt nåbar URL. Allt sker via containrar, automatiserat och med wildcard-domän plus Let's Encrypt — du behöver bara välja subdomän.
Steg tretton · Fas IV
Deploya till testbädden via Dokploy
Sundsvalls kommun har en testbädd som bygger på Dokploy — en självhostad PaaS-plattform i stil med Vercel eller Heroku. I det här steget tar vi appen från ditt lokala Git-repo hela vägen till en publikt nåbar URL på *.sundsvall.dev med automatisk deploy varje gång du pushar.
*.sundsvall.dev är redan pekad mot Dokploy-servern, och Let's Encrypt-certifikat utfärdas automatiskt. Du behöver bara välja en subdomän i Dokploy-gränssnittet — inga DNS-poster, ingen TLS-konfiguration.Dockerfile i projektroten är standardpraxis för all utveckling i Sundsvalls testbädd.Översikt av flödet vi bygger
Det vi sätter upp här är en kedja som löper på egen hand efter första konfigurationen:
WSL (kod + Claude Code)
│
▼ git push
GitHub
│
▼ webhook
Dokploy bygger Docker-image
│
▼ startar container
https://dittprojekt.sundsvall.dev
│
└─ Let's Encrypt-cert via Traefik
Först måste appen bli en webbserver som lyssnar på en port — en container utan exponerad tjänst går inte att deploya. Be Claude Code uppdatera index.js till en HTTP-server, eller skapa filen själv:
// Enkel webbserver utan externa beroenden
import { createServer } from 'http';
const PORT = process.env.PORT || 3000;
createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('Hej från Sundsvall!');
}).listen(PORT, () => {
console.log(`Server lyssnar på port ${PORT}`);
});
Uppdatera även package.json så Docker-containern vet hur appen startas:
{
"name": "mitt-forsta-projekt",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"start": "node index.js"
}
}
process.env.PORT? Dokploy (via Traefik) injicerar porten som containern ska lyssna på. Hårdkoda aldrig porten — läs den alltid från miljövariabel.Skapa en Dockerfile i projektroten. Den här minimala versionen fungerar för enkla Node.js-appar:
# Liten, säker basbild — Alpine är ~50MB istället för ~300MB
FROM node:20-alpine
WORKDIR /app
# Kopiera package-filer och installera beroenden först
# (separata steg = bättre Docker-cachning vid kodändringar)
COPY package*.json ./
RUN npm ci --omit=dev
# Kopiera resten av koden
COPY . .
# Dokumentera vilken port containern lyssnar på
EXPOSE 3000
# Kör inte som root i produktion
USER node
CMD ["npm", "start"]
Eller be Claude Code: "Skapa en produktionsklar Dockerfile för det här Node.js-projektet enligt best practice."
Skapa en .dockerignore så att onödiga filer inte hamnar i din image (snabbare bygg, mindre attackyta):
node_modules
npm-debug.log
.git
.gitignore
.env
.env.*
.vscode
.idea
README.md
Dockerfile
.dockerignore
(Valfritt men rekommenderat.) Om du har Docker Desktop installerat med WSL-integration kan du testa containern lokalt innan du pushar. Det sparar mycket tid jämfört med att vänta på Dokploy-bygget för att upptäcka fel:
# Bygg image lokalt
docker build -t mitt-forsta-projekt .
# Kör containern på port 3000
docker run --rm -p 3000:3000 mitt-forsta-projekt
Öppna http://localhost:3000 i webbläsaren — du ska se ditt "Hej från Sundsvall"-meddelande. Avsluta med Ctrl+C.
docker-kommandot direkt i Ubuntu.Pusha Docker-konfigurationen till GitHub så Dokploy kan komma åt den:
git add Dockerfile .dockerignore index.js package.json
git commit -m "Lägg till Docker-konfiguration för Dokploy-deploy"
git push
Skapa applikationen i Dokploy. Logga in på Sundsvalls Dokploy-instans (din kollega eller IT-ansvarig kan ge dig URL och inloggning):
# 1. Välj eller skapa ett "Project" (en grupp av appar)
# 2. Klicka "Create Service" → "Application"
# 3. Namnge appen, t.ex. "mitt-forsta-projekt"
# 4. Gå till fliken "General" på den nya appen
# - Provider: GitHub
# - Repository: dittnamn/mitt-forsta-projekt
# - Branch: main
# - Build Type: Dockerfile
# - Dockerfile path: ./Dockerfile (default)
# 5. Klicka "Save"
# 6. Klicka "Deploy" för första bygget
Om GitHub-providern inte redan är kopplad mot Dokploy: gå till Settings → Git → GitHub och installera Dokploy GitHub App på ditt konto eller din organisation. Det görs en gång per användare.
Följ bygglogen i fliken Deployments. Det första bygget tar ofta 1–3 minuter.
Konfigurera domän och HTTPS:
# 1. Klicka "Add Domain"
# 2. Host: dittprojekt.sundsvall.dev
# (välj något kort och beskrivande)
# 3. Path: /
# 4. Container Port: 3000
# 5. HTTPS: ON
# 6. Certificate: Let's Encrypt
# 7. Klicka "Create"
*.sundsvall.dev är en wildcard-domän som redan pekar på testbäddens server, och Dokploy är konfigurerat med automatisk Let's Encrypt-enrollment via Traefik, så hämtas och installeras certifikatet inom någon minut efter att du sparat. Inga DNS-ändringar krävs från din sida.Vänta ~30 sekunder och besök https://dittprojekt.sundsvall.dev — appen ska svara med "Hej från Sundsvall".
Aktivera automatisk deploy. Det här är nyckeln till det löpande arbetsflödet — varje push till main ska trigga en ny deploy automatiskt.
Om du använder Dokploys GitHub App (rekommenderat — installerades i steg 13.6): auto-deploy är redan aktiverat. Gå till fliken General och kontrollera att "Auto Deploy"-toggeln är på. Klart.
Om du istället vill använda en generisk webhook (t.ex. om GitHub App inte är ett alternativ):
# 1. Slå på "Auto Deploy" i fliken General
# 2. Gå till fliken Deployments
# 3. Kopiera Webhook URL — den ser ut så här:
# https://dokploy.sundsvall.dev/api/deploy/<app-id>
Klistra sedan in URL:en som webhook i GitHub-repot:
# 1. Klicka "Add webhook"
# 2. Payload URL: klistra in Dokploy-URL:en
# 3. Content type: application/json
# 4. Which events: "Just the push event"
# 5. Active: bockad
# 6. Klicka "Add webhook"
GitHub skickar nu en POST till Dokploy varje gång du pushar — Dokploy bygger om imagen och rullar ut den nya containern utan downtime.
Verifiera att hela kedjan fungerar. Gör en liten ändring i index.js — byt t.ex. "Hej från Sundsvall" till "Hej igen från Sundsvall" — och pusha:
git add .
git commit -m "Uppdatera hälsningstext"
git push
Gå till Dokploy-panelen, fliken Deployments. Inom några sekunder ska du se en ny deployment startas. När bygget är klart (1–2 min), ladda om https://dittprojekt.sundsvall.dev — den nya texten ska synas.
Det kompletta arbetsflödet
När allt är konfigurerat ser din vardag ut så här:
- Utveckla i WSL. Öppna projektet, starta Claude Code, skriv kod tillsammans.
- Testa lokalt. Kör
npm startellerdocker runför att verifiera. - Committa och pusha.
git add . && git commit -m "..." && git push— eller be Claude Code göra det åt dig. - Auto-deploy. Dokploy plockar upp pushen, bygger imagen, startar nya containern, gamla containern stoppas. Inget manuellt arbete.
- Verifiera live. Öppna
https://dittprojekt.sundsvall.devoch se ändringen.
Det här är vad "kontinuerlig leverans" innebär i praktiken — och det fina är att hela uppsättningen återanvänds för nästa projekt. Bara byta git remote, lägga till en ny app i Dokploy, välj en ny subdomän — klart.
Tips: miljövariabler och hemligheter
De flesta riktiga appar behöver konfiguration som inte hör hemma i koden — API-nycklar, databas-URL:er, feature flags. Lägg aldrig sådant i Dockerfile eller commiterad kod. Använd istället Dokploys miljövariabler:
DATABASE_URL=postgres://...
API_KEY=hemligt
NODE_ENV=production
I koden läser du dem som vanligt: process.env.DATABASE_URL. För lokal utveckling lägg samma variabler i en .env-fil i projektroten — den är redan i .gitignore och .dockerignore så den läcker inte ut.
Vanliga problem och lösningar
"Claude Code is not supported on Windows"
claude: command not found
echo $PATH och kontrollera att ~/.local/bin finns med.Långsam filåtkomst
/mnt/c/.... Flytta det till ~/projekt/... istället.SSH-nyckel ber om passphrase varje gång
~/.bashrc så lastas agenten automatiskt:
eval "$(ssh-agent -s)" > /dev/null
ssh-add ~/.ssh/id_ed25519 2>/dev/null
Permission denied (publickey) vid push
Klagomål om Windows-Node
which node ger en sökväg som börjar med /mnt/c/, så används Windows installation. Avinstallera den eller kör nvm use --lts för att tvinga rätt version.Dokploy: "Branch Not Match"
Branch står på main (eller den branch du faktiskt pushar till).Bygget i Dokploy misslyckas men funkar lokalt
git status och kontrollera att alla nya filer är committade och pushade. Andra orsaker: olika Node-versioner (lås versionen i Dockerfile), eller en miljövariabel som behövs vid bygget men inte är satt i Dokploy."502 Bad Gateway" på sundsvall.dev-domänen
Container Port matchar porten appen lyssnar på, och (2) i appens loggar att den faktiskt startat utan fel.Let's Encrypt-certifikat utfärdas inte
Webhook triggar inte deploy
Bonustips för det fortsatta arbetet
VS Code med WSL
Installera VS Code på Windows och tillägget "WSL" från Microsoft. Då kan du i Ubuntu-terminalen skriva code . i en projektmapp och få en fullt fungerande GUI-editor som läser från Linux-filsystemet.
CLAUDE.md i projektet
Skapa en fil CLAUDE.md i projektroten med en kort beskrivning av projektets struktur, tekniker och konventioner. Claude Code läser den automatiskt och blir mycket mer hjälpsam.
Branches istället för att pusha direkt på main
För större förändringar — git checkout -b ny-funktion, jobba där, pusha den branchen och öppna en pull request på GitHub.
Backup på Ubuntu-installationen
Du kan exportera hela WSL-instansen med wsl --export Ubuntu C:\backup\ubuntu.tar (kör från PowerShell). Bra att ha innan du experimenterar.