0Pricing
R Academy · Lección

Implementación de API de Plumber en producción

Containerice e implemente API de Plumber con Docker y plataformas en la nube.

Implementación de API de Plumber en producción es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.

Opciones de despliegue en producción

Una API de Plumber puede desplegarse de varias formas:

  • Contenedor Docker: portátil, reproducible y funcional en cualquier entorno
  • Posit Connect: despliegue con un clic y programación de tareas
  • Digital Ocean / EC2: una máquina virtual Linux básica que ejecuta R

Docker es la opción más portátil y el estándar del sector para las API de R en producción.

Punto de entrada de la API de Plumber

Cree un archivo api.R de nivel superior que inicie el servidor de Plumber. Use Sys.getenv('PORT', unset='8000') para que el orquestador de contenedores pueda establecer el puerto sin modificar el código.

# 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)

Imagen Docker base: rocker/r-ver

La imagen rocker/r-ver proporciona un entorno de R mínimo y con la versión fijada. Fije siempre una versión concreta de R (por ejemplo, rocker/r-ver:4.3.2) para garantizar compilaciones reproducibles. Evite :latest en producción.

# 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.

Instalación de paquetes de R en el Dockerfile

Use RUN Rscript -e "install.packages(...)" para instalar los paquetes durante la compilación de la imagen. Instale primero las dependencias del sistema (por ejemplo, libssl-dev para httr2) mediante apt-get.

# 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')"

Copia de archivos y configuración del puerto

Copie los archivos de código fuente de R en el contenedor con COPY. Declare el puerto con EXPOSE para indicar a Docker en qué puerto escucha el contenedor. Esto solo sirve como documentación; no publica el puerto.

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

Compilación y ejecución de la imagen Docker

Compile la imagen con docker build y, después, ejecute un contenedor asignando el puerto del host al puerto del contenedor. La opción -e inyecta variables de entorno para los secretos.

# 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

Lectura de secretos con Sys.getenv()

En producción, nunca incluya secretos en el Dockerfile ni en el código fuente. Léalos en tiempo de ejecución con Sys.getenv(). Páselos mediante las opciones -e de Docker, secretos de Kubernetes o sistemas de gestión de variables de entorno como AWS Secrets Manager.

# 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()
')

Endpoint de comprobación de estado

Un endpoint /ping o /health permite que los balanceadores de carga y los orquestadores (Kubernetes, ECS) confirmen que la API está activa. Debe devolver rápidamente un 200 sin autenticación y, opcionalmente, comprobar la conectividad con la base de datos.

# #* 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

Ejemplo completo de Dockerfile

Un ejemplo completo: un Dockerfile listo para producción para una API de Plumber:

# 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"]

Registro en producción

El registro estructurado ayuda a diagnosticar problemas en producción. Use cat() o el paquete logger para escribir registros con marcas de tiempo en stdout; Docker y la mayoría de las plataformas capturan stdout automáticamente y lo envían a un agregador de registros.

# 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')))

Proxy inverso con Nginx

En producción, coloque un proxy inverso de Nginx delante de Plumber para gestionar la terminación de TLS, la limitación de frecuencia y el almacenamiento en búfer de las solicitudes. Nginx reenvía las solicitudes a Plumber en localhost, mientras que el exterior se conecta a Nginx mediante el puerto 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;
#   }
# }

Comprobación rápida: Docker EXPOSE

¿Qué hace realmente la instrucción EXPOSE 8000 en un Dockerfile?

Repaso del despliegue de API de Plumber

Pasos clave para desplegar Plumber en producción:

  • Escuche en 0.0.0.0 y lea PORT del entorno
  • Use rocker/r-ver:X.Y.Z (con la versión fijada) como imagen base
  • Instale los paquetes en el Dockerfile; copie únicamente los archivos de código fuente
  • Inyecte los secretos mediante variables de entorno -e; nunca los incluya en el código fuente ni en el Dockerfile
  • Añada un endpoint de estado /ping (con #* @preempt auth)
  • Use Nginx como proxy inverso para TLS y la limitación de frecuencia

Preguntas frecuentes

¿La lección «Implementación de API de Plumber en producción» es gratis?

Sí — el texto completo de «Implementación de API de Plumber en producción» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Implementación de API de Plumber en producción»?

Containerice e implemente API de Plumber con Docker y plataformas en la nube. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar R Academy?

No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Implementación de API de Plumber en producción»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de R Academy?

Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Introducción a Plumber y REST
  2. Creación de endpoints GET y POST
  3. Autenticación y seguridad de API
  4. Implementación de API de Plumber en producción
← Volver a R Academy