Skip to content

Commit d5ccdb8

Browse files
committed
gg
1 parent b7b327d commit d5ccdb8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+5344
-0
lines changed

.DS_Store

0 Bytes
Binary file not shown.

Docker/.DS_Store

0 Bytes
Binary file not shown.

Docker/MrSwarow/.DS_Store

8 KB
Binary file not shown.

Docker/MrSwarow/README.md

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# Plataforma completa
2+
## Primera configuración
3+
### Modificar el archivo host de linux
4+
1. Abrir el siguiente archivo con un editor de texto
5+
```
6+
/etc/hosts
7+
```
8+
2. Agregar lo siguiente
9+
```
10+
(ip de la pc) app.swarow.com
11+
(ip de la pc) api.swarow.com
12+
(ip de la pc) registry.swarow.com
13+
```
14+
### Hacer los certificados
15+
1. Instalar dependencias
16+
```
17+
sudo apt install wget libnss3-tools
18+
```
19+
2. Descargar mkcert
20+
3. Darle permisos de ejecución
21+
```
22+
chmod +x mkcert
23+
```
24+
4. Moverlo para que pueda llamarse por consola
25+
```
26+
sudo mv mkcert /usr/local/bin
27+
```
28+
5. Instalar la CA usando mkcert
29+
```
30+
mkcert -install
31+
```
32+
6. Emitir certificados
33+
```
34+
mkcert app.swarow.com api.swarow.com registry.swarow.com localhost
35+
```
36+
7. Guardarlos en la carpeta "certs" del proyecto
37+
### Servicio "Swarm"
38+
Desplegar el servicio, contiene registry y herramientas de gestión de swarm con swarm-config.yml
39+
## Despliegue de servicios sobre la plataforma
40+
### Servicio "Mongo" y "Redis"
41+
#### Servidores
42+
Primero hacer el deploy del servicio de Mongo y Redis
43+
#### Configuración MongoDB
44+
1. Entrar mediante "docker exec -it (id del container) sh" al contenedor de cfg server 1
45+
2. Tipear "mongo"
46+
3. Pegar lo siguiente
47+
```
48+
rs.initiate(
49+
{
50+
_id: "cfgrs",
51+
configsvr: true,
52+
members: [
53+
{ _id : 0, host : "cfgsvr1:27017" },
54+
{ _id : 1, host : "cfgsvr2:27017" },
55+
{ _id : 2, host : "cfgsvr3:27017" }
56+
]
57+
}
58+
)
59+
```
60+
4. Luego lo mismo que en el paso 1,2 y 3 pero con el servidor 1 del primer shard
61+
```
62+
rs.initiate(
63+
{
64+
_id: "shard1rs",
65+
members: [
66+
{ _id : 0, host : "shard1svr1:27017" },
67+
{ _id : 1, host : "shard1svr2:27017" },
68+
{ _id : 2, host : "shard1svr3:27017" }
69+
]
70+
}
71+
)
72+
```
73+
5. Luego lo mismo que en el paso 1, 2 y 3 pero con el servidor 1 del segundo shard
74+
```
75+
rs.initiate(
76+
{
77+
_id: "shard2rs",
78+
members: [
79+
{ _id : 0, host : "shard2svr1:27017" },
80+
{ _id : 1, host : "shard2svr2:27017" },
81+
{ _id : 2, host : "shard2svr3:27017" }
82+
]
83+
}
84+
)
85+
```
86+
6. Luego lo mismo que en el paso 1, 2 y 3 pero con el "mongos" o mongo router (acá son 2 comandos)
87+
```
88+
sh.addShard("shard1rs/shard1svr1:27017,shard1svr2:27017,shard1svr3:27017")
89+
```
90+
```
91+
sh.addShard("shard2rs/shard2svr1:27017,shard2svr2:27017,shard2svr3:27017")
92+
```
93+
7. En la carpeta de MongoDB, ejecutar el archivo "configurar.js" y "datos.js" para configurar la estructura de la db y datos de prueba
94+
8. Pendiente (configurar las zonas de sharding)
95+
### Servicio "Proxy"
96+
#### Verificar
97+
Nombres de los certificados, rutas y servidores
98+
### Servicio "API"
99+
#### Registry
100+
En la carpeta api, hacer "docker-compose build --parallel && docker-compose push"
101+
#### Servicio
102+
Luego hacer el deploy del servicio levantando el api.yml

Docker/MrSwarow/TODO.txt

+152
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
Ponerle codigos de error al SSE para manejar el objeto en el worker y saber el estado de la sesión (puede ser útil para saber si estoy logueado o no)
2+
Cuando se inicia sesión, que se mande un mensaje al worker para que se conecte con SSE
3+
Es mejor ignorar el SSE en cuestiones de depuración porque tiene errores genéricos y se reconecta solo pase lo que pase excepto por
4+
errores de auth
5+
6+
Usar el header 'last-event-id': '1', con una fecha para comparar con la colección de cambios, toda colección que tenga cambios entre la fecha y el momento actual será enviada
7+
con sse, y el worker hará peticiones http al server pidiendo lo que falte entre o tal vez lo sirva por el mismo sse, todavía no sé
8+
9+
El sse antes de ir a la base de datos que verifique los permisos de esa persona a ver si puede obtener esa info
10+
luego que compare
11+
12+
13+
2 opciones:
14+
15+
1 - JWT con todas las entidades
16+
-Se especifica en la url cuál quiero y el backend tendría que comprobar si coincide
17+
-Es mejor para dejar en cola productos y facturas a entidades diferentes
18+
-El mismo SSE podría mandarle cosas a varios
19+
20+
2 - JWT con una sola entidad
21+
-No hace falta especificar en la url y no podría tener pestañas con entidades diferentes
22+
-No podría hacer el queue para los que se quedan sin conexión
23+
-Un SSE puede mandar una cosa
24+
25+
26+
Gana 1, y en el backend:
27+
28+
Service worker vs worker genérico:
29+
30+
1 - GW
31+
-Fácil para gestionar los SSE
32+
-Múltiples conexiones por pestaña pero como es http2 se multiplexa
33+
-Requiere tener la app abierta para actualizar información
34+
2 - SW
35+
-Más complicados de gestionar
36+
-Un solo SSE, no hace falta multiplexar
37+
-Actualizará información cuando no se esté usando la app
38+
Conclusión:
39+
Usar sync para actualizar toda la info cuando sea necesario, y el SSE para mantener la información en tiempo real
40+
Cuando la app se cierra que quede solo un SSE en el SW para notificaciones importantes (gastaría menos batería)
41+
42+
INVESTIGAR!!!: Ver evento connect del serviceworker
43+
44+
Se usará el SW para peticiones normales con sync
45+
También se usará un GW para los SSE
46+
47+
Arquitectura microservicio:
48+
49+
1 - Al conectar el SSE a la ruta correspondiente, se van a enviar las cookies (que correspondan a ese path)
50+
la cookie tiene el formato :entidad=timestamp
51+
el microservicio verificará que dentro del JWT la entidad exista y pueda operar (por horarios, permisos, etc ...)
52+
tomará el timestamp de la cookie y hará una query filtrando resultados entre el timestamp y "ahora"
53+
54+
Microservicios
55+
-> Productos
56+
->GET(SSE)
57+
->POST
58+
->PUT
59+
->DELETE
60+
61+
2 - Un solo servidor SSE en un worker y al abrir la app se hacen consultas a varios paths aprovechando
62+
la multipexación para actualizar los datos en tiempo real, luego se abre el SSE que va a traer información de la entidad
63+
Se emitirán eventos desde el SSE que correspondan a cada colección (productos, facturas, etc)
64+
65+
66+
Microservicios
67+
-> SSE
68+
-> Productos
69+
->GET
70+
->POST
71+
->PUT
72+
->DELETE
73+
74+
Al abrir la pestaña y seleccionar una entidad sucederá lo siguiente:
75+
Verificar si hay conexión a internet, luego verificar si hay entidades en el sessionStorage
76+
Si no hay conexión ni sessionStorage:
77+
Decirle al usuario que necesita internet para inciiar sesión al menos por primera vez
78+
Si no hay conexión pero hay sessionStorage:
79+
Ofrecerle elegir la entidad trayendolas desde el localStorage con un botón o reintentar (NO utilizar SW sync)
80+
Si hay conexión:
81+
->GET /signin
82+
->Si es 200, mostrar entidades entonces vaciar por completo el localStorage y aplicar lo nuevo,
83+
->Si es 402, mostrar pantalla de inicio de sesión
84+
->Si es 416, mostrarle una burla
85+
Una vez elegida la entidad,
86+
->Si hay internet, entonces se enviará al SW un background sync para actualizar info vieja (de esa entidad),
87+
una vez recibida la info, se conecta al SSE de entidad correspondiente
88+
->Si no hay internet, también se hará el sync -DERP pwa vieja-, si hay un sse, se mata, así no queda en loop
89+
hasta que haya internet
90+
91+
92+
al enviar un mensaje al SW, se le deberá especificar la entidad para devolver lo que corresponde
93+
Al iniciar la app, enviar postmessage aclarando qué entidad se seleccionó para actualizar los datos que se van a usar
94+
95+
*Se usará un SW para peticiones GET,POST,DELETE,PUT mediante sync al seleccionar la entidad y si hay conexión a internet.
96+
*Se usará un GW para los SSE que actualizen la DB en RT - una lástima no poder usar los sharedWorkers -
97+
98+
------------------------------------
99+
100+
101+
Será jerarquía basada en componentes, según el plan, se editarán los permisos en el contrato para tener ciertos módulos
102+
->Módulos
103+
->Compra
104+
->Venta
105+
->Productos
106+
->Depósito
107+
->Estadísticas
108+
->Contratos
109+
->Configuración
110+
->Entidades
111+
->Ayuda
112+
->Salir
113+
114+
115+
***EL SSE SOLO SUSCRIBIRÁ A LA COLECCIÓN QUE CORRESPONDA SEGÚN MI NIVEL DE AUTORIZACIÓN**
116+
117+
Más adelante, implementar que la persona elija el sector donde trabaja
118+
esto es para filtrar stock según locación (para esto no hace falta SSE, se va a solicitar la info cuando sea necesaria)
119+
120+
121+
---------------------------------------------------------------------------------------------------------------------------------------------------
122+
123+
Seguir con clientes y medios de pago
124+
125+
----------------------------------------------------------------------------------------------------------------------------------------------------
126+
127+
128+
129+
130+
131+
Crear una carpeta api, proxy, static y separar redis de los microservicios y ponerlo en bbdd
132+
133+
mover config a api
134+
mover traefik a proxy
135+
136+
Mover todo al mismo nivel, quedaría api, proxy, static, databases, monitoring
137+
138+
Hacer un algoritmo que escuche al SIGTERM
139+
140+
..
141+
142+
Volver a poner la carga de componentes asíncrona
143+
144+
componente para comprobar compatibilidad de funciones, navegador, etc ..
145+
componente para limpiar o editar toda la configuración de la aplicación
146+
componente navegación con permisos
147+
148+
149+
Poner botón salir en varios componentes en caso de error
150+
151+
152+
Modificar precio, hacer que acepte

Docker/MrSwarow/api/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
package-lock.json

Docker/MrSwarow/api/api.yml

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
version: "3.7"
2+
3+
services:
4+
######## Static
5+
#static:
6+
# image: registry.swarow.com/static
7+
# networks:
8+
# - proxy
9+
# deploy:
10+
# placement:
11+
# constraints:
12+
# - node.hostname==Workstation
13+
######## APIs
14+
signup:
15+
image: registry.swarow.com/signup
16+
networks:
17+
- proxy
18+
- backend
19+
deploy:
20+
placement:
21+
constraints:
22+
- node.hostname==Workstation
23+
signin:
24+
image: registry.swarow.com/signin
25+
networks:
26+
- proxy
27+
- backend
28+
deploy:
29+
placement:
30+
constraints:
31+
- node.hostname==Workstation
32+
sse:
33+
image: registry.swarow.com/sse
34+
networks:
35+
- proxy
36+
- backend
37+
deploy:
38+
placement:
39+
constraints:
40+
- node.hostname==Workstation
41+
products:
42+
image: registry.swarow.com/products
43+
networks:
44+
- proxy
45+
- backend
46+
deploy:
47+
placement:
48+
constraints:
49+
- node.hostname==Workstation
50+
sales:
51+
image: registry.swarow.com/sales
52+
networks:
53+
- proxy
54+
- backend
55+
deploy:
56+
placement:
57+
constraints:
58+
- node.hostname==Workstation
59+
clients:
60+
image: registry.swarow.com/clients
61+
networks:
62+
- proxy
63+
- backend
64+
deploy:
65+
placement:
66+
constraints:
67+
- node.hostname==Workstation
68+
payment_methods:
69+
image: registry.swarow.com/payment_methods
70+
networks:
71+
- proxy
72+
- backend
73+
deploy:
74+
placement:
75+
constraints:
76+
- node.hostname==Workstation
77+
######## Test container
78+
whoami:
79+
image: containous/whoami
80+
networks:
81+
- proxy
82+
deploy:
83+
replicas: 5
84+
85+
networks:
86+
proxy:
87+
name: proxy
88+
external: true
89+
backend:
90+
name: backend
91+
external: true
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
FROM node:14.4.0-alpine3.12
2+
3+
ENV TZ='America/Argentina/Buenos_Aires'
4+
5+
COPY ./clients /api
6+
COPY ./config /api
7+
8+
WORKDIR /api
9+
10+
RUN npm install
11+
CMD node src/index.js
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "products",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "src/index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [],
10+
"author": "",
11+
"license": "ISC",
12+
"dependencies": {
13+
"cookie-parser": "^1.4.5",
14+
"cors": "^2.8.5",
15+
"express": "^4.17.1",
16+
"jsonwebtoken": "^8.5.1",
17+
"mongodb": "^3.5.5",
18+
"redis": "^3.0.2"
19+
}
20+
}

0 commit comments

Comments
 (0)