diff --git a/.gitignore b/.gitignore index 27f16a33f27618aef0ce47b4f036b7f613d32391..02eaabaf4e56d2dc411199f3aeba6045faa5767a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,13 +11,11 @@ # production /build +# local environment +/frontend/local.env + # misc .DS_Store -.env -.env.local -.env.development.local -.env.test.local -.env.production.local *.swp npm-debug.log* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 173d4ad17aa59454d122294eec333842f360c5a5..0ab72ba222849c35dab62eb890cd0a8ce9496bb3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,7 @@ build-project: stage: build-project before_script: [] script: + - cd frontend - echo "Building app" - yarn install - echo "REACT_APP_API_URL=/api/v1" > .env @@ -30,7 +31,7 @@ build-project: expire_in: 1 hour name: web-build paths: - - web-build + - frontend/web-build .kaniko-build: script: @@ -39,7 +40,7 @@ build-project: - export CONTAINER_TAG=${CI_COMMIT_TAG:-${CI_COMMIT_REF_SLUG}} - /kaniko/executor --cache=true --context ${CI_PROJECT_DIR}/${DIRECTORY} --destination ${CI_REGISTRY_IMAGE}/${KANIKO_BUILD_IMAGENAME}:${CONTAINER_TAG} -build-fontend-container: +build-frontend-container: stage: build-container image: # We need a shell to provide the registry credentials, so we need to use the @@ -48,7 +49,7 @@ build-fontend-container: entrypoint: [""] variables: KANIKO_BUILD_IMAGENAME: dashboard - DIRECTORY: web-build + DIRECTORY: frontend/web-build before_script: - cp deployment/Dockerfile $DIRECTORY - cp deployment/nginx.conf $DIRECTORY diff --git a/README.md b/README.md index 0888ee67ccc048dc2360193ee6c79c2e4c88c9d0..58babdfcf403cca5c3e8aa89d18fa9c67929af6e 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,123 @@ # Stackspin Dashboard -This repo hosts the Stackspin Dashboard frontend code. -The backend code is located at -<https://open.greenhost.net/stackspin/dashboard-backend>. +This repo hosts the Stackspin Dashboard, both frontend and backend code. + +## Project structure + +### Frontend + +The frontend code lives in the `frontend` directory. + +### Backend + +The backend code lives in the `backend` directory. Apart from the dashboard +backend itself, it also contains a flask application that functions as the +identity provider, login, consent and logout endpoints for the OpenID Connect +(OIDC) process. + +The application relies on the following components: + + - **Hydra**: Hydra is an open source OIDC server. + It means applications can connect to Hydra to start a session with a user. + Hydra provides the application with the username + and other roles/claims for the application. + Hydra is developed by Ory and has security as one of their top priorities. + + - **Kratos**: This is Identity Manager + and contains all the user profiles and secrets (passwords). + Kratos is designed to work mostly between UI (browser) and kratos directly, + over a public API endpoint. + Authentication, form-validation, etc. are all handled by Kratos. + Kratos only provides an API and not UI itself. + Kratos provides an admin API as well, + which is only used from the server-side flask app to create/delete users. + + - **MariaDB**: The login application, as well as Hydra and Kratos, need to store data. + This is done in a MariaDB database server. + There is one instance with three databases. + As all databases are very small we do not foresee resource limitation problems. + +If Hydra hits a new session/user, it has to know if this user has access. +To do so, the user has to login through a login application. +This application is developed by the Stackspin team (Greenhost) +and is part of this repository. +It is a Python Flask application +The application follows flows defined in Kratos, +and as such a lot of the interaction is done in the web-browser, +rather then server-side. +As a result, +the login application has a UI component which relies heavily on JavaScript. +As this is a relatively small application, +it is based on traditional Bootstrap + JQuery. ## Development environment -### Setup +After this process is finished, the following will run in local docker containers: -Create a `.env` file in the project root directory: +- the dashboard frontend +- the dashboard backend - cp .env.example .env +The following will be available through proxies running in local docker containers and port-forwards: -and adjust the `REACT_APP_HYDRA_PUBLIC_URL` to the SSO URL of your cluster. +- Hydra admin API +- Kratos admin API and public API +- The MariaDB database -#### `yarn start` +These need to be available locally, because Kratos wants to run on the same +domain as the front-end that serves the login interface. + +### Setup -Runs the app in the development mode. -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. +Please read through all subsections to set up your environment before +attempting to run the dashboard locally. -The page will reload if you make edits. -You will also see any lint errors in the console. +#### 1. Stackspin cluster -#### `yarn test` +To develop the Dashboard, you need a Stackspin cluster that is set up as a +development environment. Follow the instructions [in the +dashboard-dev-overrides +repository](https://open.greenhost.net/stackspin/dashboard-dev-overrides#dashboard-dev-overrides) +in order to set up a development-capable cluster. The Dashboard, as well as +Kratos and Hydra, will be configured to point their endpoints to +`http://stackspin_proxy:8081` in that cluster. As a result, you can run +components using the `docker-compose.yml` file in this repository, and still log +into Stackspin applications that run on the cluster. -Launches the test runner in the interactive watch mode. -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) -for more information. +#### 2. Environment for frontend -#### `yarn build` +The frontend needs to know where the backend API and hydra can be reached. To +configure it, create a `local.env` file in the `frontend` directory: + + cp local.env.example local.env + +and adjust the `REACT_APP_HYDRA_PUBLIC_URL` to the SSO URL of your cluster. -Builds the app for production to the `build` folder. -It correctly bundles React in production mode and optimizes the build -for the best performance. +#### 3. Setup hosts file -The build is minified and the filenames include the hashes. -Your app is ready to be deployed! +The application will run on `http://stackspin_proxy`. Add the following line to +`/etc/hosts` to be able to access that from your browser: -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) -for more information. +``` +127.0.0.1 stackspin_proxy +``` -#### `yarn eject` +#### 4. Kubernetes access -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** +The script needs you to have access to the Kubernetes cluster that runs +Stackspin. Point the `KUBECONFIG` environment variable to a kubectl config. Attention points: -If you aren’t satisfied with the build tool and configuration choices, -you can `eject` at any time. This command will remove the single build dependency -from your project. +* The kubeconfig will be mounted inside docker containers, so also make sure + your Docker user can read it. +* The bind-mount done by docker might not work if the file pointed to is + part of a filesystem such as sshfs. In that case, copy the file to a local + drive first. -Instead, it will copy all the configuration files and the transitive dependencies -(webpack, Babel, ESLint, etc) right into your project so you have full control -over them. -All of the commands except `eject` will still work, but they will point to the -copied scripts so you can tweak them. At this point you’re on your own. +### Build and run -You don’t have to ever use `eject`. The curated feature set is suitable for -small and middle deployments, and you shouldn’t feel obligated -to use this feature. -However we understand that this tool wouldn’t be useful -if you couldn’t customize it when you are ready for it. +After you've finished all setup steps, you can run everything using -## Learn More + ./run_app.sh -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). +This sets a few environment variables based on what is in your cluster +secrets, and run `docker compose up` to build and run all necessary components, +including a reverse proxy and the backend flask application. diff --git a/backend/README.md b/backend/README.md deleted file mode 100644 index 6c1a6fe898c476a4791c88a0de5d3c7c00f49492..0000000000000000000000000000000000000000 --- a/backend/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# Stackspin dashboard backend - -Backend for the [Stackspin dashboard](https://open.greenhost.net/stackspin/dashboard) - -## Login application - -Apart from the dashboard backend this repository contains a flask application -that functions as the identity provider, login, consent and logout endpoints -for the OpenID Connect (OIDC) process. -The application relies on the following components: - - - **Hydra**: Hydra is an open source OIDC server. - It means applications can connect to Hydra to start a session with a user. - Hydra provides the application with the username - and other roles/claims for the application. - Hydra is developed by Ory and has security as one of their top priorities. - - - **Kratos**: This is Identity Manager - and contains all the user profiles and secrets (passwords). - Kratos is designed to work mostly between UI (browser) and kratos directly, - over a public API endpoint. - Authentication, form-validation, etc. are all handled by Kratos. - Kratos only provides an API and not UI itself. - Kratos provides an admin API as well, - which is only used from the server-side flask app to create/delete users. - - - **MariaDB**: The login application, as well as Hydra and Kratos, need to store data. - This is done in a MariaDB database server. - There is one instance with three databases. - As all databases are very small we do not foresee resource limitation problems. - -If Hydra hits a new session/user, it has to know if this user has access. -To do so, the user has to login through a login application. -This application is developed by the Stackspin team (Greenhost) -and is part of this repository. -It is a Python Flask application -The application follows flows defined in Kratos, -and as such a lot of the interaction is done in the web-browser, -rather then server-side. -As a result, -the login application has a UI component which relies heavily on JavaScript. -As this is a relatively small application, -it is based on traditional Bootstrap + JQuery. - -# Development - -To develop the Dashboard, -you need a Stackspin cluster that is set up as a development environment. -Follow the instructions [in the dashboard-dev-overrides -repository](https://open.greenhost.net/stackspin/dashboard-dev-overrides#dashboard-dev-overrides) -in order to set up a development-capable cluster. -The end-points for the Dashboard, -as well as Kratos and Hydra, will point to `http://stackspin_proxy:8081` in that cluster. -As a result, you can run components using the `docker-compose` file in -this repository, and still log into Stackspin applications that run on the cluster. - - -## Setting up the local development environment - -After this process is finished, the following will run locally: - -- The [dashboard](https://open.greenhost.net/stackspin/dashboard) -- The - [dashboard-backend](https://open.greenhost.net/stackspin/dashboard-backend) - -The following will be available locally through a proxy and port-forwards: - -- Hydra admin -- Kratos admin and public -- The MariaDB database connections - -These need to be available locally, because Kratos wants to run on the same -domain as the front-end that serves the login interface. - - -### 1. Setup hosts file - -The application will run on `http://stackspin_proxy`. Add the following line to -`/etc/hosts` to be able to access that from your browser: - -``` -127.0.0.1 stackspin_proxy -``` - -### 2. Kubernetes access - -The script needs you to have access to the Kubernetes cluster that runs -Stackspin. Point the `KUBECONFIG` environment variable to a kubectl config. That -kubeconfig will be mounted inside docker containers, so also make sure your -Docker user can read it. - -### 3. Run it all - -Now, run this script that sets a few environment variables based on what is in -your cluster secrets, and starts `docker-compose` to start a reverse proxy as -well as the flask application in this repository. - -``` -./run_app.sh -``` - -### 4. Front-end developmenet - -Start the [dashboard front-end app](https://open.greenhost.net/stackspin/dashboard/#yarn-start). diff --git a/backend/docker-compose.yml b/docker-compose.yml similarity index 81% rename from backend/docker-compose.yml rename to docker-compose.yml index 462ebea4b849ec2088700e1ea92be1a662394e7c..ee050b186438ed3591b0cb121e67e762ea849cb4 100644 --- a/backend/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,25 @@ -version: '3' +version: "3" services: + frontend: + build: + context: ./frontend + working_dir: "/home/node/app" + env_file: ./frontend/local.env + ports: + - "3000:3000" + # command: "yarn start" stackspin_proxy: - image: nginx:1.23.2 + image: nginx:1.23.1 ports: - "8081:8081" volumes: - - ./proxy/default.conf:/etc/nginx/conf.d/default.conf + - ./backend/proxy/default.conf:/etc/nginx/conf.d/default.conf depends_on: - kube_port_kratos_public - flask_app flask_app: - build: . + build: + context: ./backend environment: - FLASK_APP=app.py - FLASK_ENV=development @@ -39,13 +48,13 @@ services: - "5000:5000" user: "${KUBECTL_UID}:${KUBECTL_GID}" volumes: - - .:/app + - ./backend:/app - "$KUBECONFIG:/.kube/config" depends_on: - kube_port_mysql entrypoint: ["bash", "-c", "flask run --host $$(hostname -i)"] kube_port_kratos_admin: - image: bitnami/kubectl:1.25.3 + image: bitnami/kubectl:1.25.2 user: "${KUBECTL_UID}:${KUBECTL_GID}" expose: - 8000 @@ -53,7 +62,7 @@ services: - "$KUBECONFIG:/.kube/config" entrypoint: ["bash", "-c", "kubectl -n stackspin port-forward --address $$(hostname -i) service/kratos-admin 8000:80"] kube_port_hydra_admin: - image: bitnami/kubectl:1.25.3 + image: bitnami/kubectl:1.25.2 user: "${KUBECTL_UID}:${KUBECTL_GID}" expose: - 4445 @@ -61,7 +70,7 @@ services: - "$KUBECONFIG:/.kube/config" entrypoint: ["bash", "-c", "kubectl -n stackspin port-forward --address $$(hostname -i) service/hydra-admin 4445:4445"] kube_port_kratos_public: - image: bitnami/kubectl:1.25.3 + image: bitnami/kubectl:1.25.2 user: "${KUBECTL_UID}:${KUBECTL_GID}" ports: - "8080:8080" @@ -69,9 +78,9 @@ services: - 8080 volumes: - "$KUBECONFIG:/.kube/config" - entrypoint: ["bash", "-c", "kubectl -n stackspin port-forward --address $$(hostname -i) service/kratos-public 8080:80"] + entrypoint: ["bash", "-c", "kubectl -n stackspin port-forward --address 0.0.0.0 service/kratos-public 8080:80"] kube_port_mysql: - image: bitnami/kubectl:1.25.3 + image: bitnami/kubectl:1.25.2 user: "${KUBECTL_UID}:${KUBECTL_GID}" expose: - 3306 diff --git a/.eslintignore b/frontend/.eslintignore similarity index 100% rename from .eslintignore rename to frontend/.eslintignore diff --git a/.eslintrc.js b/frontend/.eslintrc.js similarity index 100% rename from .eslintrc.js rename to frontend/.eslintrc.js diff --git a/.lintstagedrc b/frontend/.lintstagedrc similarity index 100% rename from .lintstagedrc rename to frontend/.lintstagedrc diff --git a/.prettierrc b/frontend/.prettierrc similarity index 100% rename from .prettierrc rename to frontend/.prettierrc diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..ee080ade68a7b99b3ffb7cdb19a715f1bb21970c --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,8 @@ +FROM node:18 + +ADD . . + +RUN yarn install + +ENV NODE_OPTIONS="--openssl-legacy-provider" +CMD yarn start diff --git a/craco.config.js b/frontend/craco.config.js similarity index 100% rename from craco.config.js rename to frontend/craco.config.js diff --git a/.env.example b/frontend/local.env.example similarity index 100% rename from .env.example rename to frontend/local.env.example diff --git a/package.json b/frontend/package.json similarity index 100% rename from package.json rename to frontend/package.json diff --git a/public/android-chrome-192x192.png b/frontend/public/android-chrome-192x192.png similarity index 100% rename from public/android-chrome-192x192.png rename to frontend/public/android-chrome-192x192.png diff --git a/public/android-chrome-256x256.png b/frontend/public/android-chrome-256x256.png similarity index 100% rename from public/android-chrome-256x256.png rename to frontend/public/android-chrome-256x256.png diff --git a/public/apple-touch-icon.png b/frontend/public/apple-touch-icon.png similarity index 100% rename from public/apple-touch-icon.png rename to frontend/public/apple-touch-icon.png diff --git a/public/assets/logo-small.svg b/frontend/public/assets/logo-small.svg similarity index 100% rename from public/assets/logo-small.svg rename to frontend/public/assets/logo-small.svg diff --git a/public/assets/logo.svg b/frontend/public/assets/logo.svg similarity index 100% rename from public/assets/logo.svg rename to frontend/public/assets/logo.svg diff --git a/public/assets/monitoring.svg b/frontend/public/assets/monitoring.svg similarity index 100% rename from public/assets/monitoring.svg rename to frontend/public/assets/monitoring.svg diff --git a/public/assets/nextcloud.svg b/frontend/public/assets/nextcloud.svg similarity index 100% rename from public/assets/nextcloud.svg rename to frontend/public/assets/nextcloud.svg diff --git a/public/assets/velero.svg b/frontend/public/assets/velero.svg similarity index 100% rename from public/assets/velero.svg rename to frontend/public/assets/velero.svg diff --git a/public/assets/wekan.svg b/frontend/public/assets/wekan.svg similarity index 100% rename from public/assets/wekan.svg rename to frontend/public/assets/wekan.svg diff --git a/public/assets/wordpress.svg b/frontend/public/assets/wordpress.svg similarity index 100% rename from public/assets/wordpress.svg rename to frontend/public/assets/wordpress.svg diff --git a/public/assets/zulip.svg b/frontend/public/assets/zulip.svg similarity index 100% rename from public/assets/zulip.svg rename to frontend/public/assets/zulip.svg diff --git a/public/favicon-16x16.png b/frontend/public/favicon-16x16.png similarity index 100% rename from public/favicon-16x16.png rename to frontend/public/favicon-16x16.png diff --git a/public/favicon-32x32.png b/frontend/public/favicon-32x32.png similarity index 100% rename from public/favicon-32x32.png rename to frontend/public/favicon-32x32.png diff --git a/public/favicon.ico b/frontend/public/favicon.ico similarity index 100% rename from public/favicon.ico rename to frontend/public/favicon.ico diff --git a/public/index.html b/frontend/public/index.html similarity index 100% rename from public/index.html rename to frontend/public/index.html diff --git a/public/logo192.png b/frontend/public/logo192.png similarity index 100% rename from public/logo192.png rename to frontend/public/logo192.png diff --git a/public/logo512.png b/frontend/public/logo512.png similarity index 100% rename from public/logo512.png rename to frontend/public/logo512.png diff --git a/public/manifest.json b/frontend/public/manifest.json similarity index 100% rename from public/manifest.json rename to frontend/public/manifest.json diff --git a/public/markdown/monitoring.md b/frontend/public/markdown/monitoring.md similarity index 100% rename from public/markdown/monitoring.md rename to frontend/public/markdown/monitoring.md diff --git a/public/markdown/nextcloud.md b/frontend/public/markdown/nextcloud.md similarity index 100% rename from public/markdown/nextcloud.md rename to frontend/public/markdown/nextcloud.md diff --git a/public/markdown/support.md b/frontend/public/markdown/support.md similarity index 100% rename from public/markdown/support.md rename to frontend/public/markdown/support.md diff --git a/public/markdown/wekan.md b/frontend/public/markdown/wekan.md similarity index 100% rename from public/markdown/wekan.md rename to frontend/public/markdown/wekan.md diff --git a/public/markdown/wordpress.md b/frontend/public/markdown/wordpress.md similarity index 100% rename from public/markdown/wordpress.md rename to frontend/public/markdown/wordpress.md diff --git a/public/markdown/zulip.md b/frontend/public/markdown/zulip.md similarity index 100% rename from public/markdown/zulip.md rename to frontend/public/markdown/zulip.md diff --git a/public/mstile-150x150.png b/frontend/public/mstile-150x150.png similarity index 100% rename from public/mstile-150x150.png rename to frontend/public/mstile-150x150.png diff --git a/public/robots.txt b/frontend/public/robots.txt similarity index 100% rename from public/robots.txt rename to frontend/public/robots.txt diff --git a/react-table-config.d.ts b/frontend/react-table-config.d.ts similarity index 100% rename from react-table-config.d.ts rename to frontend/react-table-config.d.ts diff --git a/src/App.tsx b/frontend/src/App.tsx similarity index 100% rename from src/App.tsx rename to frontend/src/App.tsx diff --git a/src/common/const.ts b/frontend/src/common/const.ts similarity index 100% rename from src/common/const.ts rename to frontend/src/common/const.ts diff --git a/src/common/types.ts b/frontend/src/common/types.ts similarity index 100% rename from src/common/types.ts rename to frontend/src/common/types.ts diff --git a/src/common/util/show-toast.tsx b/frontend/src/common/util/show-toast.tsx similarity index 100% rename from src/common/util/show-toast.tsx rename to frontend/src/common/util/show-toast.tsx diff --git a/src/components/Banner/Banner.tsx b/frontend/src/components/Banner/Banner.tsx similarity index 100% rename from src/components/Banner/Banner.tsx rename to frontend/src/components/Banner/Banner.tsx diff --git a/src/components/Banner/index.ts b/frontend/src/components/Banner/index.ts similarity index 100% rename from src/components/Banner/index.ts rename to frontend/src/components/Banner/index.ts diff --git a/src/components/Form/Checkbox/Checkbox.tsx b/frontend/src/components/Form/Checkbox/Checkbox.tsx similarity index 100% rename from src/components/Form/Checkbox/Checkbox.tsx rename to frontend/src/components/Form/Checkbox/Checkbox.tsx diff --git a/src/components/Form/Checkbox/index.ts b/frontend/src/components/Form/Checkbox/index.ts similarity index 100% rename from src/components/Form/Checkbox/index.ts rename to frontend/src/components/Form/Checkbox/index.ts diff --git a/src/components/Form/CodeEditor/CodeEditor.tsx b/frontend/src/components/Form/CodeEditor/CodeEditor.tsx similarity index 100% rename from src/components/Form/CodeEditor/CodeEditor.tsx rename to frontend/src/components/Form/CodeEditor/CodeEditor.tsx diff --git a/src/components/Form/CodeEditor/index.ts b/frontend/src/components/Form/CodeEditor/index.ts similarity index 100% rename from src/components/Form/CodeEditor/index.ts rename to frontend/src/components/Form/CodeEditor/index.ts diff --git a/src/components/Form/Input/Input.tsx b/frontend/src/components/Form/Input/Input.tsx similarity index 100% rename from src/components/Form/Input/Input.tsx rename to frontend/src/components/Form/Input/Input.tsx diff --git a/src/components/Form/Input/index.ts b/frontend/src/components/Form/Input/index.ts similarity index 100% rename from src/components/Form/Input/index.ts rename to frontend/src/components/Form/Input/index.ts diff --git a/src/components/Form/Select/Select.tsx b/frontend/src/components/Form/Select/Select.tsx similarity index 100% rename from src/components/Form/Select/Select.tsx rename to frontend/src/components/Form/Select/Select.tsx diff --git a/src/components/Form/Select/index.ts b/frontend/src/components/Form/Select/index.ts similarity index 100% rename from src/components/Form/Select/index.ts rename to frontend/src/components/Form/Select/index.ts diff --git a/src/components/Form/Switch/Switch.tsx b/frontend/src/components/Form/Switch/Switch.tsx similarity index 100% rename from src/components/Form/Switch/Switch.tsx rename to frontend/src/components/Form/Switch/Switch.tsx diff --git a/src/components/Form/Switch/index.ts b/frontend/src/components/Form/Switch/index.ts similarity index 100% rename from src/components/Form/Switch/index.ts rename to frontend/src/components/Form/Switch/index.ts diff --git a/src/components/Form/TextArea/index.ts b/frontend/src/components/Form/TextArea/index.ts similarity index 100% rename from src/components/Form/TextArea/index.ts rename to frontend/src/components/Form/TextArea/index.ts diff --git a/src/components/Form/TextArea/textarea.tsx b/frontend/src/components/Form/TextArea/textarea.tsx similarity index 100% rename from src/components/Form/TextArea/textarea.tsx rename to frontend/src/components/Form/TextArea/textarea.tsx diff --git a/src/components/Form/index.ts b/frontend/src/components/Form/index.ts similarity index 100% rename from src/components/Form/index.ts rename to frontend/src/components/Form/index.ts diff --git a/src/components/Header/Header.tsx b/frontend/src/components/Header/Header.tsx similarity index 100% rename from src/components/Header/Header.tsx rename to frontend/src/components/Header/Header.tsx diff --git a/src/components/Header/index.ts b/frontend/src/components/Header/index.ts similarity index 100% rename from src/components/Header/index.ts rename to frontend/src/components/Header/index.ts diff --git a/src/components/Layout/Layout.tsx b/frontend/src/components/Layout/Layout.tsx similarity index 100% rename from src/components/Layout/Layout.tsx rename to frontend/src/components/Layout/Layout.tsx diff --git a/src/components/Layout/index.ts b/frontend/src/components/Layout/index.ts similarity index 100% rename from src/components/Layout/index.ts rename to frontend/src/components/Layout/index.ts diff --git a/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx b/frontend/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx similarity index 100% rename from src/components/Modal/ConfirmationModal/ConfirmationModal.tsx rename to frontend/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx diff --git a/src/components/Modal/ConfirmationModal/index.ts b/frontend/src/components/Modal/ConfirmationModal/index.ts similarity index 100% rename from src/components/Modal/ConfirmationModal/index.ts rename to frontend/src/components/Modal/ConfirmationModal/index.ts diff --git a/src/components/Modal/Modal/Modal.tsx b/frontend/src/components/Modal/Modal/Modal.tsx similarity index 100% rename from src/components/Modal/Modal/Modal.tsx rename to frontend/src/components/Modal/Modal/Modal.tsx diff --git a/src/components/Modal/Modal/index.ts b/frontend/src/components/Modal/Modal/index.ts similarity index 100% rename from src/components/Modal/Modal/index.ts rename to frontend/src/components/Modal/Modal/index.ts diff --git a/src/components/Modal/Modal/types.ts b/frontend/src/components/Modal/Modal/types.ts similarity index 100% rename from src/components/Modal/Modal/types.ts rename to frontend/src/components/Modal/Modal/types.ts diff --git a/src/components/Modal/StepsModal/StepsModal.tsx b/frontend/src/components/Modal/StepsModal/StepsModal.tsx similarity index 100% rename from src/components/Modal/StepsModal/StepsModal.tsx rename to frontend/src/components/Modal/StepsModal/StepsModal.tsx diff --git a/src/components/Modal/StepsModal/index.ts b/frontend/src/components/Modal/StepsModal/index.ts similarity index 100% rename from src/components/Modal/StepsModal/index.ts rename to frontend/src/components/Modal/StepsModal/index.ts diff --git a/src/components/Modal/StepsModal/types.ts b/frontend/src/components/Modal/StepsModal/types.ts similarity index 100% rename from src/components/Modal/StepsModal/types.ts rename to frontend/src/components/Modal/StepsModal/types.ts diff --git a/src/components/Modal/index.ts b/frontend/src/components/Modal/index.ts similarity index 100% rename from src/components/Modal/index.ts rename to frontend/src/components/Modal/index.ts diff --git a/src/components/ProgressSteps/ProgressSteps.tsx b/frontend/src/components/ProgressSteps/ProgressSteps.tsx similarity index 100% rename from src/components/ProgressSteps/ProgressSteps.tsx rename to frontend/src/components/ProgressSteps/ProgressSteps.tsx diff --git a/src/components/ProgressSteps/index.ts b/frontend/src/components/ProgressSteps/index.ts similarity index 100% rename from src/components/ProgressSteps/index.ts rename to frontend/src/components/ProgressSteps/index.ts diff --git a/src/components/ProgressSteps/types.ts b/frontend/src/components/ProgressSteps/types.ts similarity index 100% rename from src/components/ProgressSteps/types.ts rename to frontend/src/components/ProgressSteps/types.ts diff --git a/src/components/Table/Table.tsx b/frontend/src/components/Table/Table.tsx similarity index 100% rename from src/components/Table/Table.tsx rename to frontend/src/components/Table/Table.tsx diff --git a/src/components/Table/index.ts b/frontend/src/components/Table/index.ts similarity index 100% rename from src/components/Table/index.ts rename to frontend/src/components/Table/index.ts diff --git a/src/components/Tabs/TabPanel.tsx b/frontend/src/components/Tabs/TabPanel.tsx similarity index 100% rename from src/components/Tabs/TabPanel.tsx rename to frontend/src/components/Tabs/TabPanel.tsx diff --git a/src/components/Tabs/Tabs.tsx b/frontend/src/components/Tabs/Tabs.tsx similarity index 100% rename from src/components/Tabs/Tabs.tsx rename to frontend/src/components/Tabs/Tabs.tsx diff --git a/src/components/Tabs/index.ts b/frontend/src/components/Tabs/index.ts similarity index 100% rename from src/components/Tabs/index.ts rename to frontend/src/components/Tabs/index.ts diff --git a/src/components/Tabs/types.ts b/frontend/src/components/Tabs/types.ts similarity index 100% rename from src/components/Tabs/types.ts rename to frontend/src/components/Tabs/types.ts diff --git a/src/components/UserModal/UserModal.tsx b/frontend/src/components/UserModal/UserModal.tsx similarity index 100% rename from src/components/UserModal/UserModal.tsx rename to frontend/src/components/UserModal/UserModal.tsx diff --git a/src/components/UserModal/consts.ts b/frontend/src/components/UserModal/consts.ts similarity index 100% rename from src/components/UserModal/consts.ts rename to frontend/src/components/UserModal/consts.ts diff --git a/src/components/UserModal/index.ts b/frontend/src/components/UserModal/index.ts similarity index 100% rename from src/components/UserModal/index.ts rename to frontend/src/components/UserModal/index.ts diff --git a/src/components/UserModal/types.ts b/frontend/src/components/UserModal/types.ts similarity index 100% rename from src/components/UserModal/types.ts rename to frontend/src/components/UserModal/types.ts diff --git a/src/components/index.ts b/frontend/src/components/index.ts similarity index 100% rename from src/components/index.ts rename to frontend/src/components/index.ts diff --git a/src/index.css b/frontend/src/index.css similarity index 100% rename from src/index.css rename to frontend/src/index.css diff --git a/src/index.tsx b/frontend/src/index.tsx similarity index 100% rename from src/index.tsx rename to frontend/src/index.tsx diff --git a/src/modules/apps/AppSingle.tsx b/frontend/src/modules/apps/AppSingle.tsx similarity index 100% rename from src/modules/apps/AppSingle.tsx rename to frontend/src/modules/apps/AppSingle.tsx diff --git a/src/modules/apps/Apps.tsx b/frontend/src/modules/apps/Apps.tsx similarity index 100% rename from src/modules/apps/Apps.tsx rename to frontend/src/modules/apps/Apps.tsx diff --git a/src/modules/apps/components/AdvancedTab/AdvancedTab.tsx b/frontend/src/modules/apps/components/AdvancedTab/AdvancedTab.tsx similarity index 100% rename from src/modules/apps/components/AdvancedTab/AdvancedTab.tsx rename to frontend/src/modules/apps/components/AdvancedTab/AdvancedTab.tsx diff --git a/src/modules/apps/components/AdvancedTab/components/ChangeSecretModal.tsx b/frontend/src/modules/apps/components/AdvancedTab/components/ChangeSecretModal.tsx similarity index 100% rename from src/modules/apps/components/AdvancedTab/components/ChangeSecretModal.tsx rename to frontend/src/modules/apps/components/AdvancedTab/components/ChangeSecretModal.tsx diff --git a/src/modules/apps/components/AdvancedTab/components/Secrets.tsx b/frontend/src/modules/apps/components/AdvancedTab/components/Secrets.tsx similarity index 100% rename from src/modules/apps/components/AdvancedTab/components/Secrets.tsx rename to frontend/src/modules/apps/components/AdvancedTab/components/Secrets.tsx diff --git a/src/modules/apps/components/AdvancedTab/components/index.ts b/frontend/src/modules/apps/components/AdvancedTab/components/index.ts similarity index 100% rename from src/modules/apps/components/AdvancedTab/components/index.ts rename to frontend/src/modules/apps/components/AdvancedTab/components/index.ts diff --git a/src/modules/apps/components/AdvancedTab/index.ts b/frontend/src/modules/apps/components/AdvancedTab/index.ts similarity index 100% rename from src/modules/apps/components/AdvancedTab/index.ts rename to frontend/src/modules/apps/components/AdvancedTab/index.ts diff --git a/src/modules/apps/components/AppInstallModal/AppInstallModal.tsx b/frontend/src/modules/apps/components/AppInstallModal/AppInstallModal.tsx similarity index 100% rename from src/modules/apps/components/AppInstallModal/AppInstallModal.tsx rename to frontend/src/modules/apps/components/AppInstallModal/AppInstallModal.tsx diff --git a/src/modules/apps/components/AppInstallModal/consts.ts b/frontend/src/modules/apps/components/AppInstallModal/consts.ts similarity index 100% rename from src/modules/apps/components/AppInstallModal/consts.ts rename to frontend/src/modules/apps/components/AppInstallModal/consts.ts diff --git a/src/modules/apps/components/AppInstallModal/index.ts b/frontend/src/modules/apps/components/AppInstallModal/index.ts similarity index 100% rename from src/modules/apps/components/AppInstallModal/index.ts rename to frontend/src/modules/apps/components/AppInstallModal/index.ts diff --git a/src/modules/apps/components/AppInstallModal/types.ts b/frontend/src/modules/apps/components/AppInstallModal/types.ts similarity index 100% rename from src/modules/apps/components/AppInstallModal/types.ts rename to frontend/src/modules/apps/components/AppInstallModal/types.ts diff --git a/src/modules/apps/components/GeneralTab/GeneralTab.tsx b/frontend/src/modules/apps/components/GeneralTab/GeneralTab.tsx similarity index 100% rename from src/modules/apps/components/GeneralTab/GeneralTab.tsx rename to frontend/src/modules/apps/components/GeneralTab/GeneralTab.tsx diff --git a/src/modules/apps/components/GeneralTab/index.ts b/frontend/src/modules/apps/components/GeneralTab/index.ts similarity index 100% rename from src/modules/apps/components/GeneralTab/index.ts rename to frontend/src/modules/apps/components/GeneralTab/index.ts diff --git a/src/modules/apps/components/index.ts b/frontend/src/modules/apps/components/index.ts similarity index 100% rename from src/modules/apps/components/index.ts rename to frontend/src/modules/apps/components/index.ts diff --git a/src/modules/apps/consts.tsx b/frontend/src/modules/apps/consts.tsx similarity index 100% rename from src/modules/apps/consts.tsx rename to frontend/src/modules/apps/consts.tsx diff --git a/src/modules/apps/index.ts b/frontend/src/modules/apps/index.ts similarity index 100% rename from src/modules/apps/index.ts rename to frontend/src/modules/apps/index.ts diff --git a/src/modules/dashboard/Dashboard.tsx b/frontend/src/modules/dashboard/Dashboard.tsx similarity index 100% rename from src/modules/dashboard/Dashboard.tsx rename to frontend/src/modules/dashboard/Dashboard.tsx diff --git a/src/modules/dashboard/components/DashboardCard/DashboardCard.tsx b/frontend/src/modules/dashboard/components/DashboardCard/DashboardCard.tsx similarity index 100% rename from src/modules/dashboard/components/DashboardCard/DashboardCard.tsx rename to frontend/src/modules/dashboard/components/DashboardCard/DashboardCard.tsx diff --git a/src/modules/dashboard/components/DashboardCard/index.ts b/frontend/src/modules/dashboard/components/DashboardCard/index.ts similarity index 100% rename from src/modules/dashboard/components/DashboardCard/index.ts rename to frontend/src/modules/dashboard/components/DashboardCard/index.ts diff --git a/src/modules/dashboard/components/DashboardUtility/DashboardUtility.tsx b/frontend/src/modules/dashboard/components/DashboardUtility/DashboardUtility.tsx similarity index 100% rename from src/modules/dashboard/components/DashboardUtility/DashboardUtility.tsx rename to frontend/src/modules/dashboard/components/DashboardUtility/DashboardUtility.tsx diff --git a/src/modules/dashboard/components/DashboardUtility/index.ts b/frontend/src/modules/dashboard/components/DashboardUtility/index.ts similarity index 100% rename from src/modules/dashboard/components/DashboardUtility/index.ts rename to frontend/src/modules/dashboard/components/DashboardUtility/index.ts diff --git a/src/modules/dashboard/components/index.ts b/frontend/src/modules/dashboard/components/index.ts similarity index 100% rename from src/modules/dashboard/components/index.ts rename to frontend/src/modules/dashboard/components/index.ts diff --git a/src/modules/dashboard/consts.ts b/frontend/src/modules/dashboard/consts.ts similarity index 100% rename from src/modules/dashboard/consts.ts rename to frontend/src/modules/dashboard/consts.ts diff --git a/src/modules/dashboard/index.ts b/frontend/src/modules/dashboard/index.ts similarity index 100% rename from src/modules/dashboard/index.ts rename to frontend/src/modules/dashboard/index.ts diff --git a/src/modules/index.ts b/frontend/src/modules/index.ts similarity index 100% rename from src/modules/index.ts rename to frontend/src/modules/index.ts diff --git a/src/modules/login/Login.tsx b/frontend/src/modules/login/Login.tsx similarity index 100% rename from src/modules/login/Login.tsx rename to frontend/src/modules/login/Login.tsx diff --git a/src/modules/login/LoginCallback.tsx b/frontend/src/modules/login/LoginCallback.tsx similarity index 100% rename from src/modules/login/LoginCallback.tsx rename to frontend/src/modules/login/LoginCallback.tsx diff --git a/src/modules/login/index.ts b/frontend/src/modules/login/index.ts similarity index 100% rename from src/modules/login/index.ts rename to frontend/src/modules/login/index.ts diff --git a/src/modules/users/Users.tsx b/frontend/src/modules/users/Users.tsx similarity index 100% rename from src/modules/users/Users.tsx rename to frontend/src/modules/users/Users.tsx diff --git a/src/modules/users/components/MultipleUsersModal/MultipleUsersModal.tsx b/frontend/src/modules/users/components/MultipleUsersModal/MultipleUsersModal.tsx similarity index 100% rename from src/modules/users/components/MultipleUsersModal/MultipleUsersModal.tsx rename to frontend/src/modules/users/components/MultipleUsersModal/MultipleUsersModal.tsx diff --git a/src/modules/users/components/MultipleUsersModal/index.ts b/frontend/src/modules/users/components/MultipleUsersModal/index.ts similarity index 100% rename from src/modules/users/components/MultipleUsersModal/index.ts rename to frontend/src/modules/users/components/MultipleUsersModal/index.ts diff --git a/src/modules/users/components/MultipleUsersModal/types.ts b/frontend/src/modules/users/components/MultipleUsersModal/types.ts similarity index 100% rename from src/modules/users/components/MultipleUsersModal/types.ts rename to frontend/src/modules/users/components/MultipleUsersModal/types.ts diff --git a/src/modules/users/components/index.ts b/frontend/src/modules/users/components/index.ts similarity index 100% rename from src/modules/users/components/index.ts rename to frontend/src/modules/users/components/index.ts diff --git a/src/modules/users/index.ts b/frontend/src/modules/users/index.ts similarity index 100% rename from src/modules/users/index.ts rename to frontend/src/modules/users/index.ts diff --git a/src/react-app-env.d.ts b/frontend/src/react-app-env.d.ts similarity index 100% rename from src/react-app-env.d.ts rename to frontend/src/react-app-env.d.ts diff --git a/src/redux/index.ts b/frontend/src/redux/index.ts similarity index 100% rename from src/redux/index.ts rename to frontend/src/redux/index.ts diff --git a/src/redux/store.ts b/frontend/src/redux/store.ts similarity index 100% rename from src/redux/store.ts rename to frontend/src/redux/store.ts diff --git a/src/redux/types.ts b/frontend/src/redux/types.ts similarity index 100% rename from src/redux/types.ts rename to frontend/src/redux/types.ts diff --git a/src/services/api/apiCall.ts b/frontend/src/services/api/apiCall.ts similarity index 100% rename from src/services/api/apiCall.ts rename to frontend/src/services/api/apiCall.ts diff --git a/src/services/api/config.ts b/frontend/src/services/api/config.ts similarity index 100% rename from src/services/api/config.ts rename to frontend/src/services/api/config.ts diff --git a/src/services/api/index.ts b/frontend/src/services/api/index.ts similarity index 100% rename from src/services/api/index.ts rename to frontend/src/services/api/index.ts diff --git a/src/services/api/redux/actions.ts b/frontend/src/services/api/redux/actions.ts similarity index 100% rename from src/services/api/redux/actions.ts rename to frontend/src/services/api/redux/actions.ts diff --git a/src/services/api/redux/index.ts b/frontend/src/services/api/redux/index.ts similarity index 100% rename from src/services/api/redux/index.ts rename to frontend/src/services/api/redux/index.ts diff --git a/src/services/api/redux/reducers.ts b/frontend/src/services/api/redux/reducers.ts similarity index 100% rename from src/services/api/redux/reducers.ts rename to frontend/src/services/api/redux/reducers.ts diff --git a/src/services/api/redux/traits.ts b/frontend/src/services/api/redux/traits.ts similarity index 100% rename from src/services/api/redux/traits.ts rename to frontend/src/services/api/redux/traits.ts diff --git a/src/services/api/redux/types.ts b/frontend/src/services/api/redux/types.ts similarity index 100% rename from src/services/api/redux/types.ts rename to frontend/src/services/api/redux/types.ts diff --git a/src/services/api/types.ts b/frontend/src/services/api/types.ts similarity index 100% rename from src/services/api/types.ts rename to frontend/src/services/api/types.ts diff --git a/src/services/apps/hooks/index.ts b/frontend/src/services/apps/hooks/index.ts similarity index 100% rename from src/services/apps/hooks/index.ts rename to frontend/src/services/apps/hooks/index.ts diff --git a/src/services/apps/hooks/use-apps.ts b/frontend/src/services/apps/hooks/use-apps.ts similarity index 100% rename from src/services/apps/hooks/use-apps.ts rename to frontend/src/services/apps/hooks/use-apps.ts diff --git a/src/services/apps/index.ts b/frontend/src/services/apps/index.ts similarity index 100% rename from src/services/apps/index.ts rename to frontend/src/services/apps/index.ts diff --git a/src/services/apps/redux/actions.ts b/frontend/src/services/apps/redux/actions.ts similarity index 100% rename from src/services/apps/redux/actions.ts rename to frontend/src/services/apps/redux/actions.ts diff --git a/src/services/apps/redux/index.ts b/frontend/src/services/apps/redux/index.ts similarity index 100% rename from src/services/apps/redux/index.ts rename to frontend/src/services/apps/redux/index.ts diff --git a/src/services/apps/redux/reducers.ts b/frontend/src/services/apps/redux/reducers.ts similarity index 100% rename from src/services/apps/redux/reducers.ts rename to frontend/src/services/apps/redux/reducers.ts diff --git a/src/services/apps/redux/selectors.ts b/frontend/src/services/apps/redux/selectors.ts similarity index 100% rename from src/services/apps/redux/selectors.ts rename to frontend/src/services/apps/redux/selectors.ts diff --git a/src/services/apps/redux/types.ts b/frontend/src/services/apps/redux/types.ts similarity index 100% rename from src/services/apps/redux/types.ts rename to frontend/src/services/apps/redux/types.ts diff --git a/src/services/apps/transformations.ts b/frontend/src/services/apps/transformations.ts similarity index 100% rename from src/services/apps/transformations.ts rename to frontend/src/services/apps/transformations.ts diff --git a/src/services/apps/types.ts b/frontend/src/services/apps/types.ts similarity index 100% rename from src/services/apps/types.ts rename to frontend/src/services/apps/types.ts diff --git a/src/services/auth/api.ts b/frontend/src/services/auth/api.ts similarity index 100% rename from src/services/auth/api.ts rename to frontend/src/services/auth/api.ts diff --git a/src/services/auth/hooks/index.ts b/frontend/src/services/auth/hooks/index.ts similarity index 100% rename from src/services/auth/hooks/index.ts rename to frontend/src/services/auth/hooks/index.ts diff --git a/src/services/auth/hooks/use-auth.ts b/frontend/src/services/auth/hooks/use-auth.ts similarity index 100% rename from src/services/auth/hooks/use-auth.ts rename to frontend/src/services/auth/hooks/use-auth.ts diff --git a/src/services/auth/index.ts b/frontend/src/services/auth/index.ts similarity index 100% rename from src/services/auth/index.ts rename to frontend/src/services/auth/index.ts diff --git a/src/services/auth/redux/actions.ts b/frontend/src/services/auth/redux/actions.ts similarity index 100% rename from src/services/auth/redux/actions.ts rename to frontend/src/services/auth/redux/actions.ts diff --git a/src/services/auth/redux/index.ts b/frontend/src/services/auth/redux/index.ts similarity index 100% rename from src/services/auth/redux/index.ts rename to frontend/src/services/auth/redux/index.ts diff --git a/src/services/auth/redux/reducers.ts b/frontend/src/services/auth/redux/reducers.ts similarity index 100% rename from src/services/auth/redux/reducers.ts rename to frontend/src/services/auth/redux/reducers.ts diff --git a/src/services/auth/redux/selectors.ts b/frontend/src/services/auth/redux/selectors.ts similarity index 100% rename from src/services/auth/redux/selectors.ts rename to frontend/src/services/auth/redux/selectors.ts diff --git a/src/services/auth/redux/types.ts b/frontend/src/services/auth/redux/types.ts similarity index 100% rename from src/services/auth/redux/types.ts rename to frontend/src/services/auth/redux/types.ts diff --git a/src/services/auth/transformations.ts b/frontend/src/services/auth/transformations.ts similarity index 100% rename from src/services/auth/transformations.ts rename to frontend/src/services/auth/transformations.ts diff --git a/src/services/auth/types.ts b/frontend/src/services/auth/types.ts similarity index 100% rename from src/services/auth/types.ts rename to frontend/src/services/auth/types.ts diff --git a/src/services/users/api.ts b/frontend/src/services/users/api.ts similarity index 100% rename from src/services/users/api.ts rename to frontend/src/services/users/api.ts diff --git a/src/services/users/hooks/index.ts b/frontend/src/services/users/hooks/index.ts similarity index 100% rename from src/services/users/hooks/index.ts rename to frontend/src/services/users/hooks/index.ts diff --git a/src/services/users/hooks/use-users.ts b/frontend/src/services/users/hooks/use-users.ts similarity index 100% rename from src/services/users/hooks/use-users.ts rename to frontend/src/services/users/hooks/use-users.ts diff --git a/src/services/users/index.ts b/frontend/src/services/users/index.ts similarity index 100% rename from src/services/users/index.ts rename to frontend/src/services/users/index.ts diff --git a/src/services/users/redux/actions.ts b/frontend/src/services/users/redux/actions.ts similarity index 100% rename from src/services/users/redux/actions.ts rename to frontend/src/services/users/redux/actions.ts diff --git a/src/services/users/redux/index.ts b/frontend/src/services/users/redux/index.ts similarity index 100% rename from src/services/users/redux/index.ts rename to frontend/src/services/users/redux/index.ts diff --git a/src/services/users/redux/reducers.ts b/frontend/src/services/users/redux/reducers.ts similarity index 100% rename from src/services/users/redux/reducers.ts rename to frontend/src/services/users/redux/reducers.ts diff --git a/src/services/users/redux/selectors.ts b/frontend/src/services/users/redux/selectors.ts similarity index 100% rename from src/services/users/redux/selectors.ts rename to frontend/src/services/users/redux/selectors.ts diff --git a/src/services/users/redux/types.ts b/frontend/src/services/users/redux/types.ts similarity index 100% rename from src/services/users/redux/types.ts rename to frontend/src/services/users/redux/types.ts diff --git a/src/services/users/transformations.ts b/frontend/src/services/users/transformations.ts similarity index 100% rename from src/services/users/transformations.ts rename to frontend/src/services/users/transformations.ts diff --git a/src/services/users/types.ts b/frontend/src/services/users/types.ts similarity index 100% rename from src/services/users/types.ts rename to frontend/src/services/users/types.ts diff --git a/tailwind.config.js b/frontend/tailwind.config.js similarity index 100% rename from tailwind.config.js rename to frontend/tailwind.config.js diff --git a/tsconfig.json b/frontend/tsconfig.json similarity index 100% rename from tsconfig.json rename to frontend/tsconfig.json diff --git a/yarn.lock b/frontend/yarn.lock similarity index 100% rename from yarn.lock rename to frontend/yarn.lock diff --git a/backend/run_app.sh b/run_app.sh similarity index 100% rename from backend/run_app.sh rename to run_app.sh