From ea6389885414f476ead739e4e33389fc455a7238 Mon Sep 17 00:00:00 2001 From: Felix Albrigtsen Date: Thu, 28 Apr 2022 00:21:36 +0200 Subject: [PATCH] Upload installation manual --- documentation/InstallationManual.md | 120 +++++++++++++++++++++++++++ documentation/InstallationManual.pdf | Bin 0 -> 31465 bytes src/server/package.json | 3 +- 3 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 documentation/InstallationManual.md create mode 100644 documentation/InstallationManual.pdf diff --git a/documentation/InstallationManual.md b/documentation/InstallationManual.md new file mode 100644 index 0000000..3f27be8 --- /dev/null +++ b/documentation/InstallationManual.md @@ -0,0 +1,120 @@ +# Installing Asura Tournament Manager +This is guide describes the process of installing Asura Tournament Manager on your own server. At the time of writing, you can reach our production server at [https://asura.feal.no/](https://asura.feal.no/). + +- [Installing Asura Tournament Manager](#installing-asura-tournament-manager) + - [Before installing](#before-installing) + - [Download the source](#download-the-source) + - [Configure the client](#configure-the-client) + - [Install dependencies](#install-dependencies) + - [Configure environment variables](#configure-environment-variables) + - [Build the client](#build-the-client) + - [Configure the server](#configure-the-server) + - [Install dependencies](#install-dependencies-1) + - [Configure environment variables](#configure-environment-variables-1) + - [Initialize the database](#initialize-the-database) + - [Check the list of requirements](#check-the-list-of-requirements) + - [Start the server](#start-the-server) + +## Before installing +Before installing Asura Tournament Manager, you need the following: +- A suitable server to host the software. There are many ways to deploy the server, for example + - Cloud hosting provider + - Virtual Machine + - Dedicated server +- A domain name to reach the server over the internet +- A MySQL database to store persistent data + - This can be either on the same server as the application, or on a separate database server +- A Google account to sign in to the application +- A Google API key for authenticating users + - Acquiring this is both simple and free, and is described in the [Google API documentation](https://developers.google.com/identity/gsi/web/guides/get-google-api-clientid) +- [Recommended] A reverse proxy. Software proxies like [Nginx](https://www.nginx.com/) will greatly improve the performance, reliability and security of the application. + - The tournament manager does not handle SSL/HTTPS by itself + - The server is susceptible to DoS attacks + - Although the application logs requests to the console, they are not saved on disk + - Setting up a reverse proxy is not required, but it is *strongly* recommended. Configuration is out of scope of this manual, but it can be found in the [Nginx documentation](https://nginx.org/en/docs/http/ngx_http_proxy_module.html) + +## Download the source +Before you can run the tournament system, you must download the source code. At the time of writing, it is available on NTNU-IDI Gitlab. + +Download the entire repository to your machine: +```bash +git clone git@gitlab.stud.idi.ntnu.no:felixalb/dcst1008-2022-group1.git +``` + +## Configure the client +The client is a web application that runs in the clients browser. After this step is finished, the entire build consists of a single html file, a few javascript files and some static assets. + +### Install dependencies +```bash +cd src/client +npm install +``` +This step fetches all the required libraries into the node_modules folder. +### Configure environment variables +```bash +cp dotenv-template .env +nano .env +``` +Edit the `.env`-file containing a few simple settings for the client, using nano or any other editor. Only the two first lines have to be changed, and just requires the server URL. + +### Build the client +```bash +npm run build +``` +This step will build the client, optimize it and package it into just a few files. The resulting files are placed in the `build` folder. You are now done with the client and everything else, like serving the build files, are handled by the server. + + + +## Configure the server +The server is a node application that both serves the client files and handles the database and tournament logic. The installation process is similar to the client. + +### Install dependencies +```bash +cd src/server +npm install +``` +### Configure environment variables +```bash +cp dotenv-template .env +nano .env +``` +Edit the `.env`-file containing all the server options. This includes: +- The server URL +- The MySQL database credentials +- The Google API credentials +- A cookie secret. This can be any random string of text, as long as it's secret. +- The remaining options should be left as default + +### Initialize the database +To create the required tables, start with an empty database. + +This can be done with a mysql cli utility: +```bash +mysql -h mysql.stud.ntnu.no -u felixalb_sysut -p felixalb_asura < ./management/initDB.sql +``` +Or by pasting the content of `src/server/management/initDB.sql` into another MySQL manager like PHPMyAdmin. + +After initializing the empty tables, you will have to insert your own email address. Insert email=youraddress and isManager=1 into the `users` table to register your user. All other users can be added in the graphical user interface. + +### Check the list of requirements +Read the [list of preparations above](#before-installing) to see all the requirements. +When you have configured everything, you are ready to start the server. + +## Start the server +When all the steps above have been completed, you can start the server with: + +In `src/server`: +```bash +npm start +``` +You should see a message like this: +``` +> tournament-server@1.0.0 start +> node index.js + +Listening on port 3000 +``` + +Access logs, error messages and other useful messages will be printed to the screen. The database connection is handled automatically, and will reconnect if the connection is lost. + +The server can be stopped by pressing Ctrl+C, as nodejs will handle terminate the process cleanly, freeing its resources. \ No newline at end of file diff --git a/documentation/InstallationManual.pdf b/documentation/InstallationManual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a562586fc820b651fb2e5051b97392a931f5ccf6 GIT binary patch literal 31465 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 e_Rzhx#U+VFB^5=fX