# Installation Guide
### Welcome to Spotify ElGhalaba Installation Guide
Please follow the following instructions on a clean Linux Setup
> Note: We use `Ubuntu Server 18.04 x86_64` for the examples
1. Install `git` :-
```bash
$ sudo apt update && sudo apt upgrade
$ sudo apt install git
```
2. Install `docker` for containerizing the running processes :-
```bash
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo usermod -aG docker <your user>
$ newgrp docker
```
you can test the installation by
```bash
$ docker -v
# Docker version 19.03.8, build afacb8b7f0
```
3. Install `nginx` :-
```bash
$ sudo apt install nginx
```
4. We will run our API container on port `8080`, front-end server on `4000` and `nginx` on port `80` as a reverse proxy. To do so, add the following config to `nginx.conf` :-
```yaml
http {
....
# Add this
server {
listen 80
location /api {
proxy_pass 127.0.0.1:8080/api
client_max_body_size 100M
}
location * {
proxy_pass 127.0.0.1:4000
}
}
}
```
5. Get SSL Certificate :-
We are going to use `certbot` to install a certificate for nginx from LetsEncrypt.
All you need is just to run this code.
```bash
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot python3-certbot-nginx
$ sudo certbot --nginx
```
> Note: make sure your certificate is updated automatically every 90 days using the command `sudo certbot renew --dry-run`
7. Generate ssh keys to communicate with gitlab :-
```bash
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa): # leave as is
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): # Enter this
Enter same passphrase again: # repeat
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gYoEmGJdS2ImAnoAmqd1JAWiK3bFYi/Y9wQjrXpM5Lg root@2d9ac453e081
The key's randomart image is:
+---[RSA 2048]----+
|@o+*+o |
|O*++= .. |
|B ==.B. . |
| BBo*.o . |
|++.B.o .S |
|o * o o |
| E o . |
| . |
| |
+----[SHA256]-----+
```
now the file is stored in `~/.ssh/id_rsa`. Now go there, open `id_rsa.pub` and copy its contents. Go to gitlab and add it to the allowed keys. **Make sure you have permissions**
7. Clone the two repos using ssh
```bash
$ git clone git@gitlab.com:spotify_el8alaba/front.git
$ git clone git@gitlab.com:spotify_el8alaba/back.git
```
Now you have two files in your `pwd` - let's say `~`. Time to dockerize !
> In the upcoming examples, we use `~` as `pwd`
8. Starting a bridge Docker network and Installing MongoDB Database container :-
First we need a Docker network to connect our Docker containers internally, It **MUST** be named **sp8** :
```bash
$ docker network create sp8
```
Make sure it's installed by listing the installed networks :
```bash
$ docker network ls
```
Now we need to run the DB continer inside our network using an image from DockerHub named `mongo:4-bionic` :
```bash
$ docker container run -d --name db --network sp8 mongo:4-bionic
```
Now you can see the db continer running :
```bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6394cc87eec mongo:4-bionic "docker-entrypoint.s…" 7 weeks ago Up About an hour 27017/tcp db
```
> NOTE : The connection string to this DB from any contianer **inside the `sp8` network** is `mongodb://db/<db-name>`
9. Before dockerization, make sure you adjust the environment variables of each application as mentioned in their `README` files.
10. Go to `~/back` and run :
```bash
$ ./start-docker.sh
```
> You **MUST** run these commands inside the **root folder of each repo.**
do the same with `~/front`. Now you have 3 running docker contaienrs. Run the following to verify :
```bash
$ docker ps
# You should see this output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
feb656893311 front:latest "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:4000->80/tcp front-prod
0eee6021f074 back:latest "docker-entrypoint.s…" About an hour ago Up 2 minutes 0.0.0.0:8080->80/tcp back-prod
f6394cc87eec mongo:4-bionic "docker-entrypoint.s…" 7 weeks ago Up About an hour 27017/tcp db
```
Notice that the `back-prod` container runs on port `8080` by default while `front-prod` runs on port `4000`. If you wish to change this, you change the `EXPOSE` command of the `Dockerfile` but don't forget to also change the `docker run` command in `start-docker.sh`. However, we prefer to keep it as is and adjust their extenal env only.
### Thats it ! Happy Deployment !