By: Daniel Hoyos Ospina - [email protected]
Aplicación web que permite gestionar Peliculas, un CRUD básico de metadatos de video (titulo, director, año, genero, tamaño, y url de la imagen de la pelicula).
Peliculas:
- Crear una pelicula.
- Buscar peliculas por una parte del titulo
- Borrar peliculas por Id de la pelicula
- Listar todas las peliculas de la base de datos que sean publicas
- Listar y gestionar las peliculas propias de un usuario
- Listar las peliculas compartidas con un usuario
- filtrar peliculas por su genero.
Usuario:
- Crear usuario.
- Cambiar usuario o contraseña.
- Borrar usuario.
- Buscar por nombre de usuario para compartir contraseñas.
- Lenguaje de Programación: Javascript
- Framework web backend: NodeJS - Express
- Framework web frontend: Angular 2 js
- Base de datos: MongoDB
- Web App Server: NodeJS
- Web Server: NGINX
Se generó la base del servidor en node, con Yeoman:
$ yo express
Luego se genero la base del front end de angular 2 con el comando: $ ng new MovieD
movie: { title: String, year: String, genre: String, size: String, director: String, imageUrl: String, owner_username: String, visibility: String, shared_with: [String] }
user: { username: String, password: String }
/* Servicio Web: Crear Pelicula Método: POST Autenticado: SI URI: /movie Body: { "title": val, "year": val, "genre": val, "size": val, "director": val, "imageUrl": val, "owner_username": val, "visibility" : ["private"| "public"], "sharedWith": val[] } / / Servicio Web: Listar todas las peliculas publicas Método: GET Autenticado: NO URI: /movie */
/* Servicio Web: Buscar pelicula publica por titulo Método: POST Autenticado: NO URI: /searchMovie Body: { "searchTerm": val } */
/* Servicio Web: Listar todas las peliculas privadas Método: POST Autenticado: SI URI: /myContent Body: { "username": val } */
/* Servicio Web: Listar las peliculas compartidas con el usuario. Método: POST Autenticado: SI URI: /sharedWithMe Body: { "username": val } */
/* Servicio Web: Actualizar pelicula Método: POST Autenticado: SI URI: /update Body: { "_id": val, "title": val, "year": val, "genre": val, "size": val, "director": val, "imageUrl": val, "owner_username": val, "visibility" : ["private"| "public"], } */
/* Servicio Web: Borrar cancion por Id Método: POST Autenticado: SI URI: /deleteMovie Body: { "_id": "val" } */
/* Servicio Web: Listar peliculas por genero Método: POST Autenticado: SI URI: /movieGenre Body: { "searchTerm": "val" } */
/* Servicio Web: Listar peliculas por genero Método: POST Autenticado: SI URI: /shareMovie Body: { "_id": "val", "username":"val" } */
/* Servicio Web: Crear usuario Método: POST Autenticado: NO URI: /signup Body: { "username": "usuario", "password": "password" } */
/* Servicio Web: Ingresar a la plataforma con un usuario Método: POST Autenticado: NO URI: /login Body: { "username": "usuario", "password": "password" } */
/* Servicio Web: Actualizar usuario Método: POST Autenticado: SI URI: /updateUsername Body: { "username": val, "_id": val } */
/* Servicio Web: Actualizar contraseña de usuario. Método: POST Autenticado: SI URI: /updatePassword Body: { "password": val, "_id": val } */
/* Servicio Web: Borrar usuario Método: POST Autenticado: SI URI: /deleteUser { "username": val } */
/* Servicio Web: buscar usuario Método: POST Autenticado: SI URI: /searchUser { "searchTerm": val } */
/* Servicio Web: logout usuario Método: GET Autenticado: SI URI: /logout */
/* Servicio Web: traer información de sesión de usuario. Método: GET Autenticado: SI URI: /userInfo */
source: https://www.liquidweb.com/kb/how-to-install-nvm-node-version-manager-for-node-js-on-centos-7/
user1$ nvm install v7.7.4
dhoyoso$ npm install --save
como root:
user1$ sudo yum install mongodb-server -y'
ponerlo a correr:
user1$ sudo systemctl enable mongod
user1$ sudo systemctl start mongod
user1$ sudo yum install nginx
user1$ sudo systemctl enable nginx
user1$ sudo systemctl start nginx
Abrir el puerto 80
user1$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
user1$ sudo firewall-cmd --reload
user1$ firewall-cmd --zone=public --add-port=5000/tcp --permanent
user1$ firewall-cmd --reload
user1$ firewall-cmd --list-all
4.6 Se instala un manejador de procesos de nodejs, se instala: PM2 (http://pm2.keymetrics.io/)
user1$ npm install -g pm2
user1$ cd dev/topicostelematicap1-2/
user1$ pm2 start app.js
user1$ pm2 list
ponerlo como un servicio, para cuando baje y suba el sistema:
user1$ sudo pm2 startup systemd
Deshabilitar SELINUX
user1$ sudo vim /etc/sysconfig/selinux
SELINUX=disabled
user1$ sudo reboot
// /etc/nginx/nginx.config
.
.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 10.131.137.219;
root /usr/share/nginx/html;
.
.
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /dhoyoso/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:5000/;
proxy_redirect off;
}
location /dhoyoso/ {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
#
# Custom headers and headers various browsers *should* be OK with but aren't
#
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
#
# Tell client that this pre-flight info is valid for 20 days
#
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}
alias /home/dhoyoso/dev/topicostelematicap1-2/MovieD/dist/;
try_files $uri$args $uri$args/ /dhoyoso/index.html;
}
.
.
Pasos para el despliegue luego de tener la cuenta: Se descarga el CLI de Heroku: https://devcenter.heroku.com/articles/heroku-command-line Luego en la terminal se ejecutan los siguentes pasos:
$ heroku login
usernamae:[email protected] password *********
Luego de hacer log in ir a la carpeta donde se encuentra el proyecto y hacer
$ git init $ git add . $ git commit -am "first commit" $ git push heroku master
y se verifica en la pagina https://https://lit-plateau-32627.herokuapp.com/
Se crea una cuenta en MLab y se crea una base de datos nueva y se crea un usuario para autenticarse en esta base de datos, posteriormente se agrega la ruta de la base de datos en el archivo respectivo de configuracion asi:
ruta de configuración: MoviesServer/config/config.js: . . production: { root: rootPath, app: { name: 'moviesServer' }, port: process.env.PORT || 8080, db: 'mongodb://dhoyoso:[email protected]:49201/movieserver' } . .