rshiny-servershinyshinydashboard

Shiny Server session time out doesn't work


I have a shiny app deployed on a Linux server. I want the app to timeout if there is no activity for a minute. Based on what I read, I added the line app_idle_timeout to the shiny-server.conf file, but I notice that it doesn't work. Can someone please advice how I can ensure that the session times out after a minute? Note: I do NOT have Shiny Server PRO.

Below is what my shiny-server.conf looks like:

Instruct Shiny Server to run applications as the user "shiny"
run_as shiny;

# Define a server that listens on port 3838
server {
  listen 3838;
 
  # Define a location at the base URL
  location / {

    # Host the directory of Shiny Apps stored in this directory
    site_dir /srv/shiny-server;

    # Log all Shiny output to files in this directory
    log_dir /var/log/shiny-server;
    app_idle_timeout 60;

    # When a user visits the base URL rather than a particular application,
    # an index of the applications available in this directory will be shown.
    directory_index on;

  }
}
~                 

Solution

  • You can configure your idle time within the shiny app like so using some JS, here the app will timeout after 5 seconds.

    library(shiny)
    library(leaflet)
    
    inactivity <- "function idleTimer() {
      var t = setTimeout(logout, 5000);
      window.onmousemove = resetTimer; // catches mouse movements
      window.onmousedown = resetTimer; // catches mouse movements
      window.onclick = resetTimer;     // catches mouse clicks
      window.onscroll = resetTimer;    // catches scrolling
      window.onkeypress = resetTimer;  //catches keyboard actions
    
      function logout() {
        window.close();  //close the window
      }
    
      function resetTimer() {
        clearTimeout(t);
        t = setTimeout(logout, 5000);  // time is in milliseconds (1000 is 1 second)
      }
    }
    idleTimer();"
    
    
    ui <- fluidPage(
      tags$script(inactivity),    
      leafletOutput("mymap")
    
    )
    
    server <- shinyServer(function(input,output,session){
    
      points <- eventReactive(input$recalc, {
        cbind(rnorm(40) * 2 + 13, rnorm(40) + 48)
      }, ignoreNULL = FALSE)
    
      output$mymap <- renderLeaflet({
        leaflet() %>%
          addProviderTiles(providers$Stamen.TonerLite,options = providerTileOptions(noWrap = TRUE)) %>% 
          addMarkers(data = points())
      })
    
    })
    runApp(list(ui = ui, server = server))