# Configuraciones para servidores Ubuntu 18
## MongoDB+CronTasks
```bash
# Agregamos llave de mongodb versión 4
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
# Agregamos gestor de paquetes de mongodb versión 4
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
# Agregamos al gestor de paquetes la versión 10 de NodeJS
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# Actualizamos los paquetes de nuestro sistema operativo
sudo apt-get update -y
# Configuramos la zona horaria para México
sudo timedatectl set-timezone America/Mexico_City
# Instalamos NodeJS
sudo apt install nodejs -y
# Instalamos pm2
sudo npm install pm2 -g
# Instalamos mongodb
sudo apt-get install -y mongodb-org
# Agregamos llave publica de Bitbucket
ssh-keyscan -H bitbucket.org >> ~/.ssh/known_hosts
# Generamos una llave privada
ssh-keygen
# Obtener llave pública y registrarla en repositorio de Bitbucket.
# El registro de la llave es manual, es decir,
# directamente en la plataforma de Bitbucket
cat ~/.ssh/id_rsa.pub
```
Una vez que tenemos lo anterior instalado, es necesario crear un usuario para la base de datos.
Para esto, ingresamos a nuestra base de datos con ayuda del comando `mongo`
Una vez adentro, agregamos un usuario nuevo escribiendo lo sigueinte. Ten en cuenta que deberás cambiar el valor de `<database>`, `<user>` y `<strongPassword>` por el que necesites.
```javascript
use admin
db.createUser(
{
user: "game-prod",
pwd: "BG4Y5H$iT6",
roles: [
{ role: "readWrite", db: "admin" }
]
}
)
```
Después es necesario modificar el archivo de configuración de mongo:
```bash
sudo nano /etc/mongodb.conf
```
```bash
...
# Modificamos el valor de bind_ip por 0.0.0.0
#bind_ip = 127.0.0.1
bind_ip = 0.0.0.0
...
...
# Descomentamos esta línea para activar la autenticación
auth = true
...
```
Por último, es necesario reiniar el servicio de mongodb
```bash
sudo service mongodb restart
```
## Api (App/Backoffice)
```bash
# Actualizamos los paquetes de nuestro sistema operativo
sudo apt-get update -y
# Configuramos la zona horaria para México
sudo timedatectl set-timezone America/Mexico_City
# Agregamos al gestor de paquetes la versión 10 de NodeJS
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# Instalamos NodeJS
sudo apt install nodejs -y
# Instalamos pm2
sudo npm install pm2 -g
# Agregamos llave publica de Bitbucket
ssh-keyscan -H bitbucket.org >> ~/.ssh/known_hosts
# Generamos una llave privada
ssh-keygen
# Obtener llave pública y registrarla en repositorio de Bitbucket.
# El registro de la llave es manual, es decir,
# directamente en la plataforma de Bitbucket
cat ~/.ssh/id_rsa.pub
```
## Backoffice
```bash
# Actualizamos los paquetes de nuestro sistema operativo
sudo apt-get update -y
# Configuramos la zona horaria para México
sudo timedatectl set-timezone America/Mexico_City
# Agregamos al gestor de paquetes la versión 10 de NodeJS
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
# Instalamos NodeJS
sudo apt install nodejs -y
# Instalamos nginx
sudo apt install -y nginx -y
# Agregamos llave publica de Bitbucket
ssh-keyscan -H bitbucket.org >> ~/.ssh/known_hosts
# Generamos una llave privada
ssh-keygen
# Obtener llave pública y registrarla en repositorio de Bitbucket.
# El registro de la llave es manual, es decir,
# directamente en la plataforma de Bitbucket
cat ~/.ssh/id_rsa.pub
```
Antes de realizar el despliegue de nuestro cliente, es necesario configurar nuestro servidor `nginx`
```bash
sudo nano /etc/nginx/sites-enabled/default
```
```nginx
# Ubicamos el Nodo server y modificamos el valor
# de root por el path de nuestro build
server {
listen 80 default_server;
listen [::]:80 default_server;
# root /var/www/html;
root <new-path>;
location / {
# De igual form, dentro del nodo location
# modificamos la variable try_files
# try_files $uri $uri/ =404;
try_files $uri $uri/ /index.html;
}
```
Por último es necesario reiniciar el servicio de `nginx`
```bash
sudo service nginx restart
```
## Configurar memoria swap
Los siguientes comandos generán una partición de `1G` si deseas asignarle más espacio solo modifica el valor en el comando `sudo fallocate -l 1G /swapfile`
**Evita crear particiones que superen más del 20% de tu memoria RAM, es decir, si tu RAM es de 8GB la partición swap no debería ser mayor a 2G**
```shell
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h
```
## Comando útiles de pm2
Listar procesos actuales
```
sudo pm2 list
```
Monitor de procesos
```
sudo pm2 monit
```
Reiniciar un proceso a partir de un archivo de configuración
```
sudo pm2 restart <file>
```
Detener un proceso
```
sudo pm2 stop <id|process name>
```
Iniciar un proceso a partir de un archivo de configuración
```
sudo pm2 start <file>
```
Eliminar un proceso
```
sudo pm2 delete <id|process name>
```
Ver log de proceso
```
sudo pm2 log <process name>
```
Borrar archivos de log
```
# Utilizando comandos de pm2
sudo pm2 flush <process name>
# O bien, podemos eliminarlos manualmente
sudo rm -rf ~/.pm2/logs/<process name>-*
```
```
db.getCollection('areas').drop( { writeConcern: { w: "majority" } } );
db.getCollection('campanias').drop( { writeConcern: { w: "majority" } } );
db.getCollection('categoriasConocimiento').drop( { writeConcern: { w: "majority" } } );
db.getCollection('desafiosEquipo').drop( { writeConcern: { w: "majority" } } );
db.getCollection('desafiosEquipoConcluidos').drop( { writeConcern: { w: "majority" } } );
db.getCollection('desafiosPersonales').drop( { writeConcern: { w: "majority" } } );
db.getCollection('devices').drop( { writeConcern: { w: "majority" } } );
db.getCollection('equipos').drop( { writeConcern: { w: "majority" } } );
db.getCollection('estadisticasCategoria').drop( { writeConcern: { w: "majority" } } );
db.getCollection('estadisticasDetallePregunta').drop( { writeConcern: { w: "majority" } } );
db.getCollection('estadisticasPregunta').drop( { writeConcern: { w: "majority" } } );
db.getCollection('insignaias').drop( { writeConcern: { w: "majority" } } );
db.getCollection('jugadores').drop( { writeConcern: { w: "majority" } } );
db.getCollection('preguntas').drop( { writeConcern: { w: "majority" } } );
db.getCollection('puntosCampania').drop( { writeConcern: { w: "majority" } } );
db.getCollection('retosEquipo').drop( { writeConcern: { w: "majority" } } );
db.getCollection('retosPersonales').drop( { writeConcern: { w: "majority" } } );
db.getCollection('sesionesInvalidas').drop( { writeConcern: { w: "majority" } } );
```
## Configuración de nginx
Servicios con Node
```
server {
listen 8080 default_server;
listen [::]:8080 default_server;
server_name <<domain>>;
location / {
proxy_pass <<local address>>;
}
}
```
Angular
```
server {
server_name <<domain>>;
root <<path to site>>;
location / {
try_files $uri$args $uri$args/ /index.html;
}
}
```