-
Registro de usuarios en DB con hash de password con bcrypt
-
Creado token JWT en localStorage
-
Falta verificar porque puedo entrar en endpoints sin el accessToken (Ejemplo: /user/dashboard)
-
Verificar que el registro de usuarios se haga correctamente con bcrypt
-
El token en localStorage tiene una expiración de 1h (signOptions: { expiresIn: "1h" }). Hay que verificar que despues de ese tiempo el token expira y se elimina
- Crear instancia EC2 Ubuntu
- Conexión SSH: ssh -i /ruta/a/tu/archivo.pem ubuntu@tu-dns-publico-amazon:
# Actualiza
sudo apt update && sudo apt upgrade -y
# Instala curl
sudo apt install curl -y
# Añade el repositorio de Node.js 18
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
# Instala Node.js y NPM
sudo apt install -y nodejs
# Verifica la instalación
node -v
npm -v
# Instala Git
sudo apt install git -y
# Clona tu repositorio
git clone URL al Repo GitHub
# Entra en la carpeta del proyecto
cd Proyecto
# Instala PM2 globalmente
sudo npm install -g pm2
# Configura PM2 para que se inicie con el sistema
pm2 startup
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ubuntu --hp /home/ubuntu
# Instala Nginx
sudo apt install nginx -y
# Inicia Nginx
sudo systemctl start nginx
# Habilita Nginx para que se inicie con el sistema
sudo systemctl enable nginx
# Construir el Front-End
cd /home/ubuntu/SwiftShop/frontend
npm install # Instala las dependencias del frontend
npm run build # Genera los archivos estáticos de producción
#Configura Nginx
sudo nano /etc/nginx/sites-available/default
server {
listen 80;
server_name tu-dominio-o-ip; # Cambia esto por tu dominio o deja la IP pública de tu servidor EC2
# Servir el frontend desde /home/ubuntu/SwiftShop/frontend/build o dist
root /home/ubuntu/SwiftShop/frontend/dist;
index index.html index.htm;
location / {
try_files $uri /index.html; # Redirigir a index.html para que funcione el routing del frontend
}
# Configuración para el backend (API)
location /api/ {
proxy_pass http://localhost:3000; # El backend de Node.js corriendo en el puerto 3000
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# Construir el Back-End
# Entra en la carpeta de backend
cd /home/ubuntu/SwiftShop/backend
# Instala las dependencias de tu aplicación
npm install
# Ejecuta la aplicación usando PM2
pm2 start npm --name "backend" -- start
# Para verificar que PM2 esté corriendo
pm2 list
# Verifica que Nginx está bien configurado
sudo nginx -t
sudo chmod 755 /home/ubuntu
sudo chmod 755 /home/ubuntu/SwiftShop
sudo chmod 755 /home/ubuntu/SwiftShop/frontend
sudo chmod 755 /home/ubuntu/SwiftShop/frontend/dist
# Reiniciar Nginx
sudo systemctl restart nginxPor defecto en Ubuntu de EC2 no funciona, hay que seguir los siguientes pasos:
Acceder al archivo sshd_config en EC2:
sudo nano /etc/ssh/sshd_config-
Descomentar las siguientes líneas:
- PubkeyAuthentication yes
- AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
-
Añadir la siguiente línea debajo de PubkeyAuthentication yes:
- PubkeyAcceptedAlgorithms +ssh-rsa
npm install --force
npm install -g @nestjs/cli
npm install dotenv --force
npm install @nestjs/config --force
npm install @types/node --save-dev --force
-- npm install @nestjs/common@^8.0.0 @nestjs/core@^8.0.0 @nestjs/swagger@^5.0.0
npm install @nestjs/typeorm typeorm mysql2 --force
npm init
npm start
# (Se ejecuta en http://localhost:3000/api/)- URL:
/api/products - Método:
POST - Descripción: Crea un nuevo producto.
- Request Body:
{
"name": "Nombre del Producto",
"description": "Descripción del Producto",
"price": 100.0,
"stock": 50,
"category": "Categoría del Producto"
}- Response:
{
"id": 1,
"name": "Nombre del Producto",
"description": "Descripción del Producto",
"price": 100.0,
"stock": 50,
"category": "Categoría del Producto",
"createdAt": "2024-06-01T00:00:00Z"
}- URL:
/api/products - Método:
GET - Descripción: Obtiene una lista de todos los productos.
- Response:
[
{
"id": 1,
"name": "Nombre del Producto",
"description": "Descripción del Producto",
"price": 100.00,
"stock": 50,
"category": "Categoría del Producto",
"createdAt": "2024-06-01T00:00:00Z"
},
...
]- URL:
/api/products/{id} - Método:
PUT - Descripción: Actualiza la información de un producto existente.
- Request Body:
{
"name": "Nombre del Producto Actualizado",
"description": "Descripción del Producto Actualizada",
"price": 120.0,
"stock": 60,
"category": "Nueva Categoría"
}- Response:
{
"id": 1,
"name": "Nombre del Producto Actualizado",
"description": "Descripción del Producto Actualizada",
"price": 120.0,
"stock": 60,
"category": "Nueva Categoría",
"updatedAt": "2024-06-01T01:00:00Z"
}- URL:
/api/products/{id} - Método:
DELETE - Descripción: Elimina un producto existente.
- Response:
{
"message": "Producto eliminado exitosamente."
}- URL:
/api/inventory - Método:
PUT - Descripción: Actualiza la cantidad de inventario de un producto.
- Request Body:
{
"productId": 1,
"quantity": 100
}- Response:
{
"productId": 1,
"quantity": 100,
"updatedAt": "2024-06-01T01:30:00Z"
}- URL:
/api/customers - Método:
POST - Descripción: Crea un nuevo cliente.
- Request Body:
{
"name": "Nombre del Cliente",
"email": "cliente@example.com",
"address": "Dirección del Cliente"
}- Response:
{
"id": 1,
"name": "Nombre del Cliente",
"email": "cliente@example.com",
"address": "Dirección del Cliente",
"createdAt": "2024-06-01T02:00:00Z"
}- URL:
/api/orders - Método:
POST - Descripción: Crea un nuevo pedido.
- Request Body:
{
"customerId": 1,
"products": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 1
}
],
"total": 300.0
}- Response:
{
"id": 1,
"customerId": 1,
"products": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 1
}
],
"total": 300.0,
"createdAt": "2024-06-01T03:00:00Z"
}- URL:
/api/stores - Método:
POST - Descripción: Crea una nueva tienda.
- Request Body:
{
"name": "Nombre de la Tienda",
"ownerId": 1
}- Response:
{
"id": 1,
"name": "Nombre de la Tienda",
"ownerId": 1,
"createdAt": "2024-06-01T04:00:00Z"
} graph TD
A[Crear Producto] --> B[Obtener Lista de Productos]
B --> C[Actualizar Producto]
C --> D[Eliminar Producto]
graph TD
A[Actualizar Inventario]
graph TD
A[Crear Cliente]
graph TD
A[Crear Pedido]
graph TD
A[Crear Tienda]