From e88f34fd679d8572c7192ff395399111195a89e9 Mon Sep 17 00:00:00 2001 From: Nicho Date: Fri, 3 Mar 2017 15:38:58 +0100 Subject: [PATCH] Updated README --- LICENSE | 3 +- README.md | 156 +++++++++++++++++++++++++++++------- docs/img/github_desktop.png | Bin 26528 -> 0 bytes 3 files changed, 127 insertions(+), 32 deletions(-) delete mode 100644 docs/img/github_desktop.png diff --git a/LICENSE b/LICENSE index 0f425ba..a296536 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Sitcom Lab +Copyright (c) 2017 Sitcom Lab Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/README.md b/README.md index aa89d50..ae64ad8 100644 --- a/README.md +++ b/README.md @@ -3,83 +3,179 @@ Ethics-application for the approval of user-studies -### 1. Requirements +## Installation -##### 1.1. Install nodejs: +### 1. Database -Go to [https://nodejs.org/en/](https://nodejs.org/en/) and download the latest **LTS Version** (currently: `v6.9.2 LTS`). Then install nodejs on your machine. +##### 1.1. Postgres -##### 1.2. Install bower: +* Go to [https://www.postgresql.org](https://www.postgresql.org) and download the latest version of Postgres. +* If you are on Ubunutu you can use the following commands -Run in your terminal the following command: +``` +sudo apt-get install postgresql postgresql-contrib +sudo -i -u postgres ``` -npm install bower -g + +* If you are on macOS you can alternatively use Homebrew ([http://brew.sh/index_de.html](http://brew.sh/index_de.html)) to install Postgres + ``` +brew install postgres -##### 1.3. PostgresSQL +brew services start postgres +brew services restart postgres +brew services stop postgres +``` -TODO +or simply download and install the [Postgres.app](http://postgresapp.com/). -##### 1.4. Create database instance +##### 1.2. Database instance -TODO +* Create a new database instance with the name `ethics-app` +* Go to [https://www.pgadmin.org](https://www.pgadmin.org), download and install pgAdmin to create a new database +* Alternatively you can use the following command to create a new database of the command-line (run the command with `sudo`, if you don't have permission): -### 2. Installation +``` +createdb -h localhost -p 5432 -U postgres ethics-app +``` -**Attention: If you want to contribute to this project, please make a FORK on GitHub and send then a PULL-REQUEST with your changes. If you want to run the application, just follow the next steps.** +* Another option is the Postgres prompt, open it with the command `psql` and run the following command: -##### 2.1. Clone the repository +``` +CREATE DATABASE ethics-app; +``` -Choose one of the following options: +* More information can be found here: [https://www.tutorialspoint.com/postgresql/postgresql_create_database.htm](https://www.tutorialspoint.com/postgresql/postgresql_create_database.htm) -##### 2.1. a) Cloning with git +##### 1.3. Database schemas -Go to [https://git-scm.com](https://git-scm.com) and download and install **Git**. Run then the following command: +* The next step is to create all tables in your database instance. +* You can use a setup-script to prepare the schemas automatically. +* If you don't have Nodejs installed, please follow the instructions of [2.3.](#nodejs) first. +* Execute the setup-script with the following command (run the command with `sudo`, if you don't have permission): ``` -git clone https://github.com/sitcomlab/Ethics-app.git +node setup.js ``` -##### 2.1. b) Cloning with GitHub for Desktop +* If you need to specify the **NODE ENVIRONMENT VARIABLES**, these parameters can be set: + * `POSTGRES_HOST`: Postgres host address (default: `127.0.0.1`) + * `POSTGRES_PORT`: Postgres port number (default: `7687`) + * `POSTGRES_USERNAME`: Postgres username (default: `Nicho`) + * `POSTGRES_PASSWORD`: Postgres password (default: ``) +* Run the following command, like this: -* Download and install **GitHub for Desktop** [https://desktop.github.com](https://desktop.github.com) and clone then the repository: +``` +# Linux & macOS +node setup.js -![github for desktop](docs/img/github_desktop.png) +# Windows +set node setup.js +``` + + +### 2. Ethics-app + +##### 2.1. Git/GitHub +* If you have Git already installed, you can use the CLI in your terminal. + +* Install Git: [https://git-scm.com](https://git-scm.com) +* Install the GitHub client: [https://desktop.github.com](https://desktop.github.com) -##### 2.2. Install dependencies: +##### 2.2. GitHub repository -Open a terminal and execute the following commands inside your local repository-folder (you should see the files: `package.json` and `bower.json`): +* Clone the repository to your local (run the command with `sudo`, if you don't have permission): ``` -npm install +git clone https://github.com/sitcomlab/Ethics-app.git ``` +##### 2.3. Nodejs + +* Install Nodejs: [https://nodejs.org](https://nodejs.org) +* Install the required node-modules from the `package.json` inside the repository (run the command with `sudo`, if you don't have permission): + +``` +node npm install +``` + +##### 2.4. Bower + +* Install Bower via **npm** (run the command with `sudo`, if you don't have permission): + +``` +node npm bower -g +``` + +* Install the required bower_components from the `bower.json`: + ``` bower install ``` -or as root: +* If you need root-permission, install the bower dependencies with this command: ``` sudo bower install --allow-root ``` -### 3. Run +##### (Server settings) + +* If you have installed the Ethics-app on a Linux server, you can create a cronjob to automatically start the server after a reboot. Open `sudo nano /etc/crontab` and add the following lines: + +``` +# Start Ethics-app +@reboot root cd /home//Ethics-app && PORT=5000 node server.js >> log.txt +``` + +* Add an optional `>> log.txt` to automatically log the output of the console to a text-file. +* Add the following lines to your `/etc/crontab`, if you want to create an internal redirect from incoming port 80, to internal port 5000, as well as incoming port 443 to internal port 5443: -* Please make sure, that your Postgres-database is running, otherwise open a new terminal and start the deamon with the following command: +``` +# Redirecting +@reboot root iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT && iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT && iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000 && iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 5443 +``` -TODO +### 3. Starting the Ethics-app -* Start then the application with the following command: +* You can start the Ethics-app-server with the following command: ``` node server.js ``` -* As the application can send Emails, you have to specify the SMTP-server by environment variables: +* If you need to specify the **NODE ENVIRONMENT VARIABLES**, these parameters can be set: + * `NODE_ENV`: server environment (default: `development`, option: `production`) + * `SERVER_URL`: url of the nodejs-server (default: `http://ethics-app.uni-muenster.de`) + * `HTTP_PORT`: port number of the nodejs-server: (default: `5000`) + * `HTTPS_PORT`: secure port number of the nodejs-server: (default: `HTTP_PORT + 443`) + * `POSTGRES_HOST`: Postgres host address (default: `localhost`) + * `POSTGRES_PORT`: Postgres port number (default: `5432`) + * `POSTGRES_DB_NAME`: Postgres database name (default: `ethics-app`) + * `POSTGRES_USERNAME`: Postgres username (default: `Nicho`) + * `POSTGRES_PASSWORD`: Postgres password (default: `undefined`) + * `POSTGRES_SSL`: Postgres ssl connection (default: `false`) + * `FROM`: Email-address for users to reply, if they have question (default: `ifgi-ethics@uni-muenster.de`) + * `SMTP_HOST`: SMTP host address (default: `smtp.gmail.com`) + * `SMTP_PORT`: SMTP port number (default: `465`) + * `SMTP_SSL`: SMTP ssl connection (default: `true`) + * `SMTP_EMAIL_ADDRESS`: SMTP email address, which is used to send emails via nodemailer to send document-Ids and notify the users and members about changes (default: `undefined`) + * `SMTP_PASSWORD`: SMTP password (default: `undefined`) + * `JWTSECRET`: Secret for the JSON-Webtoken-authentication (default: `superSecretKey`) + +* If you want to run the application, you need to specify the `SMTP_EMAIL_ADDRESS` and `SMTP_PASSWORD` of the Sitcom Lab, otherwise no Emails with your Document-Ids can be sent to you. +* Run the following command, like this: ``` -SMTP_EMAIL= SMTP_PW= SERVER_URL= node server.js +# Linux & macOS +HTTP_PORT=4000 node server.js + +# Windows +set HTTP_PORT=4000 node server.js ``` + +## License + +[MIT](LICENSE) diff --git a/docs/img/github_desktop.png b/docs/img/github_desktop.png deleted file mode 100644 index c39a8b76ebd2744b532eca9facd814d0627980d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26528 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 I%Kaz*1!wC+$^ZZW