Развёртывание API Plumber в рабочей среде
Создавайте контейнеры и развёртывайте API Plumber с помощью Docker и облачных платформ
«Развёртывание 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 — локальная установка не требуется.
Все уроки этого курса
- Введение в Plumber и REST
- Создание конечных точек GET и POST
- Аутентификация и безопасность API
- Развёртывание API Plumber в рабочей среде