0Pricing
R Academy · درس

نشر تطبيقات Shiny

انشر التطبيقات على shinyapps.io وShiny Server والبيئات التي تستخدم Docker

نشر تطبيقات Shiny درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

نظرة عامة على خيارات النشر

يمكن نشر تطبيقات Shiny على عدة منصات، وذلك حسب الميزانية وحجم الزيارات المتوقع ومتطلبات التحكم:

  • shinyapps.io: استضافة سحابية مُدارة من Posit — الخيار الأسهل، مع توفّر خطة مجانية.
  • Shiny Server (open source): استضافة ذاتية على Linux، مجانًا.
  • Posit Connect: منصة تجارية بمستوى مؤسسي، وتدعم أيضًا R Markdown وPlumber.
  • Docker + rocker/shiny: أعلى مستوى من قابلية النقل والتحكم.
# Summary of deployment options and their trade-offs:
# shinyapps.io: managed, auto-scaling, per-instance pricing
# Shiny Server: self-hosted, unlimited users, needs sysadmin
# Posit Connect: enterprise SSO, scheduling, REST APIs
# Docker: any cloud provider, reproducible environments

cat('Choose based on: scale, budget, infra control needs')

بنية app.R للنشر

يجب أن يحتوي تطبيق Shiny القابل للنشر إما على ملف app.R واحد (يتضمن كلاً من ui وserver) أو ملفين هما ui.R وserver.R. يجب التصريح عن جميع تبعيات الحزم باستخدام library() في الجزء العلوي. ويجب أن تكون ملفات البيانات في الدليل نفسه أو قابلة للوصول إليها بمسار نسبي إلى التطبيق.

# Minimal app.R for deployment
library(shiny)
library(ggplot2)
library(dplyr)

# Load data relative to app directory
data <- readRDS('data/processed_data.rds')

ui <- fluidPage(
  titlePanel('My Deployed App'),
  sidebarLayout(
    sidebarPanel(selectInput('var', 'Variable:', choices = names(data))),
    mainPanel(plotOutput('main_plot'))
  )
)

server <- function(input, output, session) {
  output$main_plot <- renderPlot({
    ggplot(data, aes_string(x = input$var)) + geom_histogram()
  })
}

shinyApp(ui, server)

rsconnect::deployApp()

تتولى حزمة rsconnect نشر التطبيقات إلى shinyapps.io وPosit Connect. ابدأ بتهيئة بيانات اعتماد حسابك، ثم استدعِ rsconnect::deployApp() من دليل التطبيق. وستجمع الحزمة تلقائيًا جميع ملفات R والبيانات وملف البيان.

library(rsconnect)

# One-time setup: link your shinyapps.io account
# rsconnect::setAccountInfo(
#   name   = 'your_account_name',
#   token  = 'YOUR_TOKEN',
#   secret = 'YOUR_SECRET'
# )

# Deploy the app in the current directory
rsconnect::deployApp(
  appDir  = '.',          # or 'path/to/app'
  appName = 'my_analysis_app',
  forceUpdate = TRUE
)

إعداد shinyapps.io

يُعد shinyapps.io أسرع طريق للحصول على عنوان URL عام. أنشئ حسابًا مجانيًا على shinyapps.io، وانسخ الرمز السري والمفتاح السري من لوحة المعلومات، ثم استدعِ setAccountInfo(). تتيح الخطة المجانية 5 تطبيقات و25 ساعة تشغيل نشطة شهريًا.

library(rsconnect)

# Copy credentials from shinyapps.io -> Account -> Tokens
rsconnect::setAccountInfo(
  name   = 'your_username',
  token  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
)

# Verify the connection
rsconnect::accountInfo()

# List currently deployed apps
rsconnect::applications()

Shiny Server مفتوح المصدر

يعمل Shiny Server على Linux (Ubuntu/RHEL)، ويقدّم تطبيقات Shiny من الدليل /srv/shiny-server/. ويصبح كل دليل فرعي تطبيقًا متاحًا على العنوان http://server:3838/subdirname/. وهو مجاني ويدعم عددًا غير محدود من المستخدمين المتزامنين (ضمن سعة الخادم).

# Install Shiny Server on Ubuntu:
# sudo apt-get install r-base
# sudo R -e 'install.packages(c("shiny", "rmarkdown"))'
# wget https://download3.rstudio.org/ubuntu-20.04/x86_64/shiny-server-1.5.21.1012-amd64.deb
# sudo dpkg -i shiny-server-1.5.21.1012-amd64.deb

# Deploy an app:
# sudo cp -r /path/to/myapp /srv/shiny-server/myapp
# Access at: http://your-server:3838/myapp

# Config file: /etc/shiny-server/shiny-server.conf
cat('Shiny Server config controls ports, auth, and app paths')

Docker مع rocker/shiny

توفر صورة Docker ‏rocker/shiny خادم Shiny مُعدًا مسبقًا. اربط دليل تطبيقك بالحاوية لتقديمه مباشرةً. يضمن Docker قابلية إعادة الإنتاج — إذ تعمل الصورة نفسها بالطريقة ذاتها على أي مضيف.

# Dockerfile for a custom Shiny app
# FROM rocker/shiny:4.4.0
#
# # Install R package dependencies
# RUN R -e 'install.packages(c("ggplot2","dplyr","DT"))'
#
# # Copy app files
# COPY myapp/ /srv/shiny-server/myapp/
#
# EXPOSE 3838

# Build and run:
# docker build -t my-shiny-app .
# docker run -p 3838:3838 my-shiny-app

# Access at: http://localhost:3838/myapp

renv للتبعيات القابلة لإعادة الإنتاج

تنشئ renv مكتبة حزم على مستوى المشروع، مع ملف قفل (renv.lock) يسجل الإصدارات الدقيقة للحزم. وعند النشر، يضمن ملف القفل تثبيت الخادم أو صورة Docker للإصدارات نفسها تمامًا من الحزم المستخدمة أثناء التطوير.

library(renv)

# Initialise renv in the project (creates renv.lock)
renv::init()

# After installing/updating packages, record the state
renv::snapshot()

# On the server: restore exact versions from lockfile
renv::restore()

# Check lockfile for a specific package version
renv::dependencies()  # lists all used packages

متغيرات البيئة للتهيئة

لا تضع مفاتيح API أو كلمات مرور قواعد البيانات أو الإعدادات الخاصة بالبيئة مباشرةً في شفرة التطبيق. استخدم متغيرات البيئة واقرأها باستخدام Sys.getenv('VAR_NAME', unset = NA). اضبطها محليًا في .Renviron، وفي إعدادات البيئة الخاصة بمنصة الاستضافة عند استخدام التطبيق في الإنتاج.

# In .Renviron (never commit this file):
# DB_HOST=prod-db.example.com
# DB_PASSWORD=secret123
# API_KEY=key_abc

# In app.R:
db_host <- Sys.getenv('DB_HOST',     unset = 'localhost')
db_pass <- Sys.getenv('DB_PASSWORD', unset = '')
api_key <- Sys.getenv('API_KEY',     unset = '')

if (api_key == '') {
  warning('API_KEY not set — some features disabled')
}

نظرة عامة على Posit Connect

Posit Connect منصة مؤسسية لنشر تطبيقات Shiny ومستندات R Markdown وواجهات Plumber البرمجية وغير ذلك. وهي تدعم:

  • تسجيل الدخول الموحّد (SSO) عبر LDAP أو SAML
  • التنفيذ المجدول لتقارير R Markdown
  • التحكم في الوصول على مستوى التطبيق
  • التوسّع التلقائي وموازنة التحميل

يستخدم النشر سير العمل نفسه rsconnect::deployApp() المستخدم مع shinyapps.io.

library(rsconnect)

# Configure connection to Posit Connect server
rsconnect::addServer(
  url  = 'https://connect.yourcompany.com',
  name = 'my_connect_server'
)

# Authenticate with API key
rsconnect::connectApiUser(
  account = 'jsmith',
  server  = 'my_connect_server',
  apiKey  = Sys.getenv('CONNECT_API_KEY')
)

# Deploy
rsconnect::deployApp(server = 'my_connect_server')

قائمة التحقق قبل النشر

قبل نشر تطبيق Shiny في بيئة الإنتاج، تحقّق مما يلي:

  • تستخدم جميع مسارات الملفات مسارات نسبية، وليس مسارات مطلقة.
  • تُقرأ البيانات الحساسة (مفاتيح API وكلمات المرور) من متغيرات البيئة.
  • التبعيات الخاصة بالحزم مصرّح عنها صراحةً باستخدام library() أو renv.lock.
  • تُحمّل ملفات البيانات الكبيرة مرة واحدة في الجزء العلوي من server.R (وليس داخل reactive).
  • لا تكشف رسائل الخطأ معلومات داخلية للمستخدمين النهائيين.
# Production-hardened app.R patterns

# Load data once at startup (not per-session)
app_data <- readRDS('data/processed.rds')  # outside server()

server <- function(input, output, session) {
  # Reference app_data directly — already in memory
  output$plot <- renderPlot({
    subset_data <- app_data[app_data$group == input$grp, ]
    plot(subset_data$x, subset_data$y)
  })

  # Sanitise error messages
  tryCatch({
    risky_operation()
  }, error = function(e) {
    showNotification('An error occurred.', type = 'error')
    # log the real error internally, not to user
    message('Error: ', conditionMessage(e))
  })
}

اعتبارات التوسّع

تعمل تطبيقات Shiny على أساس الجلسات: يحصل كل مستخدم على عملية R (أو عامل) خاص به. وتشمل استراتيجيات التوسّع ما يلي:

  • تحميل البيانات المحسوبة مسبقًا عند بدء التشغيل بدلًا من حسابها لكل جلسة.
  • استخدام التخزين المؤقت التفاعلي مع bindCache() للحسابات المكلفة التي تُشارك بين الجلسات.
  • عمال متعددون: ينشئ Shiny Server Pro وPosit Connect عمليات R متوازية.
  • واجهات قواعد البيانات: استخدم DBI/pool للوصول المتزامن إلى قواعد البيانات.
library(shiny)
library(pool)

# Create a database connection pool at startup
# (shared across all sessions)
pool <- dbPool(
  drv      = RPostgres::Postgres(),
  host     = Sys.getenv('DB_HOST'),
  dbname   = 'analytics',
  user     = Sys.getenv('DB_USER'),
  password = Sys.getenv('DB_PASSWORD'),
  minSize  = 2,
  maxSize  = 10
)

onStop(function() { poolClose(pool) })

server <- function(input, output, session) {
  output$tbl <- renderTable({
    dbGetQuery(pool, 'SELECT * FROM metrics LIMIT 100')
  })
}

تحقق سريع

ما الطريقة الموصى بها للتعامل مع مفاتيح API وكلمات مرور قواعد البيانات في تطبيق Shiny منشور؟

مراجعة نشر تطبيقات Shiny

أهم النقاط من درس نشر تطبيقات Shiny:

  • خيارات النشر: shinyapps.io (الأسهل)، وShiny Server (استضافة ذاتية)، وPosit Connect (مؤسسي)، وDocker.
  • يجب أن يصرّح app.R عن جميع التبعيات باستخدام library()؛ استخدم renv::snapshot() لضمان قابلية إعادة إنتاج الإصدارات.
  • تجمع rsconnect::deployApp() التطبيق وترسله إلى shinyapps.io أو Posit Connect.
  • يوفر Docker مع rocker/shiny أعلى مستوى من قابلية النقل.
  • استخدم Sys.getenv() لبيانات الاعتماد — ولا تضع الأسرار مباشرةً في الشفرة أبدًا.
  • حمّل مجموعات البيانات الكبيرة عند بدء التشغيل (خارج server()) لمشاركتها بين الجلسات.
  • استخدم تجمعات الاتصالات (حزمة pool) للوصول المتزامن إلى قواعد البيانات.
# Minimal production-ready structure
# myapp/
#   app.R           <- ui + server + shinyApp()
#   data/           <- processed datasets
#   R/              <- modules and helpers
#   renv.lock       <- package version snapshot
#   .Renviron       <- local env vars (gitignored)

# Deploy:
library(rsconnect)
rsconnect::deployApp(
  appDir  = 'myapp',
  appName = 'my_production_app'
)

الأسئلة الشائعة

هل درس «نشر تطبيقات Shiny» مجاني؟

نعم — نص درس «نشر تطبيقات Shiny» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «نشر تطبيقات Shiny»؟

انشر التطبيقات على shinyapps.io وShiny Server والبيئات التي تستخدم Docker تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «نشر تطبيقات Shiny»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعمّق في البرمجة التفاعلية
  2. وحدات Shiny لإعادة استخدام التعليمات البرمجية
  3. واجهة مستخدم ديناميكية باستخدام renderUI وinsertUI
  4. نشر تطبيقات Shiny
← العودة إلى R Academy