From 34064c29ddafc836dc871a7239cbba0804f96ed0 Mon Sep 17 00:00:00 2001 From: Eduardo Zepeda Date: Wed, 11 Sep 2024 00:37:36 -0600 Subject: [PATCH] Update notes --- Notes/GitYGithub/index.md | 25 +++++++- Notes/Kubernetes/index.md | 105 ++++++++++++++++++--------------- Notes/Nextjs/index.md | 76 ++++++++++++++++++++++-- Notes/Postgres/index.md | 7 ++- Notes/ReactQuery/index.md | 3 +- Notes/SitiosWebUtiles/index.md | 3 + 6 files changed, 163 insertions(+), 56 deletions(-) diff --git a/Notes/GitYGithub/index.md b/Notes/GitYGithub/index.md index 123f8ac..66ac7e6 100644 --- a/Notes/GitYGithub/index.md +++ b/Notes/GitYGithub/index.md @@ -531,13 +531,34 @@ git stats ## 1.24 Recuperar cambios borrados El comando git reflog nos permite recuperar todos los cambios hechos en -el repositorio, incluso aquellos que fueron desechos con *git reset ---hard*. +el repositorio, incluso aquellos que fueron desechos con *git reset --hard*. ``` bash git reflog ``` +### ¿Cómo usar git reflog + +La manera de usarlo es la siguiente + +Utilizamos + +``` bash +git reflog show + (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: commit: + HEAD@{1}: commit: +``` + +Ahora podemos volver a cualquier estado del repositorio, incluso si usamos git reset. + +Para ello basta con identificar el head al que queremos volver y usarlo con git reset + +``` bash +git reset --soft HEAD@{} +``` + +Esto devolverá el repositorio al estado que tenía en este momento. + ## 1.25 Excluir archivos del indice de git El comando rm seguido de la opción --cached, mantendrá el archivo en el diff --git a/Notes/Kubernetes/index.md b/Notes/Kubernetes/index.md index 06928ec..f505c62 100644 --- a/Notes/Kubernetes/index.md +++ b/Notes/Kubernetes/index.md @@ -39,11 +39,12 @@ No requieren usar el mismo lenguaje o framework. Un cluster es una agrupación de máquinas que corren una cierta cantidad de servicios. -Cada cluster corre +Cada cluster corre: * Docker runtime * Kubelet agent * Network proxy + ## Nodos Un nodo es un worker machine, una máquina dentro de un cluster, puede ser una VM o una máquina física, debe contar con todos los servicios para ejecutar los pods. @@ -82,7 +83,7 @@ Sin embargo, Kubernetes no realiza un provisionamiento de la infraestructura, so - Establecer mecanismos para hacer roll-outs de código. - Políticas de scaling automáticas. - Jobs batch. -- Correr servicios con datos stateful. +- Correr servicios con datos stateful, es decir con datos permanentes, similares a los volúmenes en docker. Todos los contenedores que viven dentro de un mismo Pod comparten el mismo segmento de red. @@ -221,7 +222,7 @@ Los objetos más frecuentes son: > - Volumen > - Namespace -Los objetos de algo nivel son: +Los objetos de alto nivel son: > - ReplicationController > - ReplicaSet @@ -503,10 +504,9 @@ Un pod es el más pequeño y más básico objeto que puede ser desplegado en kubernetes. Representa una instancia de un proceso que corre en el cluster. Un pod puede contener uno o más contenedores y **se aloja en un nodo**. Cuando un pod ejecuta múltiples contenedores, los contenedores se manejan como una entidad -única y **comparten el mismo namespace de red (dirección IP) y el -almacenamiento.**. +única y **comparten el mismo namespace de red (dirección IP) y el almacenamiento.**. -Generalmente no se gestionaran los pods de manera individual, sino a través de deployments o replicasets. Pero es posible crear pods sin los dos abstracciones anteriores. +Generalmente no se gestionaran los pods de manera individual, sino a través de deployments o replicasets. Pero es posible crear pods sin las dos abstracciones anteriores. Cuando se escala un pod en kubernetes se crean nuevas copias del pod, estas copias son irrecuperables una vez se han eliminado, por lo que los pods son perfectos para elementos stateless. @@ -584,7 +584,7 @@ ReplicaController. Además asegura lo siguiente: - Escalabilidad dinámica - Que no haya caída del servicio -Los replicaset generalmente dependen de un deployment y no se utilizan de manera aislada. +**Los replicaset generalmente dependen de un deployment y no se utilizan de manera aislada.** ### 1.14.1 Definición de un yml de ReplicaSet @@ -692,7 +692,9 @@ spec: - containerPort: 80 ``` -El deployment es la entidad de kubernetes con la que se interactuará más frecuentemente. El +### Importancia de los deployments + +**El deployment es la entidad de kubernetes con la que se interactuará más frecuentemente**. El despliegue de un Deployment conlleva la creación de un ReplicaSet y los Pods correspondientes. Por lo que es necesario definir también el replicaSet asociado. @@ -780,7 +782,7 @@ Se eliminan, siguiendo la misma sintaxis kubectl delete deployment ``` -## 1.16 Servicios +## 1.16 Servicios en k8s Normalmente no podemos acceder a los pods desde fuera del cluster de Kubernetes. @@ -806,7 +808,8 @@ Cuando se crea un nuevo servicio, se le asigna una nueva ip interna virtual a partir de la ip del servidor master del cluster. - LoadBalancer: Balanceador externo provisionado para cloud providers (GKE, AKS o AWS). No se puede usar de manera local, excepto con *minikubetunnel*. -- ExternalName: Entrada de DNS que es gestionada por CoreDNS. + Es mejor que el NodePort porque no es necesario conocer su IP de antemano para acceder. +- ExternalName: Entrada de DNS que es gestionada por CoreDNS. ### 1.16.2 Creación de un servicio tipo Cluster IP @@ -1097,8 +1100,8 @@ asegurarlo. ## 1.20 Daemon sets y balanceo de cargas -Los daemon sets es una forma de asegurarse de que exista **una copia de un pod -en cada nodo**. Esto es ideal para aplicaciones de monitoreo, como logs, o estadísticas. +Los daemon sets es una forma de asegurarse de que exista **una copia de un pod en cada nodo**. +Esto es ideal para aplicaciones de monitoreo, como logs, o estadísticas. **Es imposible crear daemon sets desde kubectl**, su CLI, la única manera es a través de los manifest files. @@ -1131,16 +1134,6 @@ rng-5d8b6c4cff-cw955 1/1 Running 1 21h rng-bn5jj 1/1 Running 0 5m23s ``` -Podremos comprobar los endpoints con - -```bash -kubectl describe service -Endpoints: 10.244.0.2:80,10.244.0.20:80 -``` - -Cada service tiene los endpoints de los pods que se están ejecutando, de manera -que otros servicios puedan acceder. - ## 1.21 Despliegues de nuevas versiones controlados Al momento de realizar una actualización a una nueva versión, kubernetes se @@ -1392,8 +1385,9 @@ core. ### 1.24.3 Limites Los límites establecen los recursos máximos con los que cuenta un pod. Se -establecen a nivel kernel de Linux, si el pod excede el límite establecido, se -terminará el proceso. +establecen a nivel kernel de Linux. + +La diferencia entre requests y limits es que el requests es el mínimo, mientras que limits es el máximo, si excede memoria el kernel de linux lo matará, si es CPU simplemente no podrá superarlo. ```yaml resources: @@ -1569,7 +1563,7 @@ kustomize build . ``` -## 1.26 Volúmenes +## 1.26 Volúmenes y Statefulsets Un volumen nos permite compartir archivos entre diferentes pods o archivos en nuestro host que persisten incluso tras reinicios. @@ -1591,17 +1585,41 @@ información **entre contenedores del mismo pod**. Podemos automatizar todo el proceso de creación de discos con componentes de terceros, como digital ocean. +Primero especificamos donde deben montarse los volumenes y su nombre. + + +``` bash +spec: + template: + spec: + containers: + volumeMounts: + - mountPath: "/data" + name: +``` + +Para más tarde especificar las características como su storage e incluso el proveedor de cloud, en este caso Digital Ocean. + ```bash -volumeClaimTemplates: -- metadata: - name: - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - storageClassName: do-block-storage +spec: + volumeClaimTemplates: + - metadata: + name: + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + storageClassName: do-block-storage +``` + +Podemos obtener los statefulsets con: + +``` bash +kubectl get statefulsets +# o su abreviacion +kubectl get sts ``` ## 1.27 Namespaces @@ -1716,7 +1734,7 @@ kubectl config view --raw -o json "user": { "client-certificate-data": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJYnF5dENYZ..." } - } + ] } ``` @@ -2004,14 +2022,9 @@ kubectl get nodes ## 1.33 Recursos útiles -- [Blog de José Domingo sobre pods, deployments, replicaSet y otros - recursos](https://www.josedomingo.org/pledin/blog/) -- [Seguridad del dashboard de k8skubectl apply -f - kubernetes-dashboard.yml](http://link) -- [Implementar - kubernetes-dashboard](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/) -- [Configurar tests - healtcheckhttps://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/](http://link) -- Repositorio de Flux - https://github.com/weaveworks/flux +- [Blog de José Domingo sobre pods, deployments, replicaSet y otros recursos](https://www.josedomingo.org/pledin/blog/) +- [Seguridad del dashboard de k8skubectl apply -f kubernetes-dashboard.yml](http://link) +- [Implementar kubernetes-dashboard](https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/) +- [Configurar tests healtcheckhttps://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/](http://link) +- [Repositorio de Flux](https://github.com/weaveworks/flux) - [Juniper](https://www.juniper.net/documentation/en_US/day-one-books/topics/topic-map/kubernetes-basics.html) diff --git a/Notes/Nextjs/index.md b/Notes/Nextjs/index.md index e0922ec..72780e2 100644 --- a/Notes/Nextjs/index.md +++ b/Notes/Nextjs/index.md @@ -984,7 +984,7 @@ export default function App({ Component, pageProps: { session, pageProps } }: Ap ``` -Si estás usando el nuevo modelo de app route puedes agregar este session provider de la siguiente manera dentro de una carpeta llamada components dentro de app: +Si estás usando el nuevo modelo de app router puedes agregar este session provider de la siguiente manera dentro de una carpeta llamada components dentro de app: ```javascript // mark as client component @@ -1044,9 +1044,9 @@ const options: NextAuthOptions = { export default NextAuth(options) ``` -En caso de que estés usando el nuevo modelo de App Route crea un archivo en *app/api/auth/[…nextauth]/route.ts*. NextAuth recibirá como único parámetro las opciones de autenticación, tal cual las recibe el bloque de código anterior. +En caso de que estés usando el nuevo modelo de App Router crea un archivo en *app/api/auth/[…nextauth]/route.ts*. NextAuth recibirá como único parámetro las opciones de autenticación, tal cual las recibe el bloque de código anterior. -Y los exportamos como GET y POST para que sea compatible con el modelo App Route de Nextjs +Y los exportamos como GET y POST para que sea compatible con el modelo App Router de Nextjs ``` javascript import NextAuth from "next-auth" @@ -1063,6 +1063,64 @@ a los diferentes métodos de autenticación. Hay muchos proveedores de autenticación que se encuentran disponibles en la [documentación de NextAuth](https://next-auth.js.org/configuration/providers#oauth-providers) +## El nuevo modelo App Router + +Este nuevo modelo cuenta con una serie de cambios, por ejemplo que ahora los components por defecto se ejecutan en el servidor, por lo que si queremos un componente que se ejecute en el cliente debemos agregar el string "use client" al principio su archivo correspondiente. + +``` javascript +"use client" +``` + +Otro cambio es que el componente Head que provee next para la metadata es inservible. En su lugar debemos exportar una variable llamada metadata, la cual se encargará de crear automáticamente las etiquetas, las opciones corresponden a etiquetas definidas, por lo que considera leer la documentación. + +``` javascript +import type { Metadata } from "next"; + +export const metadata = { + title: '', + applicationName: '', + authors: '', + category: '', + openGraph: { + type: '', + publishedTime: '', + section: '', + title: '', + tags: [], + description: '', + }, + } +``` + +### Parallel routes o rutas paralelas + +Podemos manejar cada sección de una página de manera individual, de forma que si falla o está cargando podamos mostrar ese estado solo en esa sección + +``` bash +@component + loading.ts + error.ts + page.ts +layout.ts +``` + +Donde loading representa el componente a renderizar si la sección está cargando y error se renderizará si hay un error. Estos componentes se pasarán como si fueran props al componente padre. + +``` javascript +// Layout.ts +export default function Layout({component}){return } +``` + +Por supuesto page tendrá que ser una función asíncrona + +``` javascript +//page.ts +export default async Component(){ + await fn() + return +} +``` + ## 1.6 Autenticación manual Provider usa oauth por debajo para manejar la autenticación. Si @@ -1516,6 +1574,10 @@ const config = { } ``` +### locales en contentful + +Podemos crear traducciones en la sección Content de Contentful. + En contenful podemos crear locales en settings\>locale. El valor de fallback será el valor por defecto, si no tenemos todas las traducciones del locale activado, usará este. @@ -1527,6 +1589,8 @@ nuestra consulta. getItemCollection (limit: 10, skip: 100, locale: "es"){} ``` +### locales en SSR + La función getStaticProps recibe el parámetro locale que fijamos en nextjs.config.js, por lo que si queremos especificarlo de acuerdo a la url @@ -1537,9 +1601,7 @@ export const getStaticProps: GetStaticProps = async ({ locale }) => { } ``` -Podemos crear traducciones en la sección Content de Contentful. - -## 1.6 i18n en páginas dinámicas +## 1.6 i18n en páginas dinámicas en SSG Para usar i18n en páginas dinámicas necesitamos generar los paths correspondientes por cada locale existente, junto con sus respectivos @@ -1741,6 +1803,8 @@ export function componente(){ * [4.11-Sensitive-data-exposure](<4.11-Sensitive-data-exposure.md>) * [4.12-Token-firmados-y-encriptados-en-Nextjs](<4.12-Token-firmados-y-encriptados-en-Nextjs.md>) * [4.13-OWASP](<4.13-OWASP>) + + ## 1.1 A1: Injection Es el agregar parte de una consulta para crear instrucciones extras que diff --git a/Notes/Postgres/index.md b/Notes/Postgres/index.md index cd36ab0..4ec6278 100644 --- a/Notes/Postgres/index.md +++ b/Notes/Postgres/index.md @@ -905,5 +905,10 @@ ALTER TABLE DROP CONSTRAINT ; ``` +## FLujo para crear una base de datos con usuario y password cifrado - +``` sql +CREATE DATABASE yourdbname; +CREATE USER youruser WITH ENCRYPTED PASSWORD 'yourpass'; +GRANT ALL PRIVILEGES ON DATABASE yourdbname TO youruser; +``` diff --git a/Notes/ReactQuery/index.md b/Notes/ReactQuery/index.md index 9ec60f8..9f3e3ed 100644 --- a/Notes/ReactQuery/index.md +++ b/Notes/ReactQuery/index.md @@ -292,7 +292,8 @@ const queryClient = useQueryClient() queryClient.setQueryData(["", ""], data) ``` -Para actualizar múltiples queries se usa el método *setQueriesData*. ## Paginación +Para actualizar múltiples queries se usa el método *setQueriesData*. +## Paginación Para llevar a cabo la paginación es importante colocar la página dentro de la *queryKey* y usar *keepPreviousData*. diff --git a/Notes/SitiosWebUtiles/index.md b/Notes/SitiosWebUtiles/index.md index 9c8f9c9..f7a6e0a 100644 --- a/Notes/SitiosWebUtiles/index.md +++ b/Notes/SitiosWebUtiles/index.md @@ -75,6 +75,9 @@ ## SAAS-starter-kit - [StarterSaas](https://www.startersaas.com/) +- [opensaas](https://opensaas.sh) +- [Next-SaaS](https://github.com/mickasmt/next-saas-stripe-starter) +- [Saas-Starter-Kit](https://github.com/Saas-Starter-Kit) ## Ventanas de código