Miljöguide · lokal drift
Kom igång med Docker Compose för vår AI + CRM-stack
Den här guiden förklarar vad som behöver finnas lokalt, hur ni startar vår Compose-miljö på macOS och Windows, vilka tjänster som faktiskt går igång, hur portar fungerar och varför Docker gör samma stack enklare att förstå både lokalt och vid deploy.
Målet: efter den här genomgången ska ni kunna säga vad som startar, var ni öppnar det, hur containrarna pratar och vilka variabler som måste finnas för att hela flödet ska bli användbart.
- En fungerande startsekvens med
docker compose. - En mental modell för
localhostkontra interna tjänstenamn. - En överblick över hela stacken: React, n8n, Flowise, Chatwoot, Twenty och stödcontainers.
- En enkel modell för hur env vars och secrets hör ihop.
Laptop -> Docker Compose -> portar pa hosten -> containrar pa samma natverk -> samma kontrakt lokalt och vid deploy
Varför vi gör så här
Docker Compose löser ett undervisningsproblem innan det löser ett driftproblem
Utan en gemensam miljö
- Varje elev installerar saker på olika sätt.
- Olika versioner av Postgres, Redis eller Node ger olika fel.
- Det blir svårt att avgöra om felet sitter i kod eller i maskinen.
Med Docker Compose
- Samma tjänster och samma portar startar för alla.
- Vi kan prata om en och samma arkitektur i klassrummet.
- Ni får en repeterbar miljö där flödet går att starta, stoppa, läsa och felsöka.
I kursen är Compose alltså inte bara "ett sätt att deploya". Det är ett sätt att ge alla samma laborationsyta och samma systemgränser.
Det viktiga är inte att "köra Docker". Det viktiga är att ni kan förstå hela kedjan från browser till n8n, AI, CRM och support utan att lokala installationer drar isär berättelsen.
Vad som behövs lokalt
macOS och Windows: samma stack, lite olika startyta
- Installera Docker Desktop for Mac.
- Starta Docker Desktop och vänta tills motorn är igång.
- Öppna Terminal eller iTerm i projektmappen.
- Se till att portarna
3000,3001,3002,5678,8083,8084och8085är lediga. - Om ni vill ha riktiga AI-svar: exportera
OPENAI_API_KEYinnan start.
macOS / zsh / bash export OPENAI_API_KEY="sk-..." docker compose up -d
- Installera Docker Desktop for Windows.
- Aktivera gärna WSL2-backend i Docker Desktop.
- Öppna PowerShell eller Windows Terminal i projektmappen.
- Samma portar måste vara lediga som på macOS.
- Om ni vill ha riktiga AI-svar: sätt
OPENAI_API_KEYi PowerShell innan start.
Windows / PowerShell $env:OPENAI_API_KEY="sk-..." docker compose up -d
Vanligaste missen i början: man kör kommandon innan Docker Desktop faktiskt är klart. Börja först när ni ser att Docker-motorn är igång.
Kommandon i rätt ordning
Första uppstart: minsta fungerande sekvens för den här miljön
Steg för steg
- Gå till projektroten där
docker-compose.ymlligger. - Kör
docker compose up -dför att starta miljön i bakgrunden. - På en helt ny Chatwoot-volym: kör
docker compose run --rm chatwoot-rails bundle exec rails db:chatwoot_prepareen gång. - Kör sedan
docker compose up -digen om ni vill vara säkra på att allt är uppe. - Kontrollera status med
docker compose ps.
Praktiska kommandon
docker compose up -d docker compose run --rm chatwoot-rails \ bundle exec rails db:chatwoot_prepare docker compose up -d docker compose ps docker compose logs -f n8n
Första körningen kan ta ett tag: images dras ned, och demo-web installerar npm-paket
innan React-demon blir tillgänglig.
Compose-filen i praktiken
Det här är tjänsterna som ingår i vår lokala miljö
Det ni normalt öppnar i browsern
| Tjänst | URL | Roll |
|---|---|---|
| Projektportal | http://localhost:8084 |
Startsida med länkar, status och presentationer |
| React Demo Store | http://localhost:8083 |
Bosses Akvariefiskar som postar till n8n |
| Legacy Freetext Case | http://localhost:8085 |
Regex- och dataprocesseringsövning |
| n8n | http://localhost:5678 |
Webhookar, logik, routing och HTTP-anrop |
| Flowise | http://localhost:3000 |
AI-lager och chatflows |
| Chatwoot | http://localhost:3001 |
Support- och chattyta |
| Twenty | http://localhost:3002 |
CRM för personer och affärer |
Det som också startar i bakgrunden
- chatwoot-postgres och chatwoot-redis bär Chatwoots data och köer.
- chatwoot-sidekiq kör bakgrundsjobb åt Chatwoot.
- twenty-db och twenty-redis bär Twenty.
- twenty-worker kör bakgrundsjobb åt CRM-lagret.
- All trafik i den här guiden går via publicerade localhost-portar i Compose.
Poängen är att ni inte manuellt installerar Postgres, Redis, Rails, Node och Python på hosten. Compose startar en sammanhängande miljö där varje del har sitt eget ansvar.
Host mot container
Så fungerar portar: vänster sida är din dator, höger sida är containern
Om en port på vänster sida redan används på din dator kommer Compose inte kunna publicera tjänsten. Då behöver ni frigöra porten eller ändra mappningen.
Nätverk inifrån och utifrån
localhost utifrån, tjänstenamn inifrån
På hosten, alltså från browsern
http://localhost:5678öppnar n8n.http://localhost:3000öppnar Flowise.http://localhost:3001öppnar Chatwoot.http://localhost:3002öppnar Twenty.
Browser -> localhost:5678 Browser -> localhost:3000
Mellan containers på Compose-nätverket
- n8n anropar Flowise via
http://flowise:3000. - n8n anropar Twenty via
http://twenty:3000. - n8n anropar Chatwoot API via
http://chatwoot-rails:3000. - Chatwoot ska anropa n8n via webhook. I UI: ofta
http://host.docker.internal:5678/webhook/chatwoot(accepteras som giltig URL). Internt i Docker:http://n8n:5678/webhook/chatwoot.
Container -> flowise:3000 Container -> twenty:3000 Container -> n8n:5678
Den klassiska missen är att skriva localhost inne i en container. Där betyder
localhost containern själv, inte din laptop och inte någon annan tjänst i Compose.
Stacken som helhet
Så ser vår lokala stack ut när allt kör
project-index
Startsida på localhost:8084 som gör det lätt att hitta demos, slides och ingångar.
demo-web
React-demon på localhost:8083 som skickar leads och supportsignaler vidare till n8n.
legacy-ugly-web
Freetext- och SQLite-caset på localhost:8085 för regex- och dataprocessering.
n8n
Tar emot webhookar, håller ihop logik och skickar data vidare till rätt destination.
Flowise
Kapslar chatflows, promptlogik och AI-svar så att AI-delen blir ett tydligt eget lager.
Twenty + Chatwoot
CRM för leads och affärer, plus supportyta för chatt och konversationer.
I bakgrunden finns också databaser, Redis och workers. De syns mindre i browsern, men utan dem blir varken Chatwoot eller Twenty särskilt användbara.
Efter första start
Det här behöver ni konfigurera för att hela kedjan ska bli meningsfull
Flowise
- Skapa eller importera chatflows för kursens scenarier.
- Sätt
FLOWISE_LEAD_CHATFLOW_ID. - Sätt
FLOWISE_SUPPORT_CHATFLOW_ID. - Valfritt:
FLOWISE_CHATWOOT_CHATFLOW_IDför särskilt chattflöde.
Twenty
- Skapa API-nyckel i Twenty.
- Lägg den i
TWENTY_API_KEYför n8n. - n8n använder också
TWENTY_API_BASE=http://twenty:3000internt.
OpenAI
OPENAI_API_KEYgår till Flowise.- Utan nyckeln kan stacken starta, men AI-svaren blir tomma eller mindre användbara.
Chatwoot
- För svar tillbaka till chatten behövs
CHATWOOT_API_ACCESS_TOKEN. - Webhook till n8n:
http://host.docker.internal:5678/webhook/chatwooti Chatwoot-formulär, ellerhttp://n8n:5678/webhook/chatwootom UI tillåter det.
När ni ändrar env vars för en tjänst räcker det ofta att starta om just den tjänsten, till exempel
docker compose up -d n8n eller docker compose up -d flowise.
Env vars och hemligheter
Så ska ni tänka om secrets: demo först, riktig hemlighetshantering sen
I kursdemot
- Målet är att komma igång snabbt och kunna visa hela arkitekturen.
- Ni kommer se env vars som styr URL:er, chatflow-id:n och tokens.
- Vissa demo-defaults finns för att tröskeln ska vara låg i klassrummet.
I riktig drift
- Riktiga API-nycklar och tokens ska ligga i
.enveller i en riktig secret manager. - Commit:a inte riktiga secrets till git.
- Byt demo-lösenord, app secrets och tokens innan något lämnar labbmiljön.
# Exempel pa sekretkontrakt, inte riktiga varden OPENAI_API_KEY=sk-... TWENTY_API_KEY=... FLOWISE_LEAD_CHATFLOW_ID=... FLOWISE_SUPPORT_CHATFLOW_ID=... FLOWISE_CHATWOOT_CHATFLOW_ID=... CHATWOOT_API_ACCESS_TOKEN=...
Skillnaden mellan konfiguration och hemlighet är viktig: en port eller URL kan ofta vara offentlig, men en API-nyckel, app secret eller access token ska behandlas som känslig information.
Varför Docker är smidigt att deploya
Samma kontrakt från laptop till server, men inte samma risknivå
Varför det är smidigt
- Samma images och samma tjänstegränser kan köras lokalt och på en server.
- Compose beskriver hela miljön: tjänster, portar, env vars, volymer och beroenden.
- Det minskar "works on my machine"-problemet vid överlämning.
- Det blir lättare att deploya om bara en tjänst utan att tänka om hela systemet.
Vad som ändå saknas för riktig prod
- Riktiga domäner, TLS/HTTPS och säkrare ingress.
- Riktig secret-hantering och roterade nycklar.
- Backup-strategi för databaser och volymer.
- Övervakning, loggning och säkrare lösenord än demo-defaults.
Docker gör alltså deploy mer repeterbar, inte automatiskt mer färdig. Det ni vinner är samma struktur, samma kontrakt och tydligare tjänstegränser.
I den här miljön använder vi medvetet direkta localhost-portar för att hålla setupen
enkel, tydlig och likadan för alla i klassrummet.
Avslutning
Vanliga missar och snabb checklista för att komma igång
Vanliga missar
- En annan process använder redan porten ni behöver.
- Docker Desktop eller WSL2-backend är inte igång trots att terminalen är öppen.
- Ni ändrar en env var men glömmer att starta om den berörda tjänsten.
- Ni använder
localhostinne i en container i stället för tjänstenamn. - Ni förväntar er AI-svar utan att
OPENAI_API_KEYär satt. - Ni vill ha en "ren" miljö men glömmer att volymer sparar data mellan omstarter.
Snabb checklista
- Starta Docker Desktop.
- Kör
docker compose up -d. - Kör Chatwoot-prepare en gång på ny volym.
- Öppna portal, n8n, Flowise, Twenty och Chatwoot.
- Sätt Flowise-id:n, Twenty API key och eventuellt OpenAI/Chatwoot-token.
- Importera workflows i n8n och chatflows i Flowise.
- Skicka första leadet och följ körningen i n8n.
Om miljön går att starta på både macOS och Windows med samma Compose-fil har ni redan vunnit något viktigt: arkitekturen är tydligare än maskinen.