R Academy · Урок

Развёртывание API Plumber в рабочей среде

Создавайте контейнеры и развёртывайте API Plumber с помощью Docker и облачных платформ

Урок 4 из 413 шагов

«Развёртывание API Plumber в рабочей среде» — бесплатный урок R Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Варианты развёртывания в рабочей среде

API Plumber можно развернуть несколькими способами:

  • Контейнер Docker — переносимый, воспроизводимый и работающий где угодно
  • Posit Connect — развёртывание одним нажатием с планированием
  • Digital Ocean / EC2 — обычная Linux VM с установленным R

Docker — самый переносимый вариант и отраслевой стандарт для API на R в рабочей среде.

Точка входа API Plumber

Создайте файл верхнего уровня api.R, который запускает сервер Plumber. Используйте Sys.getenv('PORT', unset='8000'), чтобы порт можно было задавать через оркестратор контейнеров без изменения кода.

# 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 — rocker/r-ver

Образ rocker/r-ver предоставляет минимальное окружение R с зафиксированной версией. Всегда указывайте конкретную версию R (например, rocker/r-ver:4.3.2), чтобы обеспечить воспроизводимость сборок. Не используйте :latest в рабочей среде.

# 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 в Dockerfile

Используйте RUN Rscript -e "install.packages(...)", чтобы устанавливать пакеты во время сборки образа. Сначала установите системные зависимости (например, libssl-dev для httr2) с помощью 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')"

Копирование файлов и настройка порта

Скопируйте исходные файлы R в контейнер с помощью COPY. Объявите порт с помощью EXPOSE, чтобы Docker знал, какой порт прослушивает контейнер. Это только документация — порт не публикуется.

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

Сборка и запуск образа Docker

Соберите образ с помощью docker build, затем запустите контейнер, сопоставив порт хоста с портом контейнера. Флаг -e передаёт переменные окружения, содержащие секреты.

# 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

Чтение секретов с помощью Sys.getenv()

В рабочей среде никогда не помещайте секреты в Dockerfile или исходный код. Считывайте их во время выполнения с помощью Sys.getenv(). Передавайте их через флаги Docker -e, секреты Kubernetes или системы управления переменными окружения, например 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()
')

Конечная точка проверки работоспособности

Конечная точка /ping или /health позволяет балансировщикам нагрузки и оркестраторам (Kubernetes, ECS) подтвердить, что API работает. Она должна быстро возвращать 200 без аутентификации и при необходимости проверять подключение к базе данных.

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

Полный пример Dockerfile

Объединим всё вместе — Dockerfile для API 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"]

Ведение журналов в рабочей среде

Структурированное ведение журналов помогает диагностировать проблемы в рабочей среде. Используйте cat() или пакет logger, чтобы записывать журналы с отметками времени в stdout — Docker и большинство платформ автоматически перехватывают stdout и направляют его в систему агрегации журналов.

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

Обратный прокси с Nginx

В рабочей среде разместите перед Plumber обратный прокси Nginx, чтобы обрабатывать завершение TLS, ограничение частоты запросов и буферизацию запросов. Nginx передаёт запросы Plumber через localhost, а внешние клиенты подключаются к Nginx через порт 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;
#   }
# }

Быстрая проверка: Docker EXPOSE

Что на самом деле делает инструкция EXPOSE 8000 в Dockerfile?

Итоги по развёртыванию API Plumber

Основные шаги развёртывания Plumber в рабочей среде:

  • Прослушивайте 0.0.0.0 и считывайте PORT из окружения
  • Используйте rocker/r-ver:X.Y.Z с зафиксированной версией в качестве базового образа
  • Устанавливайте пакеты в Dockerfile; копируйте только исходные файлы
  • Передавайте секреты через переменные окружения -e — никогда не храните их в исходном коде или Dockerfile
  • Добавьте конечную точку проверки работоспособности /ping (с #* @preempt auth)
  • Используйте Nginx как обратный прокси для TLS и ограничения частоты запросов
Можно начать бесплатно

Изучай R с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
43
Уроки
159

Часто задаваемые вопросы

Урок «Развёртывание API Plumber в рабочей среде» бесплатный?

Да — полный текст урока «Развёртывание API Plumber в рабочей среде» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Развёртывание API Plumber в рабочей среде»?

Создавайте контейнеры и развёртывайте API Plumber с помощью Docker и облачных платформ Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Развёртывание API Plumber в рабочей среде»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Введение в Plumber и REST
  2. Создание конечных точек GET и POST
  3. Аутентификация и безопасность API
  4. Развёртывание API Plumber в рабочей среде
← Назад к R Academy