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/pingLectura 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 1Ejemplo 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.0y leaPORTdel 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
- Introducción a Plumber y REST
- Creación de endpoints GET y POST
- Autenticación y seguridad de API
- Implementación de API de Plumber en producción