6 minute read

Salah satu disadvantage pengguna R yang sering dikonsultasikan kepada saya adalah kesulitan untuk mengubah model/algoritma ke versi production. Hal tersebut yang justru menjadi advantage pengguna Python. Sebenarnya kita bisa menyiasatinya dengan menggunakan plumber yang mengubah model dalam R menjadi API-based.

Namun jika algoritma yang kita miliki bukan berupa model prediksi / klasifikasi, maka akan sulit untuk menjadikannya API-based. Sebagai contoh, algoritma optimisasi tentang penjadwalan tatap muka terbatas. Akan susah bagi saya untuk mengkonversikannya ke dalam plumber tapi akan lebih mudah bagi saya membuatkan Shiny Apps.

Dalam pekerjaan kantor, saya seringkali membuat Shiny Apps untuk keperluan dashboard dan RPA converter.

Masalahnya adalah Shiny Apps memerlukan Shiny Server untuk di-run secara independen dari R. Sedangkan Shiny Server gratisan dari situs Shinyapps.io punya beberapa keterbatasan.

Saya sendiri sudah hampir setahun menggunakan layanan server dari situs Railway.app. Alangkah baiknya jika saya bisa menaruh Shiny Apps buatan saya di sana.

Dockerize Shiny Apps

Salah satu solusi yang bisa dicoba adalah dengan membuat docker container dari Shiny Apps yang ada. Setelah itu, saya tinggal menempelnya di server manapun termasuk di Railway.app. Bagaimana caranya? Begini caranya:

Langkah I

Siapkan Shiny Apps yang kita buat di Quarto. Perhatikan bahwa kita bekerja di satu working directory. Pada kasus ini, saya membuat satu dashboard visualisasi Quarto dari data mtcars. Artinya saya hanya memiliki satu file berformat .qmd saja di working directory (tidak ada files lainnya).

Shiny Apps ini saya beri nama index.qmd.

Langkah II

Setelah itu, kita akan buat dua files, yakni:

  1. Dockerfile yang akan berisi skrip yang akan meng-contain Shiny Apps tersebut.
  2. shiny-server.conf yang akan berisi konfigurasi sederhana tentang bagaimana working directory dan port yang digunakan.

Langkah III

Silakan buat satu file bernama shiny-server.conf dengan isi berikut ini:

run_as shiny;

server {
  listen 3838;

  location / {
    site_dir /srv/shiny-server/dashboard;
    log_dir /var/log/shiny-server;
  }
}

Langkah IV

Silakan buat Dockerfile dengan isi berikut ini:

# shiny server dari base rocker
FROM rocker/shiny

# update dan upgrade versi linux
RUN apt-get update && apt-get install -y --no-install-recommends \
    pandoc \
    curl \
    gdebi-core \
    && rm -rf /var/lib/apt/lists/*

# install quarto versi terbaru
RUN curl -LO https://github.com/quarto-dev/quarto-cli/releases/download/v1.6.42/quarto-1.6.42-linux-amd64.deb
RUN gdebi --non-interactive quarto-1.6.42-linux-amd64.deb

# install libraries yang diperlukan
RUN R -e "install.packages(c('shiny', 'quarto'))"
RUN Rscript -e "install.packages(c('dplyr','tidyr','ggplot2'));"

# membuat working directory yang diperlukan
RUN mkdir -p /srv/shiny-server/dashboard && \
    chown -R shiny:shiny /srv/shiny-server

# kita copy server configuration ke dalam working directory
COPY shiny-server.conf /etc/shiny-server/shiny-server.conf

# membuat working directory yang diperlukan
RUN mkdir -p /var/log/shiny-server && \
    chown -R shiny:shiny /var/log/shiny-server

# kita copy shiny apps ke dalam working directory
COPY index.qmd /srv/shiny-server/dashboard/index.qmd

# set working directory
WORKDIR /srv/shiny-server/dashboard/

# run quarto
RUN quarto render index.qmd

USER shiny
CMD ["/usr/bin/shiny-server"]

Langkah V

Jika semua persiapan sudah dilakukan, kita bisa membuat langsung container-nya dengan perintah sebagai berikut:

# build dan berikan nama dashiny
docker build -t ikanx101/dashiny . 

Sebenarnya pada tahap ini, container sudah selesai kita buat. Jika kita hendak menaruhnya ke cloud atau docker hub.

Langkah VI

Kita bisa run containernya langsung dengan perintah ini:

docker run -d --name sini ikanx101/r-shiny

if you find this article helpful, support this blog by clicking the ads.