R Academy · Oppitunti

Plumber-rajapintojen käyttöönotto tuotannossa

Pakkaakaa ja ottakaa Plumber-rajapintoja käyttöön Dockerilla ja pilvialustoilla.

Oppitunti 4/413 vaihetta

Plumber-rajapintojen käyttöönotto tuotannossa on ilmainen R Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu R Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. R Academy-kurssilla on yhteensä 4 oppituntia.

Tuotantokäyttöönoton vaihtoehdot

Plumber API voidaan ottaa käyttöön useilla tavoilla:

  • Docker-säilö — siirrettävä, toistettava ja toimii kaikkialla
  • Posit Connect — painikekäyttöinen käyttöönotto ja ajastus
  • Digital Ocean / EC2 — tavallinen Linux-virtuaalikone, jossa R suoritetaan

Docker on siirrettävin vaihtoehto ja tuotantokäyttöön tarkoitettujen R-rajapintojen alan standardi.

Plumber API:n käynnistystiedosto

Luokaa ylätason api.R-tiedosto, joka käynnistää Plumber-palvelimen. Käyttäkää muotoa Sys.getenv('PORT', unset='8000'), jotta säilöjen orkestroija voi määrittää portin ilman koodin muuttamista.

# api.R
# library(plumber)
#
# pr <- plumb('routes.R')
# port <- as.integer(Sys.getenv('PORT', unset = '8000'))
# pr$run(host = '0.0.0.0', port = port)
#
# Listening on 0.0.0.0 is required inside Docker
# (127.0.0.1 is only reachable inside the container)

Docker-perusimage — rocker/r-ver

rocker/r-ver-image tarjoaa minimaalisen, tiettyyn versioon kiinnitetyn R-ympäristön. Kiinnittäkää aina tietty R-versio (esimerkiksi rocker/r-ver:4.3.2), jotta koontiversiot voidaan toistaa yhdenmukaisesti. Välttäkää :latest-tunnistetta tuotannossa.

# Dockerfile
# FROM rocker/r-ver:4.3.2
#
# Alternatively use rocker/plumber which pre-installs plumber:
# FROM rstudio/plumber:latest
#
# rocker/r-ver is more minimal and gives you full control
# over which packages are installed.

R-pakettien asentaminen Dockerfile-tiedostossa

Asentakaa paketit image-koonnin aikana komennolla RUN Rscript -e "install.packages(...)". Asentakaa järjestelmäriippuvuudet ensin käyttämällä apt-get-komentoa (esimerkiksi libssl-dev tarvitaan httr2-paketille).

# FROM rocker/r-ver:4.3.2
#
# RUN apt-get update && apt-get install -y \
#     libssl-dev \
#     libcurl4-openssl-dev \
#  && rm -rf /var/lib/apt/lists/*
#
# RUN Rscript -e "install.packages(c('plumber', 'jsonlite', 'httr2'), repos='https://cloud.r-project.org')"

Tiedostojen kopioiminen ja portin määrittäminen

Kopioikaa R-lähdetiedostot säilöön komennolla COPY. Ilmoittakaa portti komennolla EXPOSE, jotta Docker tietää, mitä porttia säilö kuuntelee. Tämä on vain dokumentaatiota — se ei julkaise porttia.

# FROM rocker/r-ver:4.3.2
# ...
# WORKDIR /app
# COPY routes.R .
# COPY api.R .
#
# EXPOSE 8000
#
# CMD ["Rscript", "api.R"]

Docker-imagen koonti ja suorittaminen

Koontakaa image komennolla docker build ja suorittakaa sitten säilö yhdistämällä isäntäkoneen portti säilön porttiin. -e-valitsimella välitetään ympäristömuuttujia, kuten salaisuuksia.

# Build the image:
# docker build -t my-r-api:1.0 .
#
# Run a container:
# docker run -d \
#   -p 8000:8000 \
#   -e API_SECRET_KEY='my_secret' \
#   -e DATABASE_URL='postgres://...' \
#   --name r-api \
#   my-r-api:1.0
#
# Test:
# curl http://localhost:8000/ping

Salaisuuksien lukeminen Sys.getenv()-funktiolla

Älkää koskaan sijoittako salaisuuksia tuotannossa Dockerfile-tiedostoon tai lähdekoodiin. Lukekaa ne suorituksen aikana käyttämällä Sys.getenv()-funktiota. Välittäkää ne Dockerin -e-valitsimilla, Kubernetes-salaisuuksina tai AWS Secrets Managerin kaltaisilla ympäristömuuttujien hallintajärjestelmillä.

# In routes.R:
# db_url   <- Sys.getenv('DATABASE_URL', unset = '')
# api_key  <- Sys.getenv('API_SECRET_KEY', unset = '')
#
# if (nchar(db_url) == 0)  stop('DATABASE_URL is required')
# if (nchar(api_key) == 0) stop('API_SECRET_KEY is required')
#
# Fail fast at startup rather than failing silently at request time
cat('Validate all required env vars at startup with stop()
')

Terveystarkistuksen päätepiste

/ping- tai /health-päätepisteen avulla kuormantasaajat ja orkestroijat (Kubernetes, ECS) voivat varmistaa, että API on toiminnassa. Sen tulee palauttaa nopeasti tila 200 ilman todennusta, ja se voi halutessanne tarkistaa myös yhteyden tietokantaan.

# #* Health check
# #* @preempt auth
# #* @get /ping
# function() {
#   list(
#     status  = 'ok',
#     version = '1.0.0',
#     time    = format(Sys.time(), '%Y-%m-%dT%H:%M:%SZ')
#   )
# }
#
# Docker HEALTHCHECK:
# HEALTHCHECK CMD curl -f http://localhost:8000/ping || exit 1

Täydellinen Dockerfile-esimerkki

Kaikki yhdistettynä — tuotantokäyttöön valmis Dockerfile Plumber API:a varten:

# FROM rocker/r-ver:4.3.2
# RUN apt-get update && apt-get install -y libssl-dev libcurl4-openssl-dev \
#  && rm -rf /var/lib/apt/lists/*
# RUN Rscript -e "install.packages(c('plumber','jsonlite'), repos='https://cloud.r-project.org')"
# WORKDIR /app
# COPY routes.R api.R ./
# EXPOSE 8000
# HEALTHCHECK CMD curl -f http://localhost:8000/ping || exit 1
# CMD ["Rscript", "api.R"]

Lokitus tuotannossa

Rakenteinen lokitus auttaa selvittämään tuotannon ongelmia. Kirjoittakaa aikaleimalliset lokit vakiotulosteeseen käyttämällä cat()-funktiota tai logger-pakettia — Docker ja useimmat alustat keräävät vakiotulosteen automaattisesti ja välittävät sen lokien koontijärjestelmään.

# Log format: ISO timestamp + level + message
log_info <- function(msg) {
  cat(format(Sys.time(), '%Y-%m-%dT%H:%M:%S'), '[INFO]', msg, '
')
}

log_info('API starting up')
log_info(paste('Port:', Sys.getenv('PORT', '8000')))

Käänteisvälityspalvelin Nginxillä

Sijoittakaa tuotannossa Plumberin eteen Nginx-käänteisvälityspalvelin käsittelemään TLS:n päättämistä, pyyntömäärien rajoittamista ja pyyntöjen puskurointia. Nginx välittää pyynnöt localhostissa toimivalle Plumberille, kun taas ulkomaailma muodostaa yhteyden Nginxiin portissa 443.

# Nginx config snippet (nginx.conf):
# server {
#   listen 443 ssl;
#   ssl_certificate     /etc/letsencrypt/.../fullchain.pem;
#   ssl_certificate_key /etc/letsencrypt/.../privkey.pem;
#
#   location /api/ {
#     proxy_pass         http://127.0.0.1:8000/;
#     proxy_set_header   Host $host;
#     proxy_set_header   X-Real-IP $remote_addr;
#   }
# }

Pikatarkistus: Dockerin EXPOSE

Mitä Dockerfile-tiedoston EXPOSE 8000-käsky todellisuudessa tekee?

Plumber API:en käyttöönoton kertaus

Plumberin tuotantokäyttöönoton tärkeimmät vaiheet:

  • Kuunnelkaa osoitteessa 0.0.0.0 ja lukekaa PORT ympäristöstä
  • Käyttäkää perusimagena versionumerolla kiinnitettyä rocker/r-ver:X.Y.Z-imagea
  • Asentakaa paketit Dockerfile-tiedostossa ja kopioikaa vain lähdetiedostot
  • Välittäkää salaisuudet -e-ympäristömuuttujina — älkää koskaan sijoittako niitä lähdekoodiin tai Dockerfile-tiedostoon
  • Lisätkää /ping-terveystarkistuksen päätepiste (jossa on #* @preempt auth)
  • Käyttäkää Nginxiä käänteisvälityspalvelimena TLS:lle ja pyyntömäärien rajoittamiseen
Aloita maksutta

Opi R tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
43
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Plumber-rajapintojen käyttöönotto tuotannossa” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa R Academy-oppimispolun 3 oppituntia, myös oppitunnin “Plumber-rajapintojen käyttöönotto tuotannossa”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. R Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Plumber-rajapintojen käyttöönotto tuotannossa”?

Pakkaakaa ja ottakaa Plumber-rajapintoja käyttöön Dockerilla ja pilvialustoilla. Harjoittelet R Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni R Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin R Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Plumber-rajapintojen käyttöönotto tuotannossa”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä R Academy-oppitunnilla?

Kyllä. Jokainen R Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Plumberin ja RESTin perusteet
  2. GET- ja POST-päätepisteiden luominen
  3. Todennus ja API-tietoturva
  4. Plumber-rajapintojen käyttöönotto tuotannossa
← Takaisin: R Academy