ColinFay / brochure

[WIP] Natively Multipage Shiny Apps
Other
106 stars 13 forks source link

Deployment Help for Brochure application #31

Open Brabin3 opened 2 years ago

Brabin3 commented 2 years ago

I have built up a multi-page application using Brochure. I tried to deploy it using Docker & ShinyProxy deployment model. The app gets deployed and the first page alone loads. All other pages are missing when deployed with ShinyProxy (404).

In shiny Proxy application.yml file, container-cmd: ["R", "-e", "shiny::runApp('/root/euler')"]

When I tried to deploy the application without Brochure (i.e Single paged shiny app) then the deployment works.

Any help is greatly invited.

ColinFay commented 2 years ago

Hey,

Yeah there is an issue with the way shiny proxy works — it iframes the actual app so there might be an issue with that.

I will have a look and let you know

Brabin3 commented 2 years ago

Hey, Thank you!

Your help is greatly appreciated.

jjfantini commented 2 years ago

Has there been any progress made with using shinyProxy and Docker? I was looing to use this deployment avenue myself, @ColinFay @Brabin3

ColinFay commented 2 years ago

Two q for @Brabin3 :

-> Do you have specified a basepath in your brochureApp ? by default brochure assumes that your app is at url/, but shinyproxy deploys at url/myapp -> Do the link inside your app redirect to url/myapp/mypage or to url/mypage ?

@jjfantini I'll work on this, my only current issue is that it requires some time to have a shiny proxy running, a container with a brochure app, and all that is implied by that :)

jjfantini commented 2 years ago

@ColinFay that sounds great, I will try to flesh out issues here that I run into when deploying with this method, think it would be helpful for users down the road to have this one paved...looking forward to a fully isolated app environment that is isolated further with brochure -- the data flow design is much better when so explicit. Look forward to the journey ahead :) bear with me, v new to web dev

jjfantini commented 2 years ago

@ColinFay so the basepath argument should be url/myapp and the following brochurePages() should be href = 'myapp/page'?

teofiln commented 2 years ago

I have something similar on shinyapps.io, where the apps url is: username.shinyapps.io/app_name. Because the base url is /app_name, and not just /, the redirects also do not work out of the box.

I was able to get things working by:

  1. adding baseurl = app_name in run_app()
  2. converting all the redirect links from /pageX to /app_name/pageX

So now things work well on shinyapps.io, but not locally, as the local url does not have the /app_name suffix.

To fix this we can dynamically generate the redirect href based on getOption("baseurl"). Some function like:

#' make_href
#'
#' @description Add appropriate prefix to redirect link depending on context (option baseurl)
#' @param endpoint endpoint without leading `/`
#' @noRd
make_href <- function(endpoint) {
  baseurl <- getOption("baseurl")
  if (baseurl != "") {
    paste0("/", baseurl, "/", endpoint, sep = "")
  } else {
    paste0("/", endpoint, sep = "")
  }
}

Then, in /dev/run_dev.R we can set

options(baseurl = "")
> make_href("")
[1] "/"
> make_href("page2")
[1] "/page2"

# then run app should work with unprefixed hrefs
run_app()

In 'production' mode on shinyapps.io, we can add the baseurl option in app.R just before calling run_app() :

options(baseurl = "my_app")
> make_href("")
[1] "/my_app/"
> make_href("page2")
[1] "/my_app/page2"

# then run app should work with prefixed hrefs
run_app()

Maybe something similar will work in shinyProxy?