Metode & drift
Hvis I søger efter staging miljø, eller efter preview vs staging, står I typisk ét sted: I har preview-deploys på hver pull request, og nogen har sagt at I 'mangler et staging'. Eller I har allerede et staging, ingen har rørt i måneder, og I deployer alligevel direkte til produktion fordi staging lyver. Nogen opretter et ekstra Vercel-projekt og kalder det færdigt. Nogen kopierer produktion med rigtige nøgler. Nogen nægter at merge uden at 'det har ligget på staging'.
CI/CD-posten handler om preview før merge: en klikbar gren, review der ikke er blindo. Den her handler om det tredje miljø — det lange, delte, der skal opføre sig som produktion. Et ærligt staging-miljø er ikke et hotel for branches. Det er en sandhed I kan pege på, når preview ikke kan holde den: en webhook der kun kan pege ét sted, en betalings-sandbox, et ERP, et indhold I skal fryse, en dataform der først viser sig med rigtige rækker.
TL;DR
De vigtigste pointer
- Preview er et review af en gren. Staging er et delt miljø, der skal ligne produktion.
- De fleste marketing-sites har ikke brug for staging, hvis hver pull request har en preview, og produktion er den eneste delte sandhed.
- I har brug for staging, når noget ikke kan findes per pull request: webhook, betaling, ERP, redaktører uden GitHub, en migrering I skal tørkøre.
- Et staging der er tomt, forældet eller et dump for ureviewet arbejde, er værre end intet staging.
- Preview plus produktion er to jobs. Staging er et tredje — betal kun for det, når I kan navngive jobbet.
- Kald ikke et ekstra URL for staging, hvis det hverken har data, integrationer eller en ejer.
Hvorfor det her overhovedet er vigtigt
Et staging I ikke kan forklare, koster uger I kalder 'kvalitetssikring'. Folk merger, fordi det 'lå på staging', og opdager i produktion at webhooken pegede på det gamle URL, at Stripe-nøglen var test, eller at indholdet var tre måneder gammelt. I tror I har en gate. I har et ritual. Ritualet er dyrt, fordi det giver jer tilladelse til ikke at kigge.
Teams arver staging fra en anden slags software. I en bank, et ERP, et monolith med ét deploy-vindue om måneden, er et langt miljø før produktion en overlevelse. På et Next.js-site med preview på hver pull request er det ofte teater: I betaler for at holde et tredje site i live, som ingen redaktør åbner, og som udviklerne ikke stoler på. Preview løste det visuelle. Staging skal løse noget preview ikke kan.
Det er også et tillids- og data-spørgsmål. Hvis staging har produktionsdata, har I et andet produktionsmiljø, I ikke vogter. Hvis staging er tomt, fejler I først de queries, der kun dør med rigtige rækker. Hvis ingen ejer at opdatere det, divergerer det — og så er den grønne 'det virkede på staging' en løgn, I skriver i en ticket.
Vi skriver det, fordi 'vi skal have staging' er blevet et køb, I tager før I har en sætning om hvad preview ikke kan. Et ærligt setup er kedeligt: preview på hver gren, produktion som sandhed, og et tredje miljø kun når I kan pege på integrationen, dataformen eller redaktøren, der ikke kan leve i en PR-URL. Uden den sætning har I et ekstra hostname. I har ikke staging.
Hvad et staging-miljø faktisk er — og hvad det ikke er
Et staging-miljø er et langt, delt sted, der skal svare som produktion på de måder, I faktisk er bange for. Samme slags database-shape. Samme slags auth. De samme webhooks, pegende på det her URL. Den samme betalings-sandbox. Et indhold, redaktører kan trykke igennem uden at røre live. Det behøver ikke at være en bit-kopi. Det skal være en kopi af de sandheder, der kan knække jer.
Det er ikke en preview. En preview dør med pull requesten. Den har branchens kode, ofte branchens migrationer, og typisk ikke jeres rigtige Stripe-webhook eller jeres ERP. Den er til at se og klikke, før I merger. Den er det rigtige værktøj til 'ser det her rigtigt ud' og 'bygger det'. Den er det forkerte værktøj til 'kan Nets finde tilbage' og 'kan redaktøren øve sig uden at publicere live'.
Det er heller ikke produktion med `noindex` og et andet hostname. At spejle live med rigtige kunder og rigtige hemmeligheder, og så kalde det staging, er hvordan I får et læk og et andet prod, I glemmer at patche. Staging må gerne ligne. Det må ikke være det samme værdifulde. Anonymiseret udsnit, sandbox-nøgler, et dataset I tør miste.
Og det er ikke docker-compose på én bærbar. Lokalt er til at udvikle. Staging er til at dele en sandhed med nogen, der ikke har jeres laptop: en anden udvikler, en redaktør, en betalingsleverandør, et migrationsvindue. Hvis kun én kan starte det, er det ikke et miljø. Det er et håb.
Det der typisk går galt, når nogen siger vi har staging
Den første fejl er at staging er forældet. Sidste rigtige deploy var i foråret. Schemaet ligner ikke prod. Feature-flags peger anderledes. I 'tester' et andet produkt. Det eneste staging så fanger, er at I kan logge ind på et site, I ikke lancerer. Opdater det i en rytme, eller drop det. Et museum er ikke en gate.
Den anden fejl er at staging har produktionsnøgler. Databasen er et dump fra i går. S3 er det rigtige bucket. Mailen sender til rigtige kunder, hvis nogen trykker. Det er ikke grundighed. Det er et andet prod uden den vagt, I har på det rigtige. Sandbox og anonymisering er kedelige. De er grunden til, at staging må eksistere.
Den tredje fejl er et tomt staging. Ingen rækker, ingen webhook, ingen redaktør-konto, ingen 'rigtig' integration — bare samme Next.js-build pegende på en tom Postgres. Så fanger I de fejl, et tomt site kan vise, og misser dem, der kun dør med data. Hvis jobbet er dataformen, så giv det data. Hvis jobbet er layout, så brug preview.
Den fjerde fejl er at bruge staging som dump. Alt, der ikke er reviewet, ligger der. Ingen preview. Ingen pull request. 'Det ligger på staging' betyder 'nogen pushede til en gren, vi deler'. Så har I slukket for review og tændt for et hotel. Preview-deploys er det, der holder review i live. Staging er det, der holder den delte sandhed. Bland dem, og I får ingen af delene.
Preview vs. staging — to miljøer, to slags sandhed
Preview på pull requesten
En gren I kan klikke. Dør når PR'en lukker. Review, ikke en kopi af drift.
- Én URL per ændring — designere og produkt kan se branchen
- Bygget af CI; ingen delt database I skal vogte
- Fanger layout, broken links, de fleste rendering-fejl
- Kan ikke holde en fast webhook, et ERP eller en redaktør-øvelse
Det ærlige staging
Et langt, delt miljø der ligner produktion på de måder, I er bange for.
- Samme hostname i uger — leverandører og redaktører kan bogmærke det
- Sandbox-nøgler, en dataform I tør miste, en ejer der opdaterer det
- Fanger integrationer, migreringer og 'virker det med rigtige rækker'
- Er spild, hvis den eneste frygt var 'ser forsiden rigtig ud'
Sådan beslutter I om I overhovedet skal have staging
Uden den her rækkefølge får I et ekstra URL, I kalder en gate.
- 01
Skriv det job, staging skulle holde — i fem linjer
Ikke 'vi skal have et miljø mere'. 'Nets kan kun pege én webhook.' 'Redaktøren skal øve sig uden at ramme live.' 'Vi skal tørkøre en migrering på noget der ligner prod.' 'ERP'et har ét sandbox-endpoint.' Hvis I ikke kan sige jobbet, er I ikke klar til staging. I er klar til at bruge de previews, I allerede har.
- 02
Tjek om preview allerede gør jobbet
Layout, copy, de fleste bugs, 'virker buildet', stakeholder-review: det er preview. Et marketing-site på Next.js og Vercel eller Cloudflare, uden faste callbacks, har sjældent et tredje job. Hvis svaret er 'vi vil gerne være sikre', så skriv hvad I er bange for. Sikkerhed uden navn er hvordan I køber et hotel.
- 03
List de integrationer, der ikke kan findes per pull request
Webhooks med ét callback-URL. En betalings-sandbox. Et ERP. Et IdP-app I ikke må oprette ti af. Et sitemap-værktøj der crawler ét hostname. Det er kandidater til et langt miljø. Hvis listen er tom, er staging et ønske. Hvis listen er lang, er staging et system — og så skal I også skrive hvilke nøgler der er sandbox.
- 04
Beslut data: tomt, anonymt udsnit, eller 'det tør vi ikke'
Tomt staging er ærligt, når jobbet er integrationen, ikke rækkerne. Et anonymt udsnit er ærligt, når queries dør uden volume. Produktionsdata er næsten aldrig ærligt. Hvis I ikke tør lave udsnittet, har I ikke et staging-problem. I har et data-problem, I skal løse før I kopierer noget.
- 05
Giv det et navn, en rytme og en sluk-dato hvis jobbet forsvinder
Ejer er et menneske, ikke 'devops'. Rytme er hvordan det ikke bliver et museum: deploy efter prod, eller en fast uge, eller 'før hver migrering'. Hvis webhooken flytter til noget der kan per-PR, så sluk staging. Et miljø uden sluk-kriterium er hvordan I betaler for det næste år, efter jobbet døde.
“I har et staging-miljø, når I kan sige hvilken sandhed det holder. Et ekstra URL er et hotel.”
Marketing-site, WordPress og en app med webhooks — samme ord, tre jobs
Et marketing-site på Next.js med preview på hver pull request har typisk to sandheder: branchen I kigger på, og produktion. Redaktører, hvis I har dem, udgiver i prod eller via et CMS med eget preview. Et tredje miljø her er ofte et sted, I glemmer at sætte environment-variabler, og så 'virker det på staging' betyder 'det virkede uden de hemmeligheder, prod har'. Lad være. Brug preview. Hold prod kedelig.
Et WordPress-site er en anden slags. Indholdet er databasen. En preview af et tema-repo er ikke det samme som 'redaktøren kan trykke en forside af uden at ramme live'. Her kan et staging — en kopi af CMS'et med sandbox-nøgler og et noindex — være det rigtige, hvis I faktisk øver indhold og plugin-updates der. Det er stadig ikke en undskyldning for at kopiere rigtige brugere eller at lade staging være det sted, I opdager at pluginet sendte mailen.
En app med Stripe, webhooks eller et ERP har ofte det job, preview ikke kan: leverandøren kan kun pege ét sted, og I skal kunne gennemføre et køb eller en synk uden at røre live. Så er staging rigtigt. Så er sandbox-nøgler pligten. Så er 'vi pushede til staging og glemte at opdatere webhooken' den fejl, I skal designe jer ud af — ét dokumenteret URL, én ejer, én tjekliste før I kalder det testet.
En migrering — WordPress til Next.js, et schema-skift, et cutover — er den uge, staging tjener sit ophold. Tørkør på noget der ligner. Peg DNS midlertidigt hvis I skal. Skriv hvad der skal være sandt før I skifter. Preview af det nye site er stadig nyttigt. Det erstatter ikke at have kørt den kedelige kopi én gang, før kunderne gør det.
Hvad I typisk bør gøre i den situation, I står i
Venstre er det, I typisk siger. Højre er det næste skridt, vi typisk anbefaler.
Situation
Vi har preview på hver PR og vil 'også have staging'
Næste skridt
Skriv jobbet preview ikke kan. Hvis I ikke kan, er det tredje miljø et hotel
Situation
En leverandør kan kun pege én webhook eller ét sandbox-URL
Næste skridt
Så har I jobbet. Ét langt miljø, sandbox-nøgler, en ejer — ikke ti previews I beder dem om at skifte imellem
Situation
Staging er tomt, og vi tester alligevel der før prod
Næste skridt
Enten giv det den dataform, I er bange for, eller test i preview og prod. Tomt staging er et alibi
Situation
Vi har produktionsdata på staging 'så det er realistisk'
Næste skridt
Det er et andet prod. Anonymiser eller sluk. Realisme der kan lække, er ikke kvalitetssikring
Situation
Ingen åbner staging, og vi merger alligevel
Næste skridt
Sluk det eller ret det. En gate I ignorerer, er dyrere end to ærlige miljøer
Tjekliste før I kalder det et staging-miljø
Hvis I mangler flere af punkterne, er sætningen staging — setup'et er et ekstra hostname.
- I kan sige hvilket job staging holder, som preview ikke kan
- Nøglerne er sandbox, og data er noget I tør miste
- Der er en navngiven ejer og en rytme, så det ikke bliver et museum
- Webhooks og leverandører peger bevidst her — ikke 'vi glemte at skifte tilbage'
- Folk åbner det faktisk, før I kalder noget testet
- I ved hvornår I slukker det, hvis jobbet forsvinder
Spørgsmål vi får igen og igen
Hvornår har vi brug for et staging-miljø?
Når noget ikke kan findes per pull request: en webhook med ét callback, en betalings-sandbox, et ERP, redaktører der skal øve sig uden at ramme live, eller en migrering I skal tørkøre. Hvis jobbet er layout, copy og 'bygger det', er preview nok. De fleste marketing-sites på Next.js har det sidste job, ikke det første. Skriv sætningen. Hvis I ikke kan, så køb ikke det tredje hostname.
Er preview-deploys det samme som staging?
Nej. Preview er et review af en gren. Det dør med pull requesten. Staging er et langt, delt miljø der skal ligne produktion på de måder, I er bange for. Vi har skrevet om preview i CI/CD-indlægget — klikbart review, ikke et hotel. Bland dem, og I får ureviewet arbejde på et delt URL, eller et staging I bruger som erstatning for at kigge på branchen. To jobs. To værktøjer.
Må staging have et udtræk af produktionsdata?
Et anonymiseret udsnit, I tør miste, kan være rigtigt, når queries kun dør med volume. Et dump med rigtige kunder, mails og hemmeligheder er et andet prod. Hvis I ikke kan anonymisere, har I ikke gjort staging sikkert — I har kopieret risikoen. Tomt staging er ærligere end et dump, I ikke vogter, hvis jobbet alligevel var en webhook eller et layout.
Har et lille Next.js-site på Vercel brug for staging?
Sjældent, hvis hver pull request har en preview, og I ikke har en leverandør med ét fast callback. Vercel og Cloudflare gør preview billigt. Det er grunden til, at staging er blevet det forkerte default. Tilføj det tredje miljø den dag, I kan pege på integrationen. Indtil da er produktion plus preview det ærlige setup — og et ekstra projekt er et sted, environment-variablerne driver fra hinanden.
Hvad gør vi med et staging, ingen bruger?
Sluk det, eller giv det et job og en ejer. Et museum koster opmærksomhed: folk tror det tæller, indtil det ikke gør, og så er det prod der tester. Hvis I slukker, så skriv det højt, så ingen tror I stadig har en gate. Hvis I beholder det, så sæt rytmen — deploy efter prod, eller kun før migreringer — og slet det, den uge jobbet forsvinder. Et miljø uden sluk-dato er et abonnement på en løgn.
Hvis I har et ekstra URL og stadig deployer i blindo
Lad os skille preview, staging og produktion ad.
Et navngivet job slår et tredje miljø, I opretter fordi nogen sagde at I skulle.
