--- icon: sign-posts-wrench --- # Installing Uptime Manager ## Quickstart for users (quick method) 1. Download our [Docker compose file](https://github.com/bluewave-labs/bluewave-uptime/blob/develop/Docker/dist/docker-compose.yaml) 2. Run `docker compose up` to start the application 3. Now the application is running at `http://localhost` --- ## Quickstart for developers {% hint style="info" %} Make sure you change the directory to the specified directories, as paths in commands are relative. {% endhint %} ### Cloning and initial setup 1. Clone this repository. 2. Checkout the `develop` branch `git checkout develop` ### Setting up Docker images 3. Change directory to the `Docker/dev` directory 4. Build the docker images by running the `build_images.sh` script 5. Run `docker run -d -p 6379:6379 -v $(pwd)/redis/data:/data --name uptime_redis uptime_redis` 6. Run `docker run -d -p 27017:27017 -v $(pwd)/mongo/data:/data/db --name uptime_database_mongo uptime_database_mongo` ### Server setup 6. CD to `Server` directory, and run `npm install` 7. While in `Server` directory, create a `.env` file with the [required environmental variables](#env-vars-server) 8. While in the `Server` directory, run `npm run dev` ### Client setup 9. CD to `Client` directory `run npm install` 10. While in the `Client` directory, create a `.env` file with the [required environmental variables](#env-vars-client) 11. While in the `Client` directory run `npm run dev` ### Access the application 12. Client is now running at `localhost:5173` 13. Server is now running at `localhost:5000` --- ## Manual installation ### Client installation 1. Change directory to the `Client` directory 2. Install all dependencies by running `npm install` 3. Add a `.env` file to the `Client` directory with the following options: #### Environment variables | ENV Variable Name | Required/Optional | Type | Description | Accepted Values | | --------------------- | ----------------- | --------- | ------------------ | ---------------------------------- | | VITE_APP_API_BASE_URL | Required | `string` | Base URL of server | {host}/api/v1 | | VITE_APP_LOG_LEVEL | Optional | `string` | Log level | `"none"`\|`"error"` \| `"warn"` \| | | VITE_APP_DEMO | Optional | `boolean` | Demo server or not | `true`\|`false` \| | #### Starting the Client development server 1. Run `npm run dev` to start the development server. ### Server Installation 1. Change the directory to the `Server` directory 2. Install all dependencies by running `npm install` 3. Add a `.env` file to the `Server` directory with the following options: #### Environment variables Configure the server with the following environmental variables:
ENV Variable NameRequired/OptionalTypeDescriptionAccepted Values
CLIENT_HOSTRequiredstringFrontend Host
JWT_SECRETRequiredstringJWT secret
DB_TYPEOptionalstringSpecify DB to useMongoDB | FakeDB
DB_CONNECTION_STRINGRequiredstringSpecifies URL for MongoDB Database
PORTOptionalintegerSpecifies Port for Server
LOGIN_PAGE_URLRequiredstringLogin url to be used in emailing service
REDIS_HOSTRequiredstringHost address for Redis database
REDIS_PORTRequiredintegerPort for Redis database
TOKEN_TTLOptionalstringTime for token to liveIn vercel/ms format https://github.com/vercel/ms
PAGESPEED_API_KEYOptionalstringAPI Key for PageSpeed requests
SYSTEM_EMAIL_HOSTRequiredstringHost to send System Emails From
SYSTEM_EMAIL_PORTRequirednumberPort for System Email Host
SYSTEM_EMAIL_ADDRESSRequiredstringSystem Email Address
SYSTEM_EMAIL_PASSWORDRequiredstringSystem Email Password
--- #### Databases This project requires two databases: 1. **Main application database:** The project uses MongoDB for its primary database, with a MongoDB Docker image provided for easy setup. 2. **Redis for queue management:** A Redis database is used for the PingService’s queue system, and a Redis Docker image is included for deployment. You may use the included Dockerfiles to spin up databases quickly if you wish. **(Optional) Dockerised databases** Dockerfiles for the server and databases are located in the `Docker` directory
MongoDB Image Location: `Docker/mongoDB.Dockerfile` The `Docker/mongo/data` directory should be mounted to the MongoDB container in order to persist data. From the `Docker` directory run 1. Build the image: `docker build -f mongoDB.Dockerfile -t uptime_database_mongo .` 2. Run the docker image: `docker run -d -p 27017:27017 -v $(pwd)/mongo/data:/data/db --name uptime_database_mongo uptime_database_mongo`
Redis Image Location `Docker/redis.Dockerfile` the `Docker/redis/data` directory should be mounted to the Redis container in order to persist data. From the `Docker` directory run 1. Build the image: `docker build -f redis.Dockerfile -t uptime_redis .` 2. Run the image: `docker run -d -p 6379:6379 -v $(pwd)/redis/data:/data --name uptime_redis uptime_redis`
--- #### Starting the development server - run `npm run dev` to start the development server or, - run `node index.js` to start server --- ### API documentation Our API is documented in accordance with the [OpenAPI spec](https://www.openapis.org/). You can see the documentation on your local development server at http://localhost:{port}/api-docs You can also view the documentation on our demo server at [https://uptime-demo.bluewavelabs.ca/api-docs](https://uptime-demo.bluewavelabs.ca/api-docs) ### Error handling Errors are returned in a standard format: `{"success": false, "msg": "No token provided"}` Errors are handled by error handling middleware and should be thrown with the following parameters | Name | Type | Default | Notes | | ------- | --------- | ---------------------- | ------------------------------------ | | status | `integer` | 500 | Standard HTTP codes | | message | `string` | "Something went wrong" | An error message | | service | `string` | "Unknown Service" | Name of service that threw the error | Example: ``` const myRoute = async(req, res, next) => { try{ const result = myRiskyOperationHere(); } catch(error){ error.status = 404 error.message = "Resource not found" error.service = service name next(error) return; } } ``` Errors should not be handled at the controller level and should be left to the middleware to handle.