---
title: "OpenCPU Server"
author: "Mark Edmondson"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{OpenCPU Server}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

# Setting up a custom OpenCPU server

The below installs your Github repo into the Docker container using a small `Dockerfile`.

In summary:

1. Launch an OpenCPU instance
2. Build a new OpenCPU image with your Github custom package 
3. Push the image to the Container Registry for safe-keeping
4. Stop the default OpenCPU docker container and launch your own

### Launch an OpenCPU Instance

```r
library(googleComputeEngineR)

## start an opencpu template
vm <- gce_vm(name = "opencpu", template = "opencpu", predefined_type = "n1-standard-2")

## wait for opencpu image to load
gce_check_container(vm, "opencpu")
```

### Build a new OpenCPU image

This Dockerfile is available via `get_dockerfolder("opencpu-installgithub")` and below.  It installs an OpenCPU package from my [prediction of user URLs for prefetching](code.markedmondson.me/predictClickOpenCPU/supercharge.html#1) application.

```sh
FROM opencpu/base
MAINTAINER Mark Edmondson (r@sunholo.com)

# install any package dependencies
RUN apt-get update && apt-get install -y \
    nano \
    ## clean up
    && apt-get clean \ 
    && rm -rf /var/lib/apt/lists/ \ 
    && rm -rf /tmp/downloaded_packages/ /tmp/*.rds
    
## Install your custom package from Github
RUN Rscript -e "devtools::install_github(c('MarkEdmondson1234/predictClickOpenCPU'))"

```

The Dockerfile is used to build the custom image below:

```r
## build a docker image with your package installed
docker_build(vm, 
             dockerfolder = get_dockerfolder("opencpu-installgithub"),
             new_image = "opencpu-predictclick")
```

### Push the image to the Container Registry

```r
## push up to your private Google Container registry
gce_push_registry(vm, 
                  save_name = "opencpu-predictclick", 
                  image_name = "opencpu-predictclick")
```

### Deploy 

In this case we don't start a new instance, just stop the running OpenCPU container and start our own.  We need to stop the default container to free up the ports `80` and `8004` that are needed for OpenCPU to work.

```r
## stop default opencpu container
docker_cmd(vm, "stop opencpu-server")

## run custom opencpu server
docker_run(vm, 
           image = "opencpu-predictclick", 
           name = "predictclick", 
           detach = TRUE, 
           docker_opts = "-p 80:80 -p 8004:8004")
``` 

Clean up when you are done to avoid charges. 

```r
gce_vm_stop(vm)
```
