---
# System prepended metadata

title: FrontLineLive

---

# FrontLineLive


## Introduction

Frontline.live is a web-based medical supplies matching platform. 

General public can submit medical supplies requests at the public site (frontline.live).

Admin can approve and manage all requests at the admin site. (frontline.live/admin).

## Technology

| Component | Tech stack | 
| -------- | -------- | 
| Public site     | React.js | 
| API server (for the public site) | Python | 
| Admin site | Plain HTML |
| API server (for the admin site) | ASP.NET Core | 
| Deployment | Docker |
| Infrastructure provisioning | Terraform |

The public site and the admin site uses different technology because we are in the midst of migrating the whole site to React.js + Python. 

The admin site will be revamped into the said tech stack at a later stage. 

## 3rd Party Services Used

| Component | Services | 
| -------- | -------- | 
| Map | Map Box (https://www.mapbox.com/) | 
| CMS | Contentful (https://www.contentful.com/) | 
| Last mile postcode look up | Posttag (https://www.posttag.com) |



## Initialise local development environment

### Prerequisit for all systems
- Docker ^20.10.8
- Docker Compose ^1.29.2

### For Mac/ Linux


#### Steps

```sh
# Prepare local development settings
$ make setup

# Start servers in Docker
$ make dev

# For those who want to start development on website without Docker
#
# You can start depending services in docker
$ make -f Makefile.nodocker.mk docker-start-db
# And then run the dotnet process in local for admin portal
$ NO_DOCKER=1 MODULE=Web make dev
#
# For public-web
$ NO_DOCKER=1 PORT=3002 MODULE=public-web make dev
# For core API server
$ NO_DOCKER=1 MODULE=core make dev
```
After running above commands, 
- visit http://localhost:3000 on browser and you should be able to see the admin portal website;
- visit http://localhost:3002 on browser and you should be able to see the public website.


### For Windows

#### Steps

This setup guide assumes you are using Powershell.
1. Open your Powershell and navigate to the project root directory
2. Run the following commands to copy local configuration files
```shell=Powershell
Copy-Item ".\docker-compose.override.yml.template" -Destination ".\docker-compose.override.yml"

Copy-Item ".\Web\appsettings.Development.json.template" -Destination ".\Web\appsettings.Development.json"

Copy-Item ".\src\public-web\appConfig.js.template" -Destination ".\.\src\public-web\public\appConfig.js"
```
3. Run the following command to start servers
```shell=Powershell
docker-compose -f ".\docker-compose.dev.yml" -f ".\docker-compose.override.yml" up
```

After running above commands, 
- visit http://localhost:3000 on browser and you should be able to see the admin portal website;
- visit http://localhost:3002 on browser and you should be able to see the public website.


#### Not yet supported
The Makefiles only support Mac/ Linux environment. We need support to make it Powershell-friendly

## Useful scripts and hints

### Add database migration script
```shell=bash
$ docker-compose -f ./docker-compose.dev.yml -f ./docker-compose.override.yml run --rm core alembic revision -m 'Your message'
```

### Migrate database schema to the latest version
```shell=bash
$ docker-compose -f ./docker-compose.dev.yml -f ./docker-compose.override.yml run --rm core alembic upgrade head
```

### Add environment variables
To add more environment variables, make sure you have already updated the following essential files

- docker-compose.dev.yml
- src/infra/variables.tf
- resource definition in any src/infra/*.tf
- src/infra/deploy_terraform.sh
- .github/workflows/build_and_deploy.yml

## Project Structure

This project is organised in the following structure:
```
|-- Database (Obsoleted SQL Server database project)
|-- Shared  (Shared code for admin portal)
|-- Web (Codebase for API server (for the admin site) and admin site)
|-- docs
`-- src
    |-- core (Codebase for API Server (for the public site))
    |-- infra (Terraform project for infrastructure provisioning and deployment)
    `-- public-web (Codebase for public site)
```

## Deployment

All deployment will be run by the GitHub Action. Changes pushed to `master` branch will be automatically deployed to dev sites.

To deploy changes to production environment, you need approval from one of the maintainers of the repository.

## GitHub Secrets

\* Should be environment specific.

### Deployment secrets

|Secret Name|Description|
|---|---|
|ARM_ACCESS_KEY|Azure Storage Account used for TF remote state. See [here](https://docs.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage).|
|ARM_CLIENT_ID*||
|ARM_CLIENT_SECRET*||
|ARM_SUBSCRIPTION_ID*||
|ARM_TENANT_ID*||
|ACR_USERNAME|Username for ACR's [Admin Account](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-authentication#admin-account).|
|ACR_PASSWORD|Password for ACR's [Admin Account](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-authentication#admin-account).|
|ACR_SERVER|The login server for ACR|

### Application secrets

|Secret Name|Description|
|---|---|
|APP_DATA_SUPPLIERS_SHEET*|-|
|APP_EMAIL_FROMADDRESS*|-|
|APP_EMAIL_SENDGRIDKEY*|-|
|APP_EMAIL_SENDGRIDUSER*|-|
|APP_EMAIL_TOADDRESS*|-|
|APP_MAPBOX_TOKEN*|Map Token|
|APP_RECAPTCHA_SECRETKEY*|-|
|APP_RECAPTCHA_SITEKEY*|-|
|APP_DATACONTEXT*|-|
|WEB_USERSECRETSID*|-|
|SQL_ADMIN_PASSWORD*|-|
|CONTENTFUL_DELIVERY_ACCESS_TOKEN*|Content Delivery API - access token|
|CONTENTFUL_SPACE_ID*|Contentful Space ID|
|CONTENTFUL_ENVIRONMENT*|Name of Contentful environment in use|
|POSTTAG_ENDPOINT*|-|
|POSTTAG_ID*|-|
|POSTTAG_API_KEY*|-|

### Domain names and CORS allowed origins setting
Check [build_and_deploy.yml](.github/workflows/build_and_deploy.yml). For list values, they should be JSON encoded.


## Diagrams
- [ER diagram](docs/ERD.svg)
