Migraatio-opas · Heroku:sta
Siirry Herokusta SIAXiin
Heroku teki käyttöönotoista helppoja ennen kuin kukaan muu teki, ja osa siitä helppoudesta on yhä vaikea voittaa. Se mikä saa tiimit siirtymään, ei useinkaan ole tekniikka vaan talous: hinta per dyno, lisäosat jotka näyttävät yksitellen halvoilta ja yhdessä muodostavat merkittävän erän, ja alusta joka on kehittynyt hitaasti viime vuosina.
Meillä ajatte web-prosessin ja taustaprosessit kontteina App Hostingissa, tietokannan Managed Postgresina ja sen, mille ei ole hallinnoitua vastinetta, VPS:llä. Kuukausikustannus on ennakoitava ja saatte root-oikeudet siellä missä niitä tarvitsette.
Se mikä on hankalaa, ei ole sovellus vaan lisäosaekosysteemi. Heroku on tehnyt palvelun lisäämisestä yhdellä klikkauksella helppoa, ja useimmilla tiimeillä on enemmän lisäosia kuin ne muistavat. Jokainen sellainen pitää korvata erikseen, ja joillekin ei ole itsestään selvää vastinetta. Varautukaa siihen, että tämä osa vie enemmän aikaa kuin itse sovelluksen siirto.
Ajankäyttö
Yksi päivä sovellukselle jossa on yksi web-prosessi ja yksi Postgres. Yhdestä kahteen viikkoa, jos teillä on viisi tai useampi lisäosa, taustatöitä ja ajastettuja ajoja.
Käyttökatko
Sovellus voidaan siirtää ilman katkoa, jos ajatte rinnakkain. Tietokanta vaatii kirjoitusikkunan: muutama minuutti dumpilla ja restorella pienelle tietokannalle, pidempään suurille. Loogisella replikoinnilla pääsette sekunteihin.
Näin teet sen
- 1
Kartoita dynot, lisäosat ja config varit
Aja heroku ps, heroku addons ja heroku config jokaiselle sovellukselle ja tallenna tulosteet. Kirjaa dynotyyppi ja määrä prosessityyppiä kohden sekä millä tasolla kukin lisäosa on. Tämä lista on uuden ympäristön vaatimusmäärittely, ja se on lähes aina pidempi kuin tiimi arvaa.
- 2
Korvaa buildpack Dockerfilellä
Heroku tekee paljon näkymättömästi: asentaa riippuvuudet, kääntää assetit, asettaa PORTin ja käynnistää sen mitä Procfilessa lukee. Kaiken tuon pitää olla eksplisiittisesti Dockerfilessänne. Sitokaa ympäristön ilmoittamaan PORTiin kovakoodatun portin sijaan. Vaihtoehtoisesti voitte ajaa Cloud Native Buildpacksia pack CLI:llä, jos haluatte säilyttää buildpack-mallin vielä hetken.
- 3
Korvaa jokainen lisäosa erikseen
Käy lista läpi kohta kohdalta. Heroku Postgresista tulee Managed Postgres. Heroku Data for Redisistä tulee Redis tai Valkey VPS:llä, jota päivitätte ja varmuuskopioitte itse. Papertrail ja vastaavat loki- ja käytettävyyspalvelut korvataan valvonnallamme tarkistuksia varten ja lokien vastaanottajalla jonka valitsette itse. Lähtevä sähköposti SendGridin kautta vaihdetaan sähköpostipalveluumme tai ulkoiseen SMTP-toimittajaan. Lisäosat, joille ei ole vastinetta, pitää joko säilyttää erillisenä tilauksena tai ajaa itse.
- 4
Siirrä Postgres
Tarkistakaa ensin mitä extensioneja oikeasti käytätte, ei mitkä sattuvat olemaan asennettuna. Ottakaa pg_dump custom-formaatissa ja ajakaa pg_restore uuteen instanssiin, ja testatkaa koko matka kopiota vasten ennen kuin koskette tuotantoon. Yli muutaman kymmenen gigatavun tietokannoille otatte käyttöön loogisen replikoinnin ja vaihdatte connection stringin kun replika on kiinni kärryissä. Muistakaa että Herokun DATABASE_URL voidaan kierrättää ja että sslmode-asetus usein poikkeaa.
- 5
Siirrä worker-prosessit ja ajastetut työt
Jokaisesta prosessityypistä Procfilessa tulee oma ajo meillä. Worker-dynoista tulee erilliset kontit samaa jonoa vasten. Heroku Scheduler korvataan cronilla kontissa tai ajastetulla CI-työllä. Kertaluontoiset ajot, jotka teitte heroku run -komennolla, tarvitsevat uuden rutiinin, esimerkiksi shellin käynnissä olevassa kontissa tai manuaalisesti liipaistun työn.
- 6
Pystytä deploy ja salaisuudet
Yhdistä repo Gitiin ja CI:hen niin että push mainiin rakentaa imagen ja deployaa. Siirrä kaikki config varit salaisuuksienhallintaan ja kierrätä ne siirron yhteydessä, koska ne ovat nyt kulkeneet viennin läpi. Varmista että sovellus käynnistyy juuri sillä muuttujajoukolla jota aiotte ajaa tuotannossa, ei osajoukolla.
- 7
Aja rinnakkain, vaihda DNS ja aja alas
Anna Heroku-sovelluksen jatkaa tuotantoliikenteen vastaanottamista, kun uusi ympäristö on staging-osoitteessa. Vertaa lokeja, virhetaajuutta ja vasteaikoja vähintään vuorokauden ajan oikealla liikenteellä. Laskekaa sitten TTL, vaihtakaa DNS ja pitäkää Heroku käynnissä vielä pari viikkoa ennen kuin skaalaatte dynot nollaan ja lopetatte lisäosat.
Mikä on todella hankalaa
- Lisäosia ei korvata yhdellä napilla. Jokainen palvelu pitää arvioida, korvata ja testata erikseen, eikä joillekin ole hyvää vastinetta lainkaan. Tämä on säännönmukaisesti aikataulun suurin erä.
- Meillä ei ole hallinnoitua Redistä tuotteena. Jos tarvitsette Redistä tai Valkeytä, ajatte sitä VPS:llä alkaen 59 kr kuukaudessa, päivitykset, muistirajat ja varmuuskopiointi omalla vastuullanne.
- Buildpack-taika on näkymätöntä kunnes se katoaa. Automaattinen assettien kääntö, PORT-sidonta ja injektoidut ympäristömuuttujat lakkaavat tapahtumasta itsestään ja pitää kirjoittaa auki Dockerfileen.
- Heroku käynnisti dynonne uudelleen päivittäin. Koodi jossa on hitaita muistivuotoja on voinut olla piilossa tuon kierron takia ja tulee näkyviin vasta kun kontti saa elää viikkoja.
- Review apps ja pipelinet eivät ole valmiina ominaisuutena. Voitte rakentaa vastaavan branch-deployllä CI:ssä, mutta se on työtä joka pitää aikatauluttaa, ei asetus.
Kustannusesimerkki
Sovellus jossa on yksi web-prosessi, yksi worker, yksi Postgres, Redis ja päivittäinen varmuuskopiointi: App Hosting alkaen 99 kr webille ja 99 kr workerille, Managed Postgres alkaen 89 kr, VPS Redisille alkaen 59 kr ja varmuuskopiointi 19 kr 100 Gt:lle, eli noin 365 kr kuukaudessa ilman alv:tä. Vastaava Herokulla kahdella Standard-dynolla, Postgres Standard-0:lla ja Redis-suunnitelmalla asettuu noin 1 200–1 400 kr:oon kuukaudessa listahintaan, ja hinnat muuttuvat jatkuvasti.
Usein kysytyt kysymykset
- Voimmeko säilyttää buildpackimme?
- Ei suoraan, ajamme kontteja. Joko kirjoitatte Dockerfilen, mitä suosittelemme pitkällä aikavälillä, tai rakennatte OCI-imagen nykyisistä buildpackeistanne pack CLI:llä. Toinen vaihtoehto lyhentää migraatiota mutta siirtää työn eteenpäin.
- Onko teillä hallinnoitua Redistä?
- Ei. Redistä ja Valkeytä saa ajaa VPS:llä tai dedikoidulla palvelimella. Se tulee halvemmaksi kuin Herokun suunnitelma, mutta otatte itse vastuun ylläpidosta: päivitykset, muistipolitiikka, pysyvyys ja varmuuskopiointi.
- Tulevatko Postgres-extensionimme mukana?
- Yleiset tulevat, mukaan lukien pg_stat_statements, pgcrypto, uuid-ossp ja PostGIS. Harvinaiset tai Heroku-spesifiset lisäosat pitää varmistaa ennen kuin suunnittelette cutoveria, ei sen jälkeen. Lähettäkää lista tietokannastanne niin vastaamme konkreettisesti.
- Mitä teemme Heroku Connectin tai muiden lisäosien kanssa, joille ei ole vastinetta?
- Joko säilytätte palvelun erillisenä tilauksena toimittajalla, tai korvaatte toiminnon jollain jota ajatte itse. Emme teeskentele että kaikki voidaan siirtää suoraan, ja se arvio pitäisi tehdä ennen kuin päätätte siirtopäivän.
