Skip to content

Commit

Permalink
Adds localhost install feature (PR #348 and #380)
Browse files Browse the repository at this point in the history
  - Updates installation scripts and config files
     to make the localhost install possible.
  - Makes both trial and localhost install create
     single user only.

---------
Co-authored-by: nichlaes <[email protected]>
  • Loading branch information
prasadtalasila authored Dec 21, 2023
1 parent d373409 commit e9c3cf0
Show file tree
Hide file tree
Showing 15 changed files with 420 additions and 45 deletions.
1 change: 1 addition & 0 deletions .codeclimate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ exclude_patterns:
- "**/public/"
- client/config/
- servers/lib/src/types.ts
- "deploy/config/client/env*.js"
2 changes: 1 addition & 1 deletion deploy/config/client/env.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
window.env = {
REACT_APP_ENVIRONMENT: 'dev',
REACT_APP_ENVIRONMENT: 'prod',
REACT_APP_URL: 'https://foo.com/',
REACT_APP_URL_BASENAME: '',
REACT_APP_URL_DTLINK: '/lab',
Expand Down
19 changes: 19 additions & 0 deletions deploy/config/client/env.local.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
window.env = {
REACT_APP_ENVIRONMENT: "local",
REACT_APP_URL: "http://localhost/",
REACT_APP_URL_BASENAME: "",
REACT_APP_URL_DTLINK: "/lab",
REACT_APP_URL_LIBLINK: "",
REACT_APP_WORKBENCHLINK_TERMINAL: "/terminals/main",
REACT_APP_WORKBENCHLINK_VNCDESKTOP: "/tools/vnc/?password=vncpassword",
REACT_APP_WORKBENCHLINK_VSCODE: "/tools/vscode/",
REACT_APP_WORKBENCHLINK_JUPYTERLAB: "/lab",
REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: "",

REACT_APP_CLIENT_ID:
"1be55736756190b3ace4c2c4fb19bde386d1dcc748d20b47ea8cfb5935b8446c",
REACT_APP_AUTH_AUTHORITY: "https://gitlab.com/",
REACT_APP_REDIRECT_URI: "http://localhost/Library",
REACT_APP_LOGOUT_REDIRECT_URI: "http://localhost/",
REACT_APP_GITLAB_SCOPES: "openid profile read_user read_repository api",
};
18 changes: 18 additions & 0 deletions deploy/config/client/env.trial.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
window.env = {
REACT_APP_ENVIRONMENT: 'trial',
REACT_APP_URL: 'https://foo.com/',
REACT_APP_URL_BASENAME: '',
REACT_APP_URL_DTLINK: '/lab',
REACT_APP_URL_LIBLINK: '',
REACT_APP_WORKBENCHLINK_TERMINAL: '/terminals/main',
REACT_APP_WORKBENCHLINK_VNCDESKTOP: '/tools/vnc/?password=vncpassword',
REACT_APP_WORKBENCHLINK_VSCODE: '/tools/vscode/',
REACT_APP_WORKBENCHLINK_JUPYTERLAB: '/lab',
REACT_APP_WORKBENCHLINK_JUPYTERNOTEBOOK: '',

REACT_APP_CLIENT_ID: '934b98f03f1b6f743832b2840bf7cccaed93c3bfe579093dd0942a433691ccc0',
REACT_APP_AUTH_AUTHORITY: 'https://gitlab.foo.com/',
REACT_APP_REDIRECT_URI: 'https://foo.com/Library',
REACT_APP_LOGOUT_REDIRECT_URI: 'https://foo.com/',
REACT_APP_GITLAB_SCOPES: 'openid profile read_user read_repository api',
};
35 changes: 35 additions & 0 deletions deploy/config/gateway/fileConfig.local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
http:
routers:
dtaas:
entryPoints:
- http
rule: "Host(`localhost`)"
service: dtaas

user1:
entryPoints:
- http
rule: "Host(`localhost`) && PathPrefix(`/user1`)"
service: user1

libms:
entryPoints:
- http
rule: "Host(localhost`) && PathPrefix(`/lib`)"
service: libms

services:
dtaas:
loadBalancer:
servers:
- url: "http://localhost:4000"

user1:
loadBalancer:
servers:
- url: "http://localhost:8090"

libms:
loadBalancer:
servers:
- url: "http://localhost:4001"
48 changes: 48 additions & 0 deletions deploy/config/gateway/fileConfig.trial.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
http:
routers:
dtaas:
entryPoints:
- http
rule: 'Host(`foo.com`)'
middlewares:
- basic-auth
service: dtaas

user1:
entryPoints:
- http
rule: 'Host(`foo.com`) && PathPrefix(`/user1`)'
middlewares:
- basic-auth
service: user1

libms:
entryPoints:
- http
rule: 'Host(`foo.com`) && PathPrefix(`/lib`)'
service: libms


# Middleware: Basic authentication
middlewares:
basic-auth:
basicAuth:
usersFile: "/etc/traefik/auth"
removeHeader: true


services:
dtaas:
loadBalancer:
servers:
- url: "http://localhost:4000"

user1:
loadBalancer:
servers:
- url: "http://localhost:8090"

libms:
loadBalancer:
servers:
- url: "http://localhost:4001"
Empty file modified deploy/cron.sh
100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion deploy/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ TOP_DIR=$(pwd)
printf "\n \n Build, configure and run the react website\n "
printf ".....\n "
cd "${TOP_DIR}/client" || exit
yarn install
yarn install --production
yarn build

#one of the environments; specify only one; "dev" used the REACT_APP_ENV is not set
Expand Down
102 changes: 74 additions & 28 deletions deploy/single-script-install.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
#!/bin/bash
set -eu
while [[ "$#" -gt 0 ]]; do
case $1 in
--env)
env_variable="$2"
shift
;;
--username)
username="$2"
shift
;;
*)
echo "Unknown parameter passed: $1"
exit 1
;;
esac
shift
done

set -e

if [ -n "$env_variable" ] ; then
printf "environment: %s.\n" "$env_variable"
fi

printf "Install script for DTaaS software platform.\n"
printf "You can run the script multiple times until the installation succeeds.\n "
Expand Down Expand Up @@ -125,11 +147,15 @@ TOP_DIR=$(pwd)
printf "\n\n Build, configure and run the react website\n "
printf ".....\n "
cd "${TOP_DIR}/client" || exit
yarn install
yarn install --production
yarn build

yarn configapp dev
cp "${TOP_DIR}/deploy/config/client/env.js" build/env.js
if [ -n "$env_variable" ] ; then
cp "${TOP_DIR}/deploy/config/client/env.${env_variable}.js" build/env.js
else
cp "${TOP_DIR}/deploy/config/client/env.js" build/env.js
fi
nohup serve -s build -l 4000 & disown

#-------------
Expand All @@ -156,34 +182,48 @@ nohup yarn start & disown
#-------------
printf "\n\n Start the user workspaces\n "
printf "...........\n "
docker run -d \
-p 8090:8080 \
--name "ml-workspace-user1" \
-v "${TOP_DIR}/files/user1:/workspace" \
-v "${TOP_DIR}/files/common:/workspace/common" \
--env AUTHENTICATE_VIA_JUPYTER="" \
--env WORKSPACE_BASE_URL="user1" \
--shm-size 512m \
--restart always \
mltooling/ml-workspace-minimal:0.13.2 || true

docker run -d \
-p 8091:8080 \
--name "ml-workspace-user2" \
-v "${TOP_DIR}/files/user2:/workspace" \
-v "${TOP_DIR}/files/common:/workspace/common" \
--env AUTHENTICATE_VIA_JUPYTER="" \
--env WORKSPACE_BASE_URL="user2" \
--shm-size 512m \
--restart always \
mltooling/ml-workspace-minimal:0.13.2 || true
if [ -n "$username" ] ; then
cp -R "${TOP_DIR}/files/user1" "${TOP_DIR}/files/${username}"
docker run -d \
-p 8090:8080 \
--name "ml-workspace-${username}" \
-v "${TOP_DIR}/files/${username}:/workspace" \
-v "${TOP_DIR}/files/common:/workspace/common" \
--env AUTHENTICATE_VIA_JUPYTER="" \
--env WORKSPACE_BASE_URL="${username}" \
--shm-size 512m \
--restart always \
mltooling/ml-workspace-minimal:0.13.2 || true
else
docker run -d \
-p 8090:8080 \
--name "ml-workspace-user1" \
-v "${TOP_DIR}/files/user1:/workspace" \
-v "${TOP_DIR}/files/common:/workspace/common" \
--env AUTHENTICATE_VIA_JUPYTER="" \
--env WORKSPACE_BASE_URL="user1" \
--shm-size 512m \
--restart always \
mltooling/ml-workspace-minimal:0.13.2 || true
fi



#-------------
printf "\n\n Start the traefik gateway server\n "
printf "...........\n "
cd "${TOP_DIR}/servers/config/gateway" || exit
cp "${TOP_DIR}/deploy/config/gateway/auth" auth
cp "${TOP_DIR}/deploy/config/gateway/fileConfig.yml" "dynamic/fileConfig.yml"
if [ -n "$env_variable" ] ; then
cp "${TOP_DIR}/deploy/config/gateway/fileConfig.${env_variable}.yml" "dynamic/fileConfig.yml"
else
cp "${TOP_DIR}/deploy/config/gateway/fileConfig.yml" "dynamic/fileConfig.yml"
fi

if [ -n "$username" ] ; then
sed "s/user1/${username}/" "${TOP_DIR}/deploy/config/gateway/fileConfig.${env_variable}.yml" > "dynamic/fileConfig.yml"
fi

docker run -d \
--name "traefik-gateway" \
Expand All @@ -206,7 +246,13 @@ printf "\n\n The installation is complete.\n\n\n "

printf "Continue with the application configuration.\n "
printf ".........\n\n\n "
printf "Remember to change foo.com and Gitlab OAuth details to your \
local settings in the following files.\n "
printf "1. %s/client/build/env.js\n " "$TOP_DIR"
printf "2. %s/servers/config/gateway/dynamic/fileConfig.yml\n " "$TOP_DIR"
if [[ "$env_variable" == "local" ]]; then
printf "Remember to change Gitlab OAuth details to your \
local settings in the following file.\n "
printf "%s/client/build/env.js\n " "$TOP_DIR"
else
printf "Remember to change foo.com and Gitlab OAuth details to your \
local settings in the following files.\n "
printf "1. %s/client/build/env.js\n " "$TOP_DIR"
printf "2. %s/servers/config/gateway/dynamic/fileConfig.yml\n " "$TOP_DIR"
fi
87 changes: 87 additions & 0 deletions docs/admin/localhost.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Localhot Installation

To try out the software, you can install it on Ubuntu 22.04
Desktop Operating System. The setup requires a
machine which can spare 4GB RAM, 2 vCPUs and 15GB Hard Disk
space to a the DTaaS application.
A successful installation will create a setup
similar to the one shown in the figure.

![localhost install](./localhost.png)

A one-step installation script is provided on this page. This script sets up
the DTaaS software for a single user.
You can use it to check a test installation of the DTaaS software.

## Pre-requisites

### 1. Gitlab OAuth application

The DTaaS react website requires Gitlab OAuth provider.
If you need more help with this step, please see
the [Authentication page](client/auth.md).

!!! Information
<!-- markdownlint-disable-file MD013 -->
It is sufficient to have [user-owned oauth](https://docs.gitlab.com/ee/integration/oauth_provider.html#create-a-user-owned-application)
application. You can create this application
in your gitlab account.

You need the following information from the Gitlab OAuth application
registered on Gitlab:

| Gitlab Variable Name | Variable name in Client env.js | Default Value |
| :------------------- | :----------------------------- | :----------------------------------------------- |
| OAuth Provider | REACT_APP_AUTH_AUTHORITY | <https://gitlab.com> or <https://gitlab.foo.com> |
| Application ID | REACT_APP_CLIENT_ID |
| Callback URL | REACT_APP_REDIRECT_URI | <http://localhost/Library> |
| Scopes | REACT_APP_GITLAB_SCOPES | openid, profile, read_user, read_repository, api |

You can also see
[Gitlab help page](https://docs.gitlab.com/ee/integration/oauth_provider.html)
for getting the Gitlab OAuth application details.

## Install

<!-- prettier-ignore -->
!!! note
While installing you might encounter multiple dialogs asking,
which services should be restarted. Just click **OK** to all of those.

Run the following commands.

```bash
wget https://raw.githubusercontent.com/INTO-CPS-Association/DTaaS/feature/distributed-demo/deploy/single-script-install.sh
bash single-script-install.sh --env local --username <username>
```

The `--env local` argument is added to the script specifies `localhost`
as the installation scenario. The `--username username` uses your
Gitlab username to configure the DTaaS application.

## Post install

After the single-install-script is successfully run. Please change
[Gitlab OAuth](#1-gitlab-oauth-application) details in

```txt
~/DTaaS/client/build/env.js
```

## Post-install Check

Now when you visit <http://localhost>, you should be able to login through
Gitlab OAuth Provider and access the DTaas web UI.

If you can following along to see all the screenshots from
[user website](../user/website/index.md).
Everything is correctly setup.

## References

Image sources: [Ubuntu logo](https://logodix.com/linux-ubuntu),
[Traefik logo](https://www.laub-home.de/wiki/Traefik_SSL_Reverse_Proxy_f%C3%BCr_Docker_Container),
[ml-workspace](https://github.com/ml-tooling/ml-workspace),
[nodejs](https://www.metachris.com/2017/01/how-to-install-nodejs-7-on-ubuntu-and-centos/),
[reactjs](https://krify.co/about-reactjs/),
[nestjs](https://camunda.com/blog/2019/10/nestjs-tx-email/)
Binary file added docs/admin/localhost.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit e9c3cf0

Please sign in to comment.