[
  {
    "content": "Nextcloud Tabla de contenidos Configuración de tu propio servidor Nextcloud ",
    "description": "",
    "tags": null,
    "title": "Nextcloud",
    "uri": "/technological_sovereignty/sefl-hosted/nextcloud/"
  },
  {
    "content": "En esta entrada se definirán los conceptos básicos e introductorios de Kubernetes. Las fuentes principales de la información a continuación son el curso de Introduction to Kubernetes de The Linux Foundation en edX, cuyos autores son Chris Pokorni y Neependra Khare, y la propia documentación de Kubernetes.\n¿Qué es Kubernetes y por qué se utiliza? Kubernetes o “K8s” es una plataforma portable y extensible de código libre, bajo la licencia Apache 2.0, para administrar cargas de trabajo y servicios. Sirve para la automatización del despliegue, ajuste de escala y manejo de aplicaciones en contenedores​ que fue originalmente diseñado por Google y donado a la Cloud Native Computing Foundation (parte de la Linux Foundation). Soporta diferentes entornos para la ejecución de contenedores, incluido Docker 1.\nActualmente, se tiende a una ejecución de procesos en lo que se conoce como “nube”. Aunque, por otra parte, se precede de un modelo conocido como monolítico donde se tienen principios de arquitectura software obsoletos, con grandes componentes programados en lenguajes de programación antiguos y todo el sistema desplegado requiriendo un hardware caro y costoso de manejar.\nPor lo tanto, la tendencia actual es separar y simplificar cada componente software para convertirlos en componentes distribuidos, descritos por sus respectivas características específicas. De manera que se crean microservicios que se acomplan unos con otros y fáciles de reemplazar o reubicar. La arquitectura de microservicios está alineada con los principios de la arquitectura dirigida por eventos (EDA) y de la arquitectura orientada a servicios (SOA).\nCada microservicio se desarrolla en un lenguaje de programación moderno, seleccionado para ser el más adecuado para el tipo de servicio y su función. Esto ofrece una gran flexibilidad al combinar microservicios con hardware específico cuando sea necesario, lo que permite implementaciones en hardware básico de bajo costo. Aunque la naturaleza distribuida de los microservicios agrega complejidad a la arquitectura, uno de los mayores beneficios de los microservicios es la escalabilidad. Con la aplicación general volviéndose modular, cada microservicio se puede escalar individualmente, ya sea de forma manual o automatizada a través del autoescalado basado en la demanda. Además, prácticamente no hay tiempo de inactividad ni interrupción del servicio para los clientes porque las actualizaciones se implementan sin problemas, un servicio a la vez, en lugar de tener que volver a compilar, reconstruir y reiniciar una aplicación monolítica completa 2.\nResumiendo, estos microservicios se despliegan en contenedores y kubernetes es un orquestador de contenedores. Por lo tanto, para comprender qué es kubernetes, es necesario revisar los conceptos básicos sobre contendores y orquestadores de contenedores.\n¿Qué son los contenedores? Los contenedores son espacios virtuales a nivel del sistema operativo que agrupan el código de una aplicación con las bibliotecas y los archivos de configuración asociados, junto con las dependencias necesarias para que la aplicación se ejecute. Ofrecen escalabilidad y alto rendimiento a las aplicaciones en cualquier infraestructura que se elija. Son los más adecuados para ofrecer microservicios al proporcionar entornos virtuales portátiles y aislados para que las aplicaciones se ejecuten sin interferencias de otras aplicaciones en ejecución.\nBeneficios de usar contenedores Los beneficios de usar contenedores incluyen 3:\nÁgil creación y despliegue de aplicaciones: Mayor facilidad y eficiencia al crear imágenes de contenedor en vez de máquinas virtuales. Desarrollo, integración y despliegue continuo: Permite que la imagen de contenedor se construya y despliegue de forma frecuente y confiable, facilitando los rollbacks debido a que la imagen es inmutable. Separación de tareas entre Dev y Ops: Puedes crear imágenes de contenedor al momento de compilar y no al desplegar, desacoplando la aplicación de la infraestructura. Observabilidad: No solamente se presenta la información y métricas del sistema operativo, sino la salud de la aplicación y otras señales. Consistencia entre los entornos de desarrollo, pruebas y producción: La aplicación funciona igual en un laptop y en la nube. Portabilidad entre nubes y distribuciones: Funciona en Ubuntu, RHEL, CoreOS, tu datacenter físico, Google Kubernetes Engine y todo lo demás. Administración centrada en la aplicación: Eleva el nivel de abstracción del sistema operativo y el hardware virtualizado a la aplicación que funciona en un sistema con recursos lógicos. Microservicios distribuidos, elásticos, liberados y débilmente acoplados: Las aplicaciones se separan en piezas pequeñas e independientes que pueden ser desplegadas y administradas de forma dinámica, y no como una aplicación monolítica que opera en una sola máquina de gran capacidad. Aislamiento de recursos: Hace el rendimiento de la aplicación más predecible. Utilización de recursos: Permite mayor eficiencia y densidad. ¿Qué son los orquestadores de contenedores? En entornos de desarrollo, la ejecución de contenedores en un solo host para el desarrollo y la prueba de aplicaciones puede ser una opción. Sin embargo, al migrar a entornos de control de calidad (QA) y producción (Prod), ya no es una opción viable porque las aplicaciones y los servicios deben cumplir con requisitos específicos 2:\nTolerancia a fallos. Escalabilidad bajo demanda. Uso óptimo de recursos. Descubrimiento automático para descubrir y comunicarse automáticamente entre componentes. Accesibilidad desde el mundo exterior. Actualizaciones o parches de seguridad sin interrupciones sin tiempo de inactividad. Los orquestadores de contenedores son herramientas que agrupan sistemas para formar clústeres en los que la implementación y la administración de contenedores se automatizan a escala y cumplen los requisitos mencionados anteriormente.\nExisten varias soluciones de orquestadores de contenedores y algunos de los disponibles son:\nAmazon Elastic Container Service (ECS). Azure Container Instances. Azure Service Fabric. Kubernetes. Marathon. Nomad. Docker Swarm. Aunque sea viable mantener algún contenedor manualmente, los orquestadores facilitan mucho la administración a los operadores, principalmente cuando se trata de cientos o miles de contenedores. La mayoría de los orquestadores de contenedores pueden realizar las siguientes acciones 2:\nAgrupar hosts mientras se crea un clúster. Programar contenedores para que se ejecuten en hosts del clúster según la disponibilidad de recursos. Permitir que los contenedores de un clúster se comuniquen entre sí independientemente del host en el que estén implementados en el clúster. Vincular contenedores y recursos de almacenamiento. Agrupar conjuntos de contenedores similares y vincularlos a construcciones de equilibrio de carga para simplificar el acceso a las aplicaciones en contenedores, creando un nivel de abstracción entre los contenedores y el usuario. Gestionar y optimizar el uso de recursos. Permitir la implementación de políticas para proteger el acceso a las aplicaciones que se ejecutan dentro de los contenedores. Con todas estas características, configurables pero flexibles, los orquestadores de contenedores son una buena opción cuando se trata de administrar aplicaciones en contenedores a gran escala.\nCaracterísticas de Kubernetes Kubernetes ofrece un conjunto muy amplio de funciones para la orquestación de contenedores. Sus principales características son 2:\nEmpaquetado automático de contenedores: Kubernetes programa automáticamente los contenedores en función de las necesidades y limitaciones de los recursos, para maximizar la utilización sin sacrificar la disponibilidad.\nAutocuración: Kubernetes reemplaza y reprograma automáticamente los contenedores de los nodos fallidos. Elimina y reinicia los contenedores que no responden a las comprobaciones de estado, según las reglas o políticas existentes. También evita que el tráfico se enrute a contenedores que no responden.\nEscalabilidad horizontal: Con Kubernetes, las aplicaciones se escalan de forma manual o automática según la CPU o el uso de métricas personalizadas.\nDescubrimiento de servicios y equilibrio de carga: Los contenedores reciben sus propias direcciones IP de Kubernetes, mientras que este asigna un único nombre de sistema de nombres de dominio (DNS) a un conjunto de contenedores para ayudar a equilibrar la carga de las solicitudes en todos los contenedores del conjunto.\nImplementaciones y restauraciones automatizadas: Kubernetes implementa y restaura las actualizaciones de la aplicación y los cambios de configuración sin problemas, monitoreando constantemente el estado de la aplicación para evitar cualquier tiempo de inactividad.\nGestión de secretos y configuraciones: Kubernetes administra los datos confidenciales y los detalles de la configuración de una aplicación por separado de la imagen del contenedor, para evitar una reconstrucción de la imagen respectiva. Los secretos consisten en la información sensible o confidencial que se pasa a la aplicación sin revelar el contenido sensible a la configuración del código.\nOrquestación de almacenamiento: Kubernetes monta automáticamente soluciones de almacenamiento definido por software (SDS) en contenedores de almacenamiento local, proveedores de nube externos, almacenamiento distribuido o sistemas de almacenamiento en red.\nEjecución por lotes: Kubernetes admite la ejecución por lotes, trabajos de larga ejecución y reemplaza los contenedores fallidos.\nLa arquitectura de Kubernetes es modular e interconectable. No solo organiza aplicaciones de tipo microservicios como módulos desacoplados, sino que también su arquitectura sigue patrones de microservicios desacoplados. Las funcionalidades de Kubernetes se puede ampliar escribiendo recursos personalizados, operadores, API personalizadas, reglas de programación o extensiones.\nWikipedia, Kubernetes ↩︎\nedX, Introduction to kubernetes - The Linux Foundation. ↩︎ ↩︎ ↩︎ ↩︎\nDocumentación Kubernetes, ¿Qué es Kubernetes? ↩︎\n",
    "description": "Teoría básica para empezar con kubernetes.",
    "tags": [
      "kubernetes",
      "devops"
    ],
    "title": "Introducción a Kubernetes",
    "uri": "/sysadmin/kubernetes/introduccion_a_kubernetes/"
  },
  {
    "content": "Proyectos interesantes Bases de conocimiento Tinfolismo.org: es una base de conocimiento colaborativa por personas preocupadas por las derivas antihumanas de la tecnología y el mundo digital. Queremos recopilar recursos para la defensa de los derechos digitales y el ejercicio de la libertad, así como guías de elección y autoalojamiento de servicios, guías de mínimos datos y cronologías de sucesos contrarios a la democracia, a los derechos humanos y a la ética cívica. Asistentes de voz Sebastian: un prototipo español para complementar los asistentes de voz Desgooglelización de Internet DE-GOOGLE-IFY INTERNET ¿Cuál es el problema?\nLos gigantes de la web son tan poderosos que ejercen un dominio técnico, económico, cultural y político sobre nuestras sociedades. Estas dominaciones plantean muchos problemas para nuestras libertades:\nEl capitalismo de la vigilancia Deriva democrática Cierre a una visión única de la sociedad Centralización de los datos y de la atención ¿Cuál es la solución?\nLas comunidades de software libre ofrecen alternativas éticas a las plataformas centralizadas por los gigantes de la web: es posible encontrar servicios de confianza que respeten nuestra privacidad. Deconstruir y cambiar nuestros hábitos digitales también significa hacer esfuerzos en el día a día. Aquí tienes algunos enlaces que te ayudarán en tu emancipación:\nEncontrar un alojamiento web de confianza con los CHATONS\nUtilizar un servicio gratuito ofrecido por Framasoft o por los CHATONS\nEncontrar un software gratuito con Framalibre (sólo en francés)\nUtilizar las redes sociales descentralizadas en el Fediverso\nProyecto artístico Fango\nLibros El enemigo conoce el sistema, Marta Peirano: Todo lo que no quieres pero necesitas saber sobre el poder, la economía, la sociedad y las telecomunicaciones en la era de la información. La red no es libre, ni abierta ni democrática. Es un conjunto de servidores, conmutadores, satélites, antenas, routers y cables de fibra óptica controlados por un número cada vez más pequeño de empresas. Es un lenguaje y una burocracia de protocolos que hacen que las máquinas hablen, normas de circulación que conducen el tráfico, microdecisiones que definen su eficiencia. Si la consideramos un único proyecto llamado internet, podemos decir que es la infraestructura más grande jamás construida, y el sistema que define todos los aspectos de nuestra sociedad. Y sin embargo es secreta. Su tecnología está oculta, enterrada, sumergida o camuflada; sus algoritmos son opacos; sus microdecisiones son irrastreables. Los centros de datos que almacenan y procesan la información están ocultos y protegidos por armas, criptografía, propiedad intelectual y alambre de espino. La infraestructura crítica de nuestro tiempo está fuera de nuestra vista. No podemos comprender la lógica, la intención y el objetivo de lo que no vemos. Todas las conversaciones que tenemos sobre esa infraestructura son en realidad conversaciones sobre su interfaz, un conjunto de metáforas que se interpone entre nosotros y el sistema. Un lenguaje diseñado, no para facilitar nuestra comprensión de esa infraestructura, sino para ofuscarla. El enemigo conoce el sistema pero nosotros no. Este libro te ayudará a conocerlo, y a comprender por qué la herramienta más democratizadora de la historia se ha convertido en una máquina de vigilancia y manipulación de masas al servicio de regímenes autoritarios. Solo así podremos convertirla en lo que más falta nos hace: una herramienta para gestionar la crisis que se avecina de la manera más humana posible. No tenemos un segundo que perder.\nLa era del capitalismo de la vigilancia, Shoshana Zuboff: En esta obra magistral por la originalidad de las ideas y las investigaciones en ella expuestas, Shoshana Zuboff nos revela el alarmante fenómeno que ella misma ha denominado «capitalismo de la vigilancia». Está en juego algo de la máxima importancia: toda una arquitectura global de modificación de la conducta amenaza con transfigurar la naturaleza humana misma en el siglo XXI de igual modo a como el capitalismo industrial desfiguró el mundo natural en el siglo XX.\nGracias al análisis de Zuboff, cobran gráficamente vida para nosotros las consecuencias del avance del capitalismo de la vigilancia desde su foco de origen en Silicon Valley hacia todos los sectores de la economía. Hoy se acumula un enorme volumen de riqueza y poder en unos llamados «mercados de futuros conductuales» en los que se compran y se venden predicciones sobre nuestro comportamiento, y hasta la producción de bienes y servicios se supedita a un nuevo «medio de modificación de la conducta».\nLa amenaza que se cierne sobre nosotros no es ya la de un Estado «Gran Hermano» totalitario, sino la de una arquitectura digital omnipresente: un «Gran Otro» que opera en función de los intereses del capital de la vigilancia. El exhaustivo y turbador análisis de Zuboff pone al descubierto las amenazas a las que se enfrenta la sociedad del siglo XXI: una «colmena» controlada y totalmente interconectada que nos seduce con la promesa de lograr certezas absolutas a cambio del máximo lucro posible para sus promotores, y todo a costa de la democracia, la libertad y nuestro futuro como seres humanos.\nSin apenas resistencia en la legislación o en la sociedad, el capitalismo de la vigilancia va camino de dominar el orden social y determinar el futuro digital… si no se lo impedimos antes.\nLibros como “La Jaula de Confort”, “Tensión en la Red”, “Cultura Libre: Libertad y control en la era digital” de Esteban Magnani, todos con licencias libres.\nInfografía Colectivo Disonancia Fanzines Colectivo Disonancia ",
    "description": "",
    "tags": [
      "capitalismo de vigilancia",
      "derechos digitales"
    ],
    "title": "Capitalismo de vigilancia",
    "uri": "/privacy/capitalismo_de_vigilancia/"
  },
  {
    "content": "Preparar los ficheros para hacer un USB boot Descarga la imagen wget \u003curl-iso\u003e Quemar la imagen de Arch Una forma de quemar una imagen es con el comando dd como se muestra a continuación:\n# See the partitions lsblk # Umount the USB partition umount /dev/sda1 # Flash the ISO into USB sudo dd bs=4M if=archlinux-2022.05.01-x86_64.iso of=/dev/sda conv=fsync oflag=direct status=progress Random things Cómo crear USB Boot Con Multiples Sistemas Operativos | How to make a USB boot With Multiple OS ",
    "description": "",
    "tags": [
      "GNU/Linux"
    ],
    "title": "Creación de un USB Bootable",
    "uri": "/gnu_linux/usb_boot/"
  },
  {
    "content": "Productos respetuosos con la privacidad Purism ",
    "description": "",
    "tags": [
      "derechos digitales"
    ],
    "title": "Privacidad",
    "uri": "/privacy/privacidad/"
  },
  {
    "content": "GNU/Linux Primeros pasos para instalar, configurar and usar un sistema operativo GNU/Linux.\nTabla de Contenidos Creación de un USB Bootable Debian Instalación de Debian con volúmenes LVM cifrados con LUKS Configuración de Debian Instalación de Debian y ParrotOS con arranque dual en una partición cifrada con LUKS, volúmenes LVM y rEFInd Configuración del Plymouth Arch Instalación y configuración de Arch LineageOS Instalación de LineageOS Permisos en GNU/Linux ",
    "description": "",
    "tags": null,
    "title": "GNU/Linux",
    "uri": "/gnu_linux/"
  },
  {
    "content": "En esta entrada se definirán los componentes de la arquitectura de Kubernetes. Las fuentes principales de la información a continuación son el curso de Introduction to Kubernetes de The Linux Foundation en edX, cuyos autores son Chris Pokorni y Neependra Khare, y la propia documentación de Kubernetes.\nComponentes de la arquitectura en Kubernetes Un clúster de Kubernetes consta de un conjunto de máquinas trabajadoras, llamadas nodos, que ejecutan aplicaciones en contenedores. Cada clúster tiene al menos un nodo trabajador. En un nivel muy alto de abstracción, Kubernetes tiene los siguientes componentes principales:\nUno o más nodos maestros (master nodes), en la parte del plano de control (control plane). Uno o más nodos trabajadores (worker nodes). Se puede ver en la siguiente figura que es la arquitectura de los componentes de un cluster de Kubernetes 1:\nEl nodo maestro proporciona un entorno de ejecución para el plano de control responsable de administrar el estado de un clúster de Kubernetes y es el cerebro detrás de todas las operaciones dentro del clúster. Los componentes del plano de control son agentes con roles muy distintos en la gestión del clúster. Para comunicarse con el clúster de Kubernetes, los usuarios envían solicitudes al plano de control a través de una herramienta de interfaz de línea de comandos (CLI), un panel de interfaz de usuario web o una interfaz de programación de aplicaciones (API) 2.\nEs importante mantener el plano de control funcionando a toda costa. La pérdida del plano de control puede generar tiempo de inactividad, provocando la interrupción del servicio a los clientes, con una posible pérdida de negocio. Para garantizar la tolerancia a fallos del plano de control, se pueden agregar réplicas del nodo maestro al clúster, configuradas en modo de alta disponibilidad. Si bien solo uno de los nodos maestros está dedicado a administrar activamente el clúster, los componentes del plano de control permanecen sincronizados en las réplicas del nodo maestro. Este tipo de configuración agrega resistencia al plano de control del clúster, en caso de que falle el nodo maestro que está activo 2.\nPara conservar el estado del clúster de Kubernetes, todos los datos de configuración del clúster se guardan en etcd. etcd es un almacén de valores clave distribuido que solo contiene datos relacionados con el estado del clúster, sin datos de carga de trabajo del cliente. etcd se puede configurar en el nodo maestro (topología apilada) o en su host dedicado (topología externa) para ayudar a reducir las posibilidades de pérdida del almacén de datos al desacoplarlo de los otros agentes del plano de control 2.\nCon la topología de etcd apilada, las réplicas del nodo maestro de alta disponibilidad también garantizan la resistencia del almacén de datos de etcd. Sin embargo, ese no es el caso de la topología externa etcd, donde los hosts etcd deben replicarse por separado para alta disponibilidad, una configuración que introduce la necesidad de hardware adicional.\nUn nodo maestro ejecuta los siguientes componentes del plano de control 1:\nkube-apiserver o servidor API kube-scheduler o planificador kube-controller-manager o manejador de controladores etcd o almacén de datos Mientras que un nodo trabajador tiene los siguientes componentes:\nContainer Runtime o entorno de ejecución del contenedor kubelet o agente de nodo kube-proxy o proxy Addons o complementos para DNS, interfaz de usuario, monitoreo y registro a nivel de clúster Nodo maestro kube-apiserver Todas las tareas administrativas están coordinadas por kube-apiserver, un componente central del plano de control que se ejecuta en el nodo maestro. El servidor API recibe las peticiones RESTful de usuarios, operadores y agentes externos, luego las valida y las procesa. Durante el procesamiento, el servidor API lee el estado actual del clúster de Kubernetes del almacén de datos etcd y, después de la ejecución de una llamada, el estado resultante del clúster de Kubernetes se guarda en el almacén de datos distribuido de clave-valor para debida su persistencia. El servidor API es el único componente del plano de control que se comunica con el almacén de datos etcd, tanto para leer como para guardar la información del estado del clúster de Kubernetes, actuando como una interfaz intermedia para cualquier otro agente del plano de control que pregunte sobre el estado del clúster.\nEl servidor API es altamente configurable y personalizable. Puede escalar horizontalmente, pero también admite la adición de servidores API secundarios personalizados, una configuración que transforma el servidor API principal en un proxy para todos los servidores API personalizados secundarios y enruta todas las llamadas RESTful entrantes a ellos en función de reglas definidas personalizadas 2.\nkube-scheduler La función del kube-scheduler o planificador es asignar nuevos objetos de carga de trabajo, como pods, a los nodos. Durante el proceso de planificación, las decisiones se toman según el estado actual del clúster de Kubernetes y los requisitos del nuevo objeto. El planificador obtiene del almacén de datos etcd, a través del servidor API, los datos de uso de recursos para cada nodo trabajador en el clúster. El planificador también recibe del servidor API los requisitos del nuevo objeto que forman parte de sus datos de configuración. Los requisitos pueden incluir restricciones que los usuarios y operadores establezcan, como programar el trabajo en un nodo etiquetado con disk == ssd como par clave/valor. El planificador también tiene en cuenta los requisitos de calidad de servicio (QoS), la localidad de los datos, la afinidad, la antiafinidad, localización de datos dependientes, la tolerancia, la topología del clúster, etc. Una vez que todos los datos del clúster están disponibles, el algoritmo de planificación filtra los nodos con predicados para aislar los posibles nodos candidatos que luego son puntuados con prioridades para seleccionar el nodo que satisface todos los requisitos para la nueva carga de trabajo. El resultado del proceso de decisión se comunica al servidor API, que luego delega la implementación de la carga de trabajo con otros agentes del plano de control.\nEl planificador es altamente configurable y personalizable mediante políticas de planificación, complementos y perfiles. También se admiten planificadores adicionales personalizados. Un planificador es extremadamente importante y complejo en un clúster de Kubernetes de varios nodos 2.\nkube-controller-manager Componente del plano de control que ejecuta los controladores para regular el estado del clúster de Kubernetes. Los controladores son bucles de vigilancia que se ejecutan continuamente y comparan el estado deseado del clúster (proporcionado por los datos de configuración de los objetos) con su estado actual (obtenido del almacén de datos etcd a través del servidor API). En caso de una discrepancia, se toman medidas correctivas en el clúster hasta que su estado actual coincida con el estado deseado. Ejecuta controladores responsables de actuar cuando los nodos dejan de estar disponibles, para garantizar que el número de pods sean los esperados, para crear endpoints, cuentas de servicio y tokens de acceso a la API 2. Lógicamente cada controlador es un proceso independiente, pero para reducir la complejidad, todos se compilan en un único binario y se ejecuta en un mismo proceso. Estos controladores incluyen 1:\nControlador de nodos: es el responsable de detectar y responder cuándo un nodo deja de funcionar Controlador de replicación: es el responsable de mantener el número correcto de pods para cada controlador de replicación del sistema Controlador de endpoints: construye el objeto Endpoints, es decir, hace una unión entre los Services y los Pods Controladores de tokens y cuentas de servicio: crean cuentas y tokens de acceso a la API por defecto para los nuevos Namespaces. etcd Almacén de datos persistente, consistente y distribuido de clave-valor utilizado para almacenar toda a la información del clúster de Kubernetes 1. Los nuevos datos se añaden al almacén de datos, nunca se reemplazan. Los datos obsoletos se comprimen periódicamente para minimizar el tamaño del almacén de datos.\nDe todos los componentes del plano de control, solo el servidor API puede comunicarse con el almacén de datos etcd.\nLa herramienta de administración CLI de etcd, etcdctl, proporciona la opción de realizar copias de seguridad, instantáneas y restauraciones. Son especialmente útiles para un clúster de Kubernetes de única instancia de etcd, común en entornos de desarrollo y aprendizaje. Sin embargo, en los entornos Stage y Production, es extremadamente importante replicar los almacenes de datos en modo alta disponibilidad.\nAlgunas herramientas de arranque del clúster de Kubernetes, como kubeadm, aprovisionan nodos maestros etcd apilados, donde el almacén de datos se ejecuta junto con los otros componentes del plano de control en el mismo nodo maestro y los comparte con ellos 2.\nPara el aislamiento del almacén de datos de los componentes del plano de control, el proceso de arranque se puede configurar para una topología etcd externa. El almacén de datos se despliega en un host dedicado separado del plano de control, reduciendo así las posibilidades de un fallo del etcd 2.\nLas topologías de etcd apilado y externa admiten configuraciones de alta disponibilidad. etcd se basa en protocolo de consenso Raft que permite que un conjunto de máquinas pueda sobrevivir al fallo de algunas de ellas, incluido a fallos de nodo maestro. En un momento dado, uno de los nodos del grupo será el maestro y el resto serán los seguidores 2.\netcd está escrito en el lenguaje de programación Go. En Kubernetes, además de almacenar el estado del clúster, etcd también se usa para almacenar detalles de configuración como subredes, ConfigMaps, Secrets, etc.\nNodo trabajador Un nodo trabajador proporciona un entorno de ejecución para las aplicaciones cliente. Aunque son microservicios en contenedores, estas aplicaciones están encapsuladas en pods, controlados por los agentes del plano de control del clúster que se ejecutan en el nodo maestro. Los pods se programan en los nodos trabajadores, donde encuentran los recursos informáticos, de memoria y de almacenamiento necesarios para ejecutarse, y las redes para comunicarse entre sí y con el mundo exterior. Un pod es la unidad de programación más pequeña de Kubernetes. Es una colección lógica de uno o más contenedores programados juntos, y la colección se puede iniciar, detener o reprogramar como una sola unidad de trabajo.\nAdemás, en un clúster de Kubernetes de varios trabajadores, el tráfico de red entre los usuarios del cliente y las aplicaciones en contenedores implementadas en Pods lo manejan directamente los nodos trabajadores y no se enruta a través del nodo maestro 2.\nContainer Runtime Aunque Kubernetes se describe como un “motor de orquestación de contenedores”, no tiene la capacidad de manejar contenedores directamente. Para administrar el ciclo de vida de un contenedor, Kubernetes requiere un entorno de ejecución del contendor en el nodo donde se programará un Pod y sus contenedores. Kubernetes admite muchos entornos de ejecución de contenedores 2:\nDocker: aunque es una plataforma de contenedores que usa containerd como entorno de ejecución de contenedor, es más popular usado con Kubernetes CRI-O: un entorno de ejecución de contenedor ligero para Kubernetes, también admite registros de imágenes de Docker containerd: un entorno de ejecución de contenedor simple y portátil que proporciona robustez frakti: un tiempo de ejecución de contenedor basado en hipervisor para Kubernetes kubelet El kubelet es un agente que se ejecuta en cada nodo y se comunica con los componentes del plano de control desde el nodo maestro. Recibe definiciones de pod, principalmente del servidor API, e interactúa con el entorno de ejecución del contenedor en el nodo para ejecutar contenedores asociados con el pod. También supervisa el estado y los recursos de los contenedores que ejecutan pods. El agente kubelet toma un conjunto de especificaciones de Pod, llamados PodSpecs, que han sido creados por Kubernetes y garantiza que los contenedores descritos en ellos estén funcionando y en buen estado.\nEl kubelet se conecta a los entornos de ejecución del contenedor a través de un complemento basado en el Container Runtime Interface (CRI). El CRI consta de protocolos de búferes, API de gRPC, bibliotecas y especificaciones y herramientas adicionales que se encuentran actualmente en desarrollo. Para conectarse a tiempos de ejecución de contenedores intercambiables, kubelet utiliza una aplicación de compensación que proporciona una capa de abstracción clara entre kubelet y el tiempo de ejecución del contenedor.\nObtenido de blog.kubernetes.io\nComo se muestra arriba, el kubelet que actúa como cliente grpc se conecta al shim CRI, que a su vez, actúa como servidor grpc para realizar operaciones en el contenedor y la imagen. El CRI implementa dos servicios: ImageService y RuntimeService. ImageService es responsable de todas las operaciones relacionadas con la imagen, mientras que RuntimeService es responsable de todas las operaciones relacionadas con el pod y el contenedor 2.\nkube-proxy El kube-proxy es el agente de red que se ejecuta en cada nodo responsable de las actualizaciones dinámicas y el mantenimiento de todas las reglas de red en el nodo. Extrae los detalles de la red de Pods y reenvía las solicitudes de conexión a los Pods.\nEl proxy kube es responsable del reenvío de transmisiones TCP, UDP y SCTP o el reenvío por turnos a través de un conjunto de backends de pod, e implementa reglas de reenvío definidas por los usuariosa través de objetos de API de servicio 2.\nAddons Los complementos son características y funcionalidades del clúster que aún no están disponibles en Kubernetes, por lo que se implementan a través de pods y servicios de terceros 2.\nDNS: el DNS del clúster es un servidor DNS necesario para asignar registros DNS a objetos y recursos de Kubernetes\nDashboard: una interfaz de usuario basada en web de propósito general para la administración de clústeres\nMonitorización: recopila métricas de contenedores a nivel de clúster y las guarda en un almacén de datos central\nRegistro: recopila registros de contenedores a nivel de clúster y los guarda en un almacén de registros central para su análisis.\nDesafíos de red Las aplicaciones basadas en microservicios desacoplados dependen en gran medida de las redes para imitar el acoplamiento estrecho que alguna vez estuvo disponible en la era monolítica. Las redes, en general, no son las más fáciles de entender e implementar. Kubernetes no es una excepción: como orquestador de microservicios en contenedores, debe abordar algunos desafíos de redes distintos 2:\nComunicación de contenedor a contenedor dentro de los pods Comunicación de pod a pod en el mismo nodo y en todos los nodos del clúster Comunicación Pod-to-Service dentro del mismo espacio de nombres y entre espacios de nombres de clústeres Comunicación externa al servicio para que los clientes accedan a aplicaciones en un clúster. De contenedor a contenedor dentro de los pods Al hacer uso de las funciones de virtualización del kernel del sistema operativo host subyacente, un entorno de ejecución de contenedor crea un espacio de red aislado para cada contenedor que inicia. En Linux, este espacio de red aislado que se denomina network namespace. Un network namespace se puede compartir entre contenedores o con el sistema operativo del host.\nCuando se inicia un pod, el Container Runtime inicializa un contenedor de pausa especial con el único propósito de crear un espacio de nombres de red para el pod. Todos los contenedores adicionales, creados a través de solicitudes de usuarios, que se ejecutan dentro del Pod compartirán el espacio de nombres de red del contenedor Pause para que todos puedan comunicarse entre sí a través de localhost.\nDe pod a pod a través de nodos En un clúster de Kubernetes, los pods se programan en los nodos de una manera casi impredecible. Independientemente de su nodo host, se espera que los pods puedan comunicarse con todos los demás pods del clúster, todo esto sin la implementación de la traducciones de direcciones de red (NAT). Este es un requisito fundamental de cualquier implementación de redes en Kubernetes.\nEl modelo de red de Kubernetes tiene como objetivo reducir la complejidad y trata a los Pods como VM en una red, donde cada VM está equipada con una interfaz de red, por lo que cada Pod recibe una dirección IP única. Este modelo se llama “IP por pod” y garantiza la comunicación de pod a pod, al igual que las máquinas virtuales pueden comunicarse entre sí en la misma red.\nSin embargo, no nos olvidemos de los contenedores. Comparten el espacio de nombres de la red del Pod y deben coordinar la asignación de puertos dentro del Pod tal como lo harían las aplicaciones en una VM, todo mientras pueden comunicarse entre sí en localhost, dentro del Pod. Sin embargo, los contenedores se integran con el modelo de red general de Kubernetes mediante el uso de Container Network Interface (CNI) compatible con los complementos CNI. CNI es un conjunto de una especificación y bibliotecas que permiten a los complementos configurar la red para contenedores. Si bien hay algunos complementos principales, la mayoría de los complementos CNI son soluciones de redes definidas por software (SDN) de terceros que implementan el modelo de redes de Kubernetes. Además de abordar el requisito fundamental del modelo de red, algunas soluciones de red ofrecen soporte para políticas de red. Flannel, Weave, Calico son solo algunas de las soluciones SDN disponibles para los clústeres de Kubernetes.\nDe Pod al mundo exterior Una aplicación implementada con éxito en contenedores que se ejecuta en pods dentro de un clúster de Kubernetes puede requerir accesibilidad desde el mundo exterior. Kubernetes permite la accesibilidad externa a través de Servicios, encapsulaciones complejas de definiciones de reglas de enrutamiento de red almacenadas en iptables en nodos de clúster e implementadas por agentes de kube-proxy. Al exponer los servicios al mundo externo con la ayuda de kube-proxy, las aplicaciones se vuelven accesibles desde fuera del clúster a través de una dirección IP virtual.\nDocumentation Kubernetes, Kubernetes Components ↩︎ ↩︎ ↩︎ ↩︎\nedX, Introduction to kubernetes - The Linux Foundation ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎\n",
    "description": "Teoría básica para empezar con kubernetes.",
    "tags": [
      "kubernetes",
      "devops"
    ],
    "title": "Componentes de la arquitectura de Kubernetes",
    "uri": "/sysadmin/kubernetes/componentes_kubernetes/"
  },
  {
    "content": "Debian Tabla de Contenidos Instalación de Debian con volúmenes LVM cifrados con LUKS Configuración de Debian Instalación de Debian y ParrotOS con arranque dual en una partición cifrada con LUKS, volúmenes LVM y rEFInd Configuración del Plymouth ",
    "description": "",
    "tags": null,
    "title": "Debian",
    "uri": "/gnu_linux/debian/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para instalar y configurar Picroft en una Raspberry Pi.\nInstalación de la imagen Picroft en una tarjeta SD o un usb Mediante el siguiente comando se quema la imagen en una tarjeta SD o un USB.\nsudo dd bs=4M if=Picroft_v20.08_2020-09-07.img of=/dev/sda1 conv=fsync oflag=direct status=progress Una vez terminado, se introduce en una raspberry y se enciende conectada a un monitor, teclado, ratón y micrófono y auriculares (USB o jack, lo que se prefiera).\nConfiguración de Pycroft Se configura al inicio y es probable que no se escuche el audio por el auricular o altavoz debido a que por defecto está configurado ALSA en vez de pulseaudio. Para configurarlo correctamente, seguimos los siguientes pasos 1:\nConfiguramos picroft con el asistente de comandos mycroft-setup-wizard:\nLas opciones elegidas son: Salida: Altavoces vía 3.5 o USB Mic: Otro - No soportado\nLo más probable es que las pruebas fallen en esta etapa, esto es de esperar Una vez que llegue a la mycroft-cli y registre su dispositivo, es el momento de aplicar algunas actualizaciones.\na. Actualice la lista de paquetes sudo apt update b. Actualice los paquetes sudo apt upgrade -y c. Eliminar los paquetes no utilizados sudo apt autoremove -y d. Reinicie sudo reboot Cuando las cosas vuelvan a arrancar, es el momento de hacer funcionar el audio. Se puede hacer esto a través de SSH. a. Revise los dispositivos de audio por defecto pactl info b. Establecer el dispositivo de salida por defecto a la toma de auriculares pactl set-default-sink alsa_output.platform-bcm2835_audio.analog-stereo c. Verificar que los dispositivos por defecto son los correctos pactl info d. Indique a MyCroft que utilice el sistema de pulsos por defecto mycroft-config set listener.device_name \"pulse\" e. Reinicie sudo reboot Actualice el archivo /etc/mycroft/mycroft.conf a. Actualice las siguientes líneas: “play_wav_cmdline”: “aplay -Dhw:0,0 %1”, “play_mp3_cmdline”: “mpg123 -a hw:0,0 %1”,\nb. Para que se vea así: “play_wav_cmdline”: “aplay %1”, “play_mp3_cmdline”: “mpg123 %1”,\nActualiza la habilidad de DuckDuckGo msm install https://github.com/JarbasSkills/skill-ddg Cuando el sistema vuelva a estar en línea, ejecuta una prueba de mycroft-mic mycroft-mic-test Instalar habilidades adicionales mycroft-msm install fallback-aiml mycroft-msm install skill-finished-booting mycroft-msm install mycroft-spotify Asegúrese de que MyCroft emita un pitido cuando escuche la palabra “wake” - Debería devolver “true” mycroft-config set confirm_listening true Se puede ver la configuración por defecto de Mycroft en GitHub - MycroftAI/mycroft-core .\nInstalar raspotify (todavía tengo que conseguir que funcione) curl -sL https://dtcooper.github.io/raspotify/install.sh | sh Paquetes opcionales sudo apt install rustc libpulse-dev python3-venv libatlas-base-dev -y Picroft Setup Steps - Quick Setup - USB Mic/Headphones Output ↩︎\n",
    "description": "Instalación y configuración de Mycroft en una Raspberry mediante Picroft",
    "tags": [
      "raspberry pi",
      "mycroft",
      "picroft"
    ],
    "title": "Instalación y configuración de Mycroft en una Raspberry mediante Picroft",
    "uri": "/technological_sovereignty/raspberry/picroft/"
  },
  {
    "content": "En esta entrada se definen los primeros pasos a seguir con una Raspberry Pi sin necesidad de una pantalla o un cable HDMI. Es una configuración rápida y básica para poder empezar a cacharrear con el terminal.\n1. Instalación del SO Usando el programa Raspberry Pi Imager se puede quemar la imagen de Ubuntu, RaspberryPiOS, LibreElec o que prefieras, en cualquier tarjeta micro SD. 1\n2. Conexión WiFi Si prefieres no utilizar el cable HDMI para la configuración de la red, únicamente con modificar el archivo network-config con la siguiente configuración:\nwifis: wlan0: dhcp4: true optional: true access-points: \"SSID\": password: \"contraseña\" El SSID es el nombre de la red WiFi y no hace falta comillas, mientras que para la contraseña si que se necesitan comillas.\n3. Primera conexión Lo más sencillo es conectarse a través de SSH. Para ello es necesario saber cuál es la dirección IP que se asigna automáticamente mediante DHCP a la Raspberry. Se puede conocer a través de la interfaz web del router o realizando un escaneo de red con nmap.\nLa conexión se realiza mediante el siguiente comando:\nssh ubuntu@IP_máquina El usuario y contraseña por defecto son ubuntu\n4. Seguridad SSH 4.1. Configuración de SSH mediante llaves La diferencia de conectarse por SSH a un dispositivo mediante una contraseña o un par de llaves RSA es que la contraseña la puede conocer cualquiera y las llaves son personales e intransferibles 2. Por eso para generar un par de claves público-privada será a través del siguiente comando:\nssh-keygen -t rsa Nos pedirá una contraseña para usar la clave SSH y se crearán dos claves en el diretorio .ssh en el home del usuario. La clave privada será id_rsa, la cuál no habrá que compartirla nunca, y la pública id_rsa.pub.\nEn el siguiente paso es necesario copiar la clave pública al archivo ~/.ssh/authorized_keys de la RaspberryPi. Para ello se utilizará el siguiente comando:\nssh-copy-id -i ubuntu@\u003cip de la raspberry\u003e Ahora nos pedirá la contraseña de nuestra clave SSH y se conectará a la RaspberryPi.\nLo último que haremos en este apartado será restringir el acceso remoto con contraseñas. De esa manera sólo podrán conectarse remotamente aquellas personas que hayan subido previamente su llave SSH pública a la Raspberry Pi. Lo que tendremos que hacer es editar el archivo de configuración sshd_config`. Ejecutamos el siguiente comando en nuestra Raspberry Pi:\nsudo nano /etc/ssh/sshd_config Y en la línea PasswordAuthentication poner no:\nPasswordAuthentication no Guardamos los cambios y reiniciamos el servicio con:\nsudo service ssh restart 4.2. Cambio del puerto de las conexiones SSH Una buena práctica de seguridad es cambiar el puerto por defecto para las conexiones SSH (el puerto 22), ya que si intentan atacarnos probablemente prueben a conectarse por ese puerto. De esta manera, cambiando el puerto se reducirá considerablemente el numero de intentos de conexión por parte de posibles atacantes. Pueden elegir un número desde el 1024 hasta el 65535 si quieren. Pero primero debemos revisar que no haya otro servicio utilizando ese mismo puerto. Escribimos en la terminal:\nnetstat -punta | grep LISTEN Una vez comprobado que el puerto que elegimos está libre deben modificar el archivo de configuración de SSH:\nsudo nano /etc/ssh/sshd_config Cambien la línea #Port 22 por, por ejemplo, Port 2251 u otro puerto que prefieran y que no esté ocupado. Es importante que borren la almohadilla/gato/numeral porque si no el sistema lo interpreta como un comentario.\nGuarden, salgan y reinicien el servicio para que se haga efectivo el cambio en la configuración:\nsudo service ssh restart Cuidado, si hay un error en el cambio de puerto puede que se queden fuera de la servidora y pierdan la conexión por SSH que tenían. Es mejor si están físicamente cerca de la servidora en este paso.\nA partir de ahora para conectarse a la Raspberry Pi via SSH deberán especificar el puerto, porque ya no será el puerto por defecto. Así que el comando que deberán escribir de ahora en más será:\nssh -p 2251 ubuntu@\u003cdirección ip\u003e Si se se les olvida el puerto que pusieron o no saben si está abierto, pueden hacer un escaneo de puertos desde otra computadora con nmap así:\nsudo nmap -p 1-65535 -T4 -A -v \u003cip-servidora\u003e Nota: apartado copiado y reproducido de La_bekka, Seguridad de SSH - Parte IV: Securicemos nuestra servidora web 2.\nInstalación de Ubuntu en la Raspberry - Atareao ↩︎\nLa_bekka, Accedamos remotamente a la Raspberry Pi usando SSH - Parte II: ¡Hola maquinita! ↩︎ ↩︎\n",
    "description": "Instalación del SO, conexión WiFi y ssh",
    "tags": [
      "raspberry pi"
    ],
    "title": "Primeros pasos con una Raspberry Pi y Ubuntu server",
    "uri": "/technological_sovereignty/raspberry/ubuntu_server_raspberrypi/"
  },
  {
    "content": "Recursos útiles Repositorio colaborativo de Filosofía de la UNED Clases grabadas UNED ",
    "description": "Apuntes de ética I",
    "tags": [
      "Ética I"
    ],
    "title": "Etica I",
    "uri": "/philosophy/etica_i/"
  },
  {
    "content": "Teoría de señales En biología evolutiva, la teoría de señales o de señalización es un cuerpo de trabajo teórico que examina la comunicación entre individuos. La cuestión central se presenta cuando se debe esperar que los organismos con intereses en conflicto se comuniquen con honestidad (considerando que no hay una intención consciente) en lugar de deshonestamente. Los modelos matemáticos en los que los organismos señalan su condición a otros individuos como parte de una estrategia evolutivamente estable son importantes para la investigación en este campo.\nLas señales se dan en contextos tales como la selección de pareja por las hembras, lo cual somete a las señales de los machos a presión selectiva. Las señales evolucionan porque modifican el comportamiento del receptor para beneficiar al comunicador. Las señales pueden ser honestas, transmitiendo información que aumenta de manera la aptitud del receptor, o deshonestas. Un individuo puede engañar a otro al hacer una señal deshonesta, lo que podría beneficiar brevemente al comunicador, con el riesgo de socavar el sistema de señalización para toda la población.\nEjemplos:\nUn springbok o gacela saltarina (Antidorcas marsupialis) puede hacer una señal honesta a depredadores como los guepardos para indicar que es un individuo ágil y rápido, y por tanto no valdría la pena perseguirlo.\nTeoría de señales, Wikipedia\n",
    "description": "Notas sobre que todo ",
    "tags": [
      "Ética I"
    ],
    "title": "Teoría de Señales",
    "uri": "/philosophy/teoria_se%C3%B1ales/"
  },
  {
    "content": "Arch Tabla de Contenidos Instalación y configuración de Arch ",
    "description": "",
    "tags": null,
    "title": "Arch",
    "uri": "/gnu_linux/arch/"
  },
  {
    "content": "Raspberry Pi Tabla de Contenidos Instalación y configuración de Mycroft en una Raspberry mediante Picroft Primeros pasos con una Raspberry Pi y Ubuntu server Instalación y configuración de NextcloudPi Instalación y configuración de Debian, Ubuntu, RaspberryPiOS, LibreElec o Arch en una Raspbery Pi Configurar una Raspberry Pi para hacerla accesible desde internet Configuración de servidor DNS en una Raspbery Pi ",
    "description": "",
    "tags": null,
    "title": "Raspberry Pi",
    "uri": "/technological_sovereignty/raspberry/"
  },
  {
    "content": "Servicios Autoalojados Tabla de contenidos Nextcloud Configuración de tu propio servidor Nextcloud Despliegue de un servidor multimedia Jellyfin ",
    "description": "",
    "tags": null,
    "title": "Servicios Autoalojados",
    "uri": "/technological_sovereignty/sefl-hosted/"
  },
  {
    "content": "Soberanía Tecnológica Recopilación de herramientas Colección de herramientas para autoalojar CapRover Cloudron.io Sandstorm.io Tabla de contenidos Raspberry Pi Instalación y configuración de Mycroft en una Raspberry mediante Picroft Primeros pasos con una Raspberry Pi y Ubuntu server Instalación y configuración de NextcloudPi Instalación y configuración de Debian, Ubuntu, RaspberryPiOS, LibreElec o Arch en una Raspbery Pi Configurar una Raspberry Pi para hacerla accesible desde internet Configuración de servidor DNS en una Raspbery Pi Servicios Autoalojados Nextcloud Configuración de tu propio servidor Nextcloud Despliegue de un servidor multimedia Jellyfin ESP8266 Instalación y configuración de WLED en ESP8266 ",
    "description": "",
    "tags": null,
    "title": "Soberanía Tecnológica",
    "uri": "/technological_sovereignty/"
  },
  {
    "content": "En esta entrada se instalará y se configurará el sistema operativo Debian con volúmenes LVM cifrados con LUKS.\n¿Qué es Debian? Debian GNU/Linux es un sistema operativo libre, desarrollado por miles de voluntarios de todo el mundo, que colaboran a través de Internet.\nLa dedicación de Debian al software libre, su base de voluntarios, su naturaleza no comercial y su modelo de desarrollo abierto la distingue de otras distribuciones del sistema operativo GNU1.\n¿Qué es LVM (Logical Volume Manager)? LVM es una implementación de un gestor de volúmenes lógicos para el núcleo Linux. LVM incluye muchas de las características que se esperan de un administrador de volúmenes, incluyendo:\nRedimensionado de grupos lógicos Redimensionado de volúmenes lógicos Instantáneas de sólo lectura (LVM2 ofrece lectura y escritura) RAID0 de volúmenes lógicos. LVM no implementa RAID1 o RAID5, por lo que se recomienda usar software específico de RAID para estas operaciones, teniendo las LV por encima del RAID2. En esta configuración no se usará RAID.\n¿Qué es LUKS (Linux Unified Key Setup)? LUKS es una especificación de cifrado de disco creado por Clemens Fruhwirth, originalmente destinado para Linux. Mientras la mayoría del software de cifrado de discos implementan diferentes e incompatibles formatos no documentados, LUKS especifica un formato estándar en disco, independiente de plataforma, para usar en varias herramientas. Esto no sólo facilita la compatibilidad y la interoperabilidad entre los diferentes programas, sino que también garantiza que todas ellas implementen gestión de contraseñas en un lugar seguro y de manera documentada. La implementación de referencia funciona en Linux y se basa en una versión mejorada de cryptsetup, utilizando dm-crypt como la interfaz de cifrado de disco3.\nTabla de particiones Se utiliza el formato ext4 para las particiones porque mejora la velocidad de entrada y salida y utiliza menos CPU que los formatos ext3 y ext2. Se recomiendan como mínimo los siguientes valores:\nParticion Tamaño recomendado Asignado Debian Asignado Propio Contiene / \u003e= 750MB 22GB 64GB /etc, /bin, /sbin, /lib, /dev, /usr /usr \u003e= 4-6GB 0 0 Programas de usuario, lib y docs /var \u003e= 2-3GB 32GB 112GB Variables de datos como emails /tmp \u003e= 100MB 16GB 32GB Páginas web, caché de paquetes, datos temporales /home \u003e= 100MB 200GB 288GB Directorio con Documentos, Descargas, … /boot \u003e= 256MB 500MB 512GB Partición Primaria, ext4 o ext2, no se recomienda cifrarla /boot/efi \u003e= 100MB 250MB 0 No se recomienda cifrarla y bootable flag: on /swap \u003e= 8GB 16GB 16GB Área de intercambio Pasos seguidos Se recomienda conectar la máquina a través de ethernet para que se actualice el sistema durante la instalación.\nSe configura el idioma, región, teclado, etc. (Saltar paso) Se realiza unas particiones manuales, concretamente se realizan 3, una para /boot, otra para /boot/efi y otra para las demás particiones que irá cifrada a través de LUKS. Se cifra con LUKS y se elige una contraseña de más de 20 carácteres. Se crea un volumen LVM y posteriormente se realizan las particiones de volumen lógico para cada partición. Se asignan las etiquetas y se termina la configuración de las particiones. Se le da un hostname y se crea el usuario root y el usuario sin privilegios de administrador. Referencias recomendadas Arch Wiki, dm-crypt/Encrypting an entire system Debian Wiki, LVM Youtube, How to install Debian GNU/Linux with LUKS encrypted LVM Wikipedia, Debian ↩︎\nWikipedia, Logical Volume Manager (Linux) ↩︎\nWikipedia, LUKS (Linux Unified Key Setup) ↩︎\n",
    "description": "Instalación de Debian con volúmenes LVM cifrados con LUKS",
    "tags": [
      "GNU/Linux",
      "debian",
      "lvm",
      "cifrado"
    ],
    "title": "Instalación de Debian con volúmenes LVM cifrados con LUKS",
    "uri": "/gnu_linux/debian/install_debian/"
  },
  {
    "content": "Git Primeros pasos para utilizar git.\nTabla de Contenidos Comandos básicos de Git Gitflow ",
    "description": "",
    "tags": null,
    "title": "Git",
    "uri": "/development/git/"
  },
  {
    "content": "Hugo Primeros pasos para crear y desplegar un proyecto Hugo en las páginas de GitLab.\nTabla de Contenidos ",
    "description": "",
    "tags": null,
    "title": "Hugo",
    "uri": "/development/hugo/"
  },
  {
    "content": "En esta entrada se instalará y se configurará Nextcloud para una Raspberry Pi. Se utilizará la versión dockerizada nextcloudpi y se instalará sobre el sistema operativo HypriotOS.\n¿Qué es Nextcloud? Nextcloud es una serie de programas de código abierto, tanto el cliente como el servidor, con el objetivo de crear un servicio de alojamiento de archivos. Permite el alojamiento en un servidor propio, a modo de nube privada, para no tener la dependencia de nubes de terceros como Dropbox o Google Drive.\n¿Qué es Nextcloudpi? NextCloudPi es una instacia especial de Nextcloud que está adaptada y optimizada al hardware de las Raspberry Pi. De manera que garantiza la interacción más fluida posible de todos los componentes.\n¿Qué es HypriotOS? HypriotOS es un sistema operativo basado en Debian optimizado para ejecutar Docker en plataformas ARM como las Raspberry Pi.\nInstalación de HypriotOS En los siguientes pasos, se procede a quemar la imagen de HypriotOS en una tarjeta SD que esté conectada a un ordenador con sistema operativo GNU/Linux con distribuciones basadas en Debian o en Arch.\nFlasheo de la imagen Para quemar la imagen dentro de la tarjeta microSD, existen diversas maneras de hacerlo. Se recomienda utilizar la herramienta flash instalada de como se indica en su página de documentación:\nInstalación de la herramienta flash Distribuciones basadas en Debian: Se instala la herramienta con los siguientes comandos:\ncurl -LO https://github.com/hypriot/flash/releases/download/2.7.0/flash chmod +x flash sudo mv flash /usr/local/bin/flash Se instalan las dependencias con:\nsudo apt-get install -y pv curl python-pip unzip hdparm sudo pip install awscli Distribuciones basadas en Arch: La instalación más cómoda es instalar el paquete desde los repositorios oficiales de Arch. Para encontrar el paquete en el programa de añadir software buscar flash hypriot.\nQuema de la imagen en la tarjeta SD Una vez instalada la herramienta para quemar la imagen, se copia el enlace de la imagen ISO comprimida desde la página oficial de HypriotOS o se descarga la imagen. Durante el flasheo de la imagen, se puede realizar la configuración inicial del usuario y de la conexión WiFi. En caso de descargar la imagen es necesario verificar que el checksum es el mismo con los siguientes comandos:\nsha256sum hypriotos-rpi-v1.12.3.img.zip cat hypriotos-rpi-v1.12.3.img.zip.sha256 Una vez verificado el checksum se puede flasear la imagen con el comando a continuación. Aunque se recomienda leer y seguir la opción de configurar el WiFi antes de quemar la imagen.\nsudo flash hypriotos-rpi-v1.10.0.img.zip Para quemar la imagen con el enlace directo, ejecutar:\nsudo flash https://github.com/hypriot/image-builder-rpi/releases/download/v1.12.3/hypriotos-rpi-v1.12.3.img.zip Solicitará la ubicación de la partición de la tarjeta SD y una confirmación. Una vez termine el proceso, se introducirá la SD en la Raspberry Pi y ya está lista para usar.\nConfiguración del usuario inicial y WiFi Primer creamos un archivo llamado wifi.yaml con la siguiente plantilla, donde es necesario modificar el SSID del WiFi y la clave precompartida en texto plano o cifrada con wpa_passphrase SSID passwordWiFi. En caso de añadir la clave en texto plano será necesario ponerla entre comillas psk=\"ContraseñaWiFi\", mientras que si se añade cifrada no serán necesarias las comillas psk=jghXt58cfvfgbksFSJhoA. Para conseguir la contraseña cifrada es necesario ejecutar en un terminal wpa_passphrase \"NOMBRE_WIFI\" pedirá la contraseña en texto plano y devolverá la contraseña cifrada.\n#cloud-config # vim: syntax=yaml # # Set your hostname here, the manage_etc_hosts will update the hosts file entries as well hostname: hypriot manage_etc_hosts: true # You could modify this for your own user information users: - name: pi gecos: \"Hypriot Pirate\" sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash groups: users,docker,video,input plain_text_passwd: hypriot lock_passwd: false ssh_pwauth: true chpasswd: { expire: false } # # Set the locale of the system locale: \"es_ES.UTF-8\" # # Set the timezone # # Value of 'timezone' must exist in /usr/share/zoneinfo timezone: \"Europe/Madrid\" # # Update apt packages on first boot package_update: true package_upgrade: true package_reboot_if_required: true #package_upgrade: false # # Install any additional apt packages you need here packages: - software-properties-common # - python-software-properties # - xinput-calibrator # - console-data # - keyboard-configuration # - ntp # # WiFi connect to HotSpot # # - use `wpa_passphrase SSID PASSWORD` to encrypt the psk write_files: - content: | allow-hotplug wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp path: /etc/network/interfaces.d/wlan0 - content: | country=es ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid=\"NOMBRE_WIFI\" psk=\"ContraseñaWiFi\" proto=RSN key_mgmt=WPA-PSK pairwise=CCMP auth_alg=OPEN } path: /etc/wpa_supplicant/wpa_supplicant.conf # These commands will be ran once on first boot only runcmd: # Pickup the hostname changes - 'systemctl restart avahi-daemon' # # Activate WiFi interface - 'ifup wlan0' Una vez se haya descargado la imagen de HypriotOS y se haya configurado la platilla de configuración inicial guardada como wifi.yaml. Desde el mismo directorio que almacena los dos archivos ejecutamos:\nsudo flash --hostname hypriot --userdata wifi.yaml hypriotos-rpi-v1.12.3.img.zip Donde el flag --hostname sirve para cambiar el nombre de la máquina y el flag --userdata sirve para cargar la configuración inicial.\nSolicitará la ubicación de la partición de la tarjeta SD y una confirmación. Una vez termine el proceso, se introducirá la SD en la Raspberry Pi y ya está lista para usar.\nEn caso de querer cambiar el hostname después de la instalación, usar el siguiente comando:\nsudo hostnamectl set-hostname --static nuevohostname Además, para que sea un cambio persistenten es necesario modificar el archivo sudo nano /etc/cloud/cloud.cfg con lo siguiente:\npreserve_hostname: true Después comprobar que se ha cambiado el hostname en /etc/hostname y en /etc/hosts, si no es así modificarlo manualmente. Por último, reiniciar el sistema. Todo lo anterior es necesario debido a un error a partir de la versión de Hypriot 1.11 1.\nPrimer arranque de Raspberry Pi con HypriotOS Una vez instalado HypriotOS en la tarjeta SD, se introduce en la tarjeta en la Raspberry Pi y se conecta a la corriente de alimentación. Si se siguieron correctamento los pasos para preconfigurar el WiFi, al arrancar (tardará varios minutos, aproximadamente entr 5-10mins) será posible conectarse mediante SSH a la Raspberry Pi sin necesidad de conectar un cable RJ-45 (Ethernet) al router ni un teclado y monitor directamente a la máquina. Aunque a pesar de haber seguido correctamente los pasos antiores, se recomienda utilizar un teclado, un monitor y una conexión a internet mediante un cable Ethernet al router en el primer arranque. En caso de no tener monitor ni teclado, saltar a los pasos del apartado Localización de de la IP local de la Rasberry Pi y Acceso mediante ssh, leyendo los pasos anteriores para conocer las credenciales por defecto.\nIniciar sesión En caso de no haber utilizado, durante la instalación de hypriot, el flag –user-data con el fichero de configuración wifi.yaml, el usuario por defecto es pirate y la contraseña hypriot.\nEn caso de si haber utilizado el fichero de ejemplo, el usuario es pi y la contraseña hypriot.\nCambio de la contraseña por defecto Es obligatorio cambiar la contraseña del usuario por defecto (pirate) o del usuario creado con la configuración del archivo .yaml (pi) a partir de este punto.\nPara cambiar la contraseña se utiliza el comando:\npasswd Según el blog de HyriotOS 2, por motivos de seguridad no existe un usuario root construido por defecto.\nCambio de idioma de teclado Una vez conectado el monitor y el teclado USB, por defecto se ejecuta el teclado de US (Estados Unidos). Para cambiar al teclado ES (España), instalar el paquete console-data:\nsudo apt install console-data Se abrirá una pantalla gráfica con cuatro opciones, seleccionar la opción select keymap from full list. En la siguiente ventana seleccionar pc/qwerty/Spanish/Standard/CP850.\nAhora ya funcionarán todas las letras menos la ñ. Para poder usarla ejecutar:\nsudo loadkeys es Localización de la IP local de la Rasberry Pi Un método para conocer la IP de la Raspberry Pi, contectada a un monitor y un teclado, iniciar sesión con el usuario por defecto pirate(o el usuario de wifi.yaml, en el ejemplo es pi) y la contraseña por defecto hypriot. Una vez dentro, se ejecuta el comando:\nsudo ip addr show Primero ver a qué red local estamos conectados con el ordenador que queremos configurar la raspberry pi:\nsudo ip addr show ó\nsudo ifconfig Una vez que tengamos el rango de la subred (habitualmente siempre es por defecto la 192.168.1.0/24), realizamos un escaneo de red con nmap:\nsudo nmap -f 192.168.1.0/24 El flag -f es para realizar el escaneo rápido y poder averiguar la IP de la Raspberry mediante los dígitos fijos de la MAC del fabricante.\nUna vez terminado el escaneo, se mostrará una IP que la dirección MAC la identifique como un producto de la RaspberryPi Foundation.\nOtra opción para conocer la IP de la raspberry pi es a través de la interfaz web del router, accediendo mediante un navegador a http://192.168.1.1/. Solicitará la contraseña del router, por defecto siempre está escrita debajo del propio dispositivo o es admin o 1234). Dentro de la interfaz se debería de ver la IP asignada a la raspberry pi. Si se utiliza este método, se recomienda asignar una IP estática a la MAC de la raspberry pi para que siempre que se conecte al router se pueda acceder a través de la misma IP.\nAcceso mediante SSH Una vez se haya localizado la IP privada de la Raspberry y se conozca cuál es el usuario creado durante la instalación (usuario pirate y contraseña hypriot por defecto), ejecutamos lo siguiente:\nssh \u003cusuario\u003e@\u003cip_privada_raspberry_pi\u003e #Por ejemplo, en caso de haber usado el archivo wifi.yaml: ssh pi@192.168.1.50 Configuración de SSH a través de claves público-privada en vez de contraseña Desde el ordenador utilizado y desde la propia Raspberry Pi, al ejecutar el siguiente comando se generarán dos claves RSA, una pública y otra privada:\nssh-keygen Pedirá una contraseña y una vez generadas las claves, copiar el contenido de la clave pública $HOME/.ssh/id_rsa.pub en el fichero /home/pi/.ssh/authorized_keys de cada nodo del clúster. Para ello, se recomienda utilizar el siguiente comando:\nssh-copy-id -i $HOME/.ssh/id_rsa.pub pi@\u003cip de la raspberry\u003e Solicitará la contraseña de la clave SSH y se conectará a la Raspberry Pi.\nA partir de ahora, cada vez que se acceda por SSH a algún nodo, por defecto se pedirá la contraseña de la clave privada SSH en vez de la contraseña de sesión del nodo.\nLo último, será restringir el acceso remoto con contraseñas. De manera que sólo se podrán conectar remotamente a las máquinas aquellas que hayan subido previamente su clave pública SSH a cada Rasberry Pi. Para realizarlo, es necesario editar el fichero de configuración sshd_config y modificar la línea PasswordAuthentication no.\nsudo nano /etc/ssh/sshd_config En la línea PasswordAuthentication se modifica a no:\nPasswordAuthentication no Se guardan los cambios y se reinicia el servicio con:\nsudo service ssh restart Cambio del puerto por defecto de las conexiones SSH Una práctica de seguridad habitual es cambiar el puerto por defecto de SSH (puerto 22). Esto es porque durante un ataque, probablemente se pruebe la conexión por ese puerto. De esta manera, al cambiar el puerto, se reducen el número de intentos de conexión por parte de posibles atacantes 3.\nSe puede escoger un puerto alto entre el 1024 hasta el 65535, para evitar los escaneos rápidos de red de los puertos más comunes. Antes de seleccionar un puerto, es necesario revisar que no haya otro servicio utilizando el mismo puerto. Para ello se ejecuta el comando:\nnetstat -ltnp Donde los flags son:\nl muestra sólo los sockets a la escucha t muestra las conexiones tcp n muestra las direcciones de forma numérica p muestra los identificadores de procesos/programa Una vez comprobado que el puerto seleccionado no está en uso se modifica el archivo de configuración de SSH:\nsudo nano /etc/ssh/sshd_config Se cambia la línea #Port 22 por otro puerto, por ejemplo, Port 2251. Se guarda el fichero y se reinicia el servicio con:\nsudo service ssh restart En caso de haber un error en el proceso de cambio de puerto, se cerrará la sesión ssh de la máquina y se perderá el acceso. Por lo tanto, es recomendable estar físicamente cerca de la máquina.\nA partir de este momento, para acceder vía SSH a cada Raspberry Pi será necesario especificar el puerto modificado. El mandato a ejecutar será:\nssh -p 2251 pi@\u003cdirección ip\u003e En caso de olvidar el puerto escogido, se puede hallar mediante un escaneo de puertos con el comando:\nsudo nmap -p 1-65535 -T4 -A -v \u003cip-servidora\u003e Actualizar el sistema Utilizando la configuración del archivo wifi.yaml se actualizan todos los paquetes del sistema al iniciarlo, aunque para actualizar el sistema se utiliza en algún momento particular se utiliza:\nsudo apt update -y sudp apt upgrade -y Configurar cortafuegos ufw Para instalar el cortafuegos ufw ejecutar:\nsudo apt-get install ufw Permitimos las conexiones por el puerto 80 (HTTP), 443(HTTPS), 2251(SSH configurado) y 4443(puerto de configuración de nextcloud).\nsudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 4443/tcp sudo ufw allow 2251/tcp Para activarlo:\nsudo ufw enable Para ver las reglas por defecto:\nsudo ufw show raw También se puede ver con un formato más legible:\nsudo ufw status verbose Apagar la Raspberry Pi de forma correcta Para apagar la Raspberry Pi evitando que se corrompa la tarjeta SD se ejecuta el siguiente comando:\nsudo shutdown -h now Esperar a que la luz verde deje de parpadear y ya desenchufar el cable de alimentación.\nObtener dominio Se requiere un dominio en caso de querer acceder desde el exterior de la red local, en otras palabras, desde Internet. Para ello existen varias páginas donde obtener dominios gratuitos o por menos de 1€ al año. Lo más importante es que el resgistrador de nombres de dominio tenga protección de Whois (WhoisGuard) para prevenir ataques de spam o de suplantación de indentidad a través de los datos personales que tienen que ser públicos al registrar un dominio en el ICANN.\nEn caso de usar un dominio de freenom, es necesario cambiar el DNS a un de Cloudflare siguiendo los pasos de este tutorial.\nInstalar NextcloudPi con Docker Para levantar el contenedor docker de nextcloudpi, simplemente se necesitan los siguientes pasos:\nAñadir la variable de entorno con el nombre del dominio: $DOMINIO=dominioejemplo.org Levantar el contenedor desde el repositorio de Docker Hub: docker run -d -p 4443:4443 -p 443:443 -p 80:80 -v ncdata:/data --restart unless-stopped --name nextcloudpi ownyourbits/nextcloudpi $DOMINIO Activación de nextcloudpi Escribir en el navegador la dirección http://\u003cIP-Raspberry-Pi\u003e. Aceptar el riesgo de seguridad. Aparecerá la ventana de activación de nextcloudpi. Es importante guardar las credenciales que se muestran, por ejemplo:\nNextcloudpi: ncp cVYu90pMiZ8GyglILiLVUlD67ID69AOCarv68l4l/so Nextcloud user: ncp 1CAhXuQgPEQ99/zfI5xeCNaE7cHeqZpjGhYnuBqVehI Pulsar activar e introducir las credenciales de nextcloudpi. En la primera ejecución, si se quiere acceder al servidor desde la fuera de la red local, se pedirá que se realice el Port forwarding para los puerto 80 (HTTP) y 443(HTTPS) para la IP asignada a la raspberrypi. Se necesita acceder al router desde un navegador a la IP 192.168.1.1 mediante la contraseña del router, suele estar en una etiqueta debajo del router o por defecto es admin o 1234. Si no se permite desde la configuración del proveedor, será necesario realizarlo desde los ajustes avanzados del router.\nUna vez realizado, o en caso de no que no quiera ser accesible desde fuera, se requiere ir al panel de configuración de nextcloudpi y en CONFIG-\u003enc-trusted-domains\nAceso a nextcloud Mediante el usuario ncp y la contraseña del Nextcloud user, ya se puede acceder al servidor de almacenamiento Nextcloud. Además tiene para calendario, notas, tareas y otras herramientas y aplicaciones que se pueden añadir como edición de textos de manera colaborativa, videollamadas, servidor de comunicación, mapas, reproductor de música y radio, gestor de contraseña, etc. Tiene una infinidad de opciones.\nHypriot GitHub. Issue: hostname can not be changed using normal CLI methods ↩︎\nHypriot Blog. Releasing HypriotOS 1.8.0: Raspberry Pi 3 B+, Stretch and more ↩︎\nSeguridad de SSH - Parte IV Securicemos nuestra servidora web | la_bekka ↩︎\n",
    "description": "",
    "tags": [
      "nextcloudpi",
      "nextcloud",
      "raspberry pi"
    ],
    "title": "Instalación y configuración de NextcloudPi",
    "uri": "/technological_sovereignty/raspberry/2021-01-10-nextcloudpi/"
  },
  {
    "content": "En esta entrada se realizará una descripción de los objetos básicos de Kubernetes. Algunos de los ejemplos de los objetos de Kubernetes son los Pods, ReplicaSets, Deployments, Namespaces, etc.\nObjetos básicos Según la documentación de Kubernetes los objetos de Kubernetes son entidades persistentes. Kubernetes usa estas entidades para representar el estado del clúster. Cada objeto de Kubernetes está representado por un recurso RESTful y existe en una ruta HTTP única. Específicamente, los objetos pueden describir 1:\nQué aplicaciones en contenedores se están ejecutando (y en qué nodos). Los recursos disponibles para esas aplicaciones. Las políticas de comportamiento de esas aplicaciones, como políticas de reinicio, actualizaciones y tolerancia a fallas. Casi todos los objetos de Kubernetes incluyen dos campos del objeto que lo configuran: el spec o especificación del estado deseado objeto y el status o estado real o actual del objeto. En la sección spec se declara la intención o estado deseado del objeto. El plano de control es quién se encarga de intentar hacer coincidir el estado real del objeto con el estado deseado.\nPara crear un objeto es necesario que la API de Kubernetes reciba la información del mismo en formato JSON. Aunque la mayoría de las veces se envía la información mediante kubectl en un archivo .yaml que será convertido a formato JSON. Un ejemplo de archivo .yaml es el siguiente 1:\napiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 Campos requeridos Se necesitan establecer los siguientes campos obligatorios para crear un objeto 1:\napiVersion: qué versión de la API de Kubernetes se está utilizando para crear el objeto. kind: qué tipo de objeto se quiere crear. metadata: datos que sirven para identificar de forma única el objeto, incluyendo un nombre, un UID y un namespace opcional. spec: el estado deseado para el objeto. Etiquetado (labels) Las etiquetas o labels son pares clave-valor adjuntos a los objetos de Kubernetes. Se utilizan para organizar y seleccionar subconjuntos de objetos, en función de unos requisitos preestablecidos. Muchos objetos pueden tener la misma etiqueta, por lo que no proporcionan unicidad a los objetos 2.\nPor ejemplo, para agregar la etiqueta color=verde a un Pod llamado planta, se puede ejecutar lo siguiente 3:\nkubectl label pods planta color=verde El comando anterior no sobreescribirá una etiqueta existente, por lo tanto, es necesario utilizar le flag --overwrite. O en caso de querer eliminar la etiqueta color, se hará con el comando a continuación:\nkubectl label pods bar color - Selectores de etiquetas (label selectors) Los controladores utilizan selectores de etiquetas para seleccionar un subconjunto de objetos. Kubernetes admite dos tipos de selectores 4:\nSelectores basados en la igualdad Permiten el filtrado de objetos en función de claves y valores de etiqueta. La coincidencia se consigue utilizando los operadores:\nSi es igual = o == (no existe diferencia entre los operadores) Si es distinto != Selectores basados en conjuntos Permiten el filtrado objetos en función de un conjunto de valores. Podemos usar operadores in, notin para valores de etiqueta, y el operador exists para claves de etiquetas.\nTipos de Objetos Pods Un pod es la unidad de programación más pequeña de Kubernetes. Es una colección lógica de uno o más contenedores que 2:\nEstán programados en el mismo host. Comparten el mismo network namespace, por lo tanto comparten una única dirección IP asignada al Pod. Tienen acceso para montar el mismo almacenamiento externo (volúmenes). Los pods tienen naturaleza efímera y no tienene la capacidad de autorreparación. Por eso se utilizan controladores para gestionar la replicación de Pods, tolerancia a fallos, autorreparación, etc. Algunos de estos controladores son Deployments, ReplicaSets, etc.\nReplicaSets Deployments Kubernetes Documentation, Understanding Kubernetes Objects ↩︎ ↩︎ ↩︎\nKubernetes Documentation, Labels and Selectors ↩︎ ↩︎\nO’Reilly, Kubernetes: Up and Running ↩︎\nKubernetes Documentation, Label selectors ↩︎\n",
    "description": "",
    "tags": [
      "teoría",
      "kubernetes",
      "devops"
    ],
    "title": "Objetos básicos de Kubernetes",
    "uri": "/sysadmin/kubernetes/basic_objects_kubernetes/"
  },
  {
    "content": "Desarrollo software Tabla de Contenidos Git Comandos básicos de Git Gitflow Hugo Angular Multilenguaje en Angular 10/9/8 con la librería ngx-translate (i18n) Python ",
    "description": "",
    "tags": null,
    "title": "Desarrollo software",
    "uri": "/development/"
  },
  {
    "content": "En esta entrada se definen varios comandos útiles en la administración de sistemas.\nConsultar la información de red ip a Monitorizar el tráfico TCP sudo tcpdump -i \u003cdevice\u003e Eliminar ruta por defecto sudo ip route del default via 192.168.1.1 ",
    "description": "Comandos útiles para administrar sistemas",
    "tags": [
      "herramientas"
    ],
    "title": "Comandos útiles para administrar sistemas GNU/linux",
    "uri": "/sysadmin/utils/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para hacer hardening de OS y SSH una Raspberry Pi y posteriormente poder desplegar una serie de servicios securizados.\n1. Configuración SSH En el siguiente paso es necesario copiar la clave pública al archivo ~/.ssh/authorized_keys de la RaspberryPi. Para ello se utilizará el siguiente comando:\nssh-copy-id -i \u003cidentity.pub\u003e pi@\u003cip de la raspberry o node-1\u003e Ahora nos pedirá la contraseña de nuestra clave SSH y nos conectaremos a la RaspberryPi mediante:\nssh pi@node-1 2. Instalación de Ansible Debian sudo apt install -y ansible Arch: sudo pacman -Sy ansible 3. Configuración OS y SSH usando Ansible 3.1. Usando una colección Instalación: ansible-galaxy install dev-sec.os-hardening ansible-galaxy install dev-sec.ssh-hardening Crea un playbook para cada rol de ansible llamado ansible-os-hardening.yaml y ansible-ssh-hardening.yaml.\nEjecuta estos playbooks con los siguientes comandos:\nansible-playbook ansible-os-hardening.yaml --ask-become-pass ansible-playbook ansible-ssh-hardening.yaml --ask-become-pass 3.2. Usando un playbook básico Añade tu clave ssh en un ssh-agent usando zsh (o bash): ssh-agent zsh ssh-add ~/.ssh/id_ed25519 Ejecutar el playbook de ansible con la contraseña sudo requerida para los comandos: ansible-playbook playbook.yaml --ask-become-pass ",
    "description": "Hardening de OS y SSH",
    "tags": [
      "raspberry pi",
      "ansible"
    ],
    "title": "Hardening de OS y SSH",
    "uri": "/sysadmin/ansible/hardening/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para instalar y configurar una Raspberry Pi para desplegar una serie de servicios.\n1. Instalación del SO 1.1. Ubuntu, RaspberryPiOS o LibreElec Usando el programa Raspberry Pi Imager se puede quemar la imagen de Ubuntu, RaspberryPiOS, LibreElec o que prefieras, en cualquier tarjeta micro SD o USB 1. Por ejemplo elegiremos la imagen de Raspbian OS con escritorio y la quemaremos en un USB de 64GB.\nOtra forma de quemar una imagen en una tarjeta SD o un USB sería usando los siguientes comandos:\n# See the partitions lsblk # Umount the USB partition umount /dev/sdc1 # Format in vFAT mkfs.vfat -F 32 /dev/sdc -I # Flash the ISO into USB dd status=progress if=NAME.iso of=/dev/sdc 1.2. Arch En caso de instalar Arch, se ha seguido los pasos de la instalación de Arch con la versión de AArch64 2. We reproduced those steps for AArch64.\nStart fdisk to partition the SD card: fdisk /dev/sdX At the fdisk prompt, delete old partitions and create a new one:\nType o. This will clear out any partitions on the drive. Type p to list partitions. There should be no partitions left. Type n, then p for primary, 1 for the first partition on the drive, press ENTER to accept the default first sector, then type +200M for the last sector. Type t, then c to set the first partition to type W95 FAT32 (LBA). Type n, then p for primary, 2 for the second partition on the drive, and then press ENTER twice to accept the default first and last sector. Write the partition table and exit by typing w. Create and mount the FAT filesystem: mkfs.vfat /dev/sdX1 mkdir boot mount /dev/sdX1 boot Create and mount the ext4 filesystem: mkfs.ext4 /dev/sdX2 mkdir root mount /dev/sdX2 root Download and extract the root filesystem (as root, not via sudo): wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz bsdtar -xpf ArchLinuxARM-rpi-aarch64-latest.tar.gz -C root sync Move boot files to the first partition: mv root/boot/* boot Before unmounting the partitions, update /etc/fstab for the different SD block device compared to the Raspberry Pi 3: sed -i 's/mmcblk0/mmcblk1/g' root/etc/fstab Unmount the two partitions: umount boot root Insert the SD card into the Raspberry Pi, connect ethernet, and apply 5V power.\nUse the serial console or SSH to the IP address given to the board by your router.\nLogin as the default user alarm with the password alarm. The default root password is root. Initialize the pacman keyring and populate the Arch Linux ARM package signing keys: pacman-key --init pacman-key --populate archlinuxarm 2. Configuración Básica Una vez esté instalado el sistema operativo, existen varias opciones para configurar la raspi. La más sencilla es realizar un analisis de red con sudo nmap -f 192.168.1.0/24 para identificar la IP ue tiene la Raspberry y ha sido proporcionada por el router. Haremos ssh pi@192.168.10.250 (si es raspbian) o ssh alarm@192.168.10.250 (si es arch)). También se puede configurar sin necesidad de una pantalla, teclado y ratón extra como se explicó en un post anterior o usando estos tres periféricos externos. En este caso, usaremos una pantalla, un teclado y un ratón externo para simplificar la publicación. Por lo tanto, una vez encendida la raspi con el USB o la tarjeta SD conectada, aparecerá un dialogo para configurar el idioma, el wifi y una contraseña (por ejemplo: usar KeepassXC para generar una contraseña aleatoria).\n2.1 Actualización del sistema Una vez tengamos una consola con un usuario sin privilegios de root, abriremos una nueva consola como el usuario root:\nsu - La contraseña por defecto suele ser root o similar.\nBasados en Debian: # Update and upgrade packages system apt-get update -y \u0026\u0026 sudo apt-get upgrade -y Basados en Arch: # Update and upgrade packages system pacman -Syu 2.2 Actualización horaria Seguimos esta guía con los primeros pasos después de haber instalado Arch 3 o alguna distribución minimalista como HypriotOS. Cambiamos la hora al ue nos corresponde con:\ntimedatectl set-timezone Europe/London Actualizamos el reloj con internet:\ntimedatectl set-ntp true 2.3 Actualización del idioma Descomentamos el idioma deseado en el archivo locale.gen (por ejemplo: en_US.UTF-8) :\nnano /etc/locale.gen Ejecutamos:\nlocale-gen Y ejecutamos:\nlocalectl set-locale LANG=en_US.UTF-8 2.4 Cambio de hostname Cambiamos el hostname con:\nhostnamectl set-hostname \u003cnombre\u003e Añadimos un alias par el hostname en el archivo /etc/hosts del oredenador que estemos utilizando para la configuración. Usamos nano /etc/hosts:\n127.0.0.1\tlocalhost.localdomain\t\u003cnombre\u003e\tlocalhost ::1\tlocalhost.localdomain\t\u003cnombre\u003e\tlocalhost (Opcional) Cambiar el color a la salida de pacman Si utilizamos Arch, ejecutamos:\nsed -i 's/#Color/Color/' /etc/pacman.conf (Opcional) Añadimos 8GB de memoria SWAP Si utilizamos Arch, ejecutamos:\nfallocate -l 8192M /swapfile (Opcional) Nuevo usuario con permisos sudo Si utilizamos Arch, ahora usaremos la utilidad visudo para editar los permisos de grupo para ejecutar comandos administrativos con sudo.\npacman -S sudo EDITOR=nano visudo Descomentamos la siguiente línea:\n## Uncomment to allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL Creamos un nuevo grupo sudo con:\nsudo groupadd sudo Creamos un nuevo usuario con:\nuseradd -m -G sudo nombre_usuario Ponemos una contraseña al nuevo usuario:\npasswd nombre_usuario Una vez tengamos el nuevo usuario, borraremos el usuario alarm.\nuserdel alarm En Debian o derivados modificamos los permisos del usuario que habíamos creado durante la instalació y lo añadidos al grupo sudo con el siguiente comando:\nsu - usermod -aG sudo username Reiniciamos el sistema:\nreboot 2.5 SSH En el siguiente paso es necesario copiar la clave pública al archivo ~/.ssh/authorized_keys de la RaspberryPi. Para ello se utilizará el siguiente comando:\nssh-copy-id -i \u003cidentity.pub\u003e pi@\u003cip de la raspberry o node-1\u003e Ahora nos pedirá la contraseña de nuestra clave SSH y nos conectaremos a la RaspberryPi mediante:\nssh pi@node-1 (Optional) Configuración Wi-Fi Reproducido de la guía: los primeros pasos después de haber instalado Arch 3\nkarog, on ArchLinux ARM forums provided a simple way to connect to Wi-Fi. As root, do the following steps:\nnano /etc/systemd/network/wlan0.network to configure the wlan0 interface: Add the following contents to the file: [Match] Name=wlan0 [Network] DHCP=yes wpa_passphrase \"\u003cSSID\u003e\" \"\u003cPASSWORD\u003e\" \u003e /etc/wpa_supplicant/wpa_supplicant-wlan0.conf. Replace and with your respective Wi-Fi network name and password. systemctl enable wpa_supplicant@wlan0 to enable the Wi-Fi when booting systemctl start wpa_supplicant@wlan0 to connect to Wi-Fi. You’re good to go!\nIf you ever want to remove Wi-Fi connection (e.g. when you want to make it connect only through ethernet):\nsystemctl stop wpa_supplicant@wlan0 systemctl disable wpa_supplicant@wlan0 rm /etc/wpa_supplicant/wpa_supplicant-wlan0.conf rm /etc/systemd/network/wlan0.network 3. Instalación de Programas 3.1. Paquetes básicos Debian: sudo apt install -y software-properties-common git wget Arch: sudo pacman -S -y git wget 3.2. Docker y docker compose Se recomienda instalar docker rootless.\n3.2.1. Instalación en Debian Instalamos docker con el script de instalación:\ncurl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh Mientras que la instación de docker-compose lo realizamos a través de pithon3:\nsudo apt-get install libffi-dev libssl-dev sudo apt install python3-dev sudo apt-get install -y python3 python3-pip sudo pip3 install docker-compose Añadir usuario al grupo docker:\nsudo usermod -aG docker ${USER} 3.2.2. Instalación en Arch Instalamos docker y docker-compose desde los repositorios oficiales:\nsudo pacman -Sy docker sudo pacman -Sy docker-compose Se activa el servicio con:\nsudo systemctl start docker.service Se activa siempre que se reinicie:\nsudo systemctl start docker.service Añadir usuario al grupo docker\nsudo usermod -aG docker ${USER} 3.2.3 Docker rootless Arch: sudo pacman -S shadow sudo pacman -S fuse-overlayfs Añade kernel.unprivileged_userns_clone=1 in /etc/sysctl.conf:\nsudo nano /etc/sysctl.conf sudo sysctl --system Común: sudo touch /etc/subuid \u0026\u0026 sudo touch /etc/subgid su - echo \"pi:100000:65536\" \u003e\u003e /etc/subgid echo \"pi:100000:65536\" \u003e\u003e /etc/subuid exit sudo systemctl disable --now docker.service docker.socket curl -fsSL https://get.docker.com/rootless | sh systemctl --user start docker systemctl --user enable docker sudo loginctl enable-linger $(whoami) export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock Se prueba con docker run -d -p 8080:80 nginx.\nSi queremos que se arranque en el arranque, escribimos los siguientes comandos:\nsudo systemctl enable docker.service sudo systemctl enable containerd.service 3.3. Ansible Debian sudo apt install -y ansible Arch: sudo pacman -Sy ansible 3.3.1 Hardening de SSH usando Ansible Mediante las colecciones de Ansible devsec.hardening, proporcionamos mecanismos de seguridad y la comprobamos con los siguientes comandos.\nInstalación: ansible-galaxy install dev-sec.ssh-hardening Crea un playbook para cada rol de ansible llamado ansible-ssh-hardening.yaml.\nEjecuta estos playbooks con los siguientes comandos:\nansible-playbook ansible-ssh-hardening.yaml --ask-become-pass También se puede crear un playbook de ansible con los módulos que queramos incluir.\nAñade tu clave ssh en un ssh-agent usando zsh (o bash): ssh-agent zsh ssh-add ~/.ssh/id_ed25519 Ejecutar el playbook de ansible con la contraseña sudo requerida para los comandos: ansible-playbook playbook.yaml --ask-become-pass 3.4. Instalar zsh y Oh my zsh Debian4: sudo apt install zsh sh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\" Arch: sudo pacman -Sy zsh zsh-completions sh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\" 3.4.1. Instalar Powerlevel10k Descargar y pegar las 4 fuentes .ttf Meslo Nerd en /usr/local/share/fonts. Deben tener los permisos 644 (-rw-r–r–).5\nMesloLGS NF Regular.ttf MesloLGS NF Bold.ttf MesloLGS NF Italic.ttf MesloLGS NF Bold Italic.ttf Creamos la carpeta /usr/local/share/fonts: sudo mkdir /usr/local/share/fonts cd /usr/local/share/fonts Descargamos las fuentes:\nsudo wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf Clonar el proyecto de powerlevel10k:\ngit clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' \u003e\u003e~/.zshrc exec zsh Sustituir el siguiente valor en ~/.zshrc:\nZSH_THEME=\"powerlevel10k/powerlevel10k\" 3.4.2. Instalar plugins para zsh Para añadir una serie de plugins interesantes, editamos el archivo ~/.zshrc con nano ~/.zshrc y modificamos lo siguiente:\n#plugins=(git) plugins=(git git-extras history ansible zsh-autosuggestions zsh-syntax-highlighting docker-helpers docker docker-compose kubectl kubectx colorize nmap pip ssh-agent sudo pipenv fzf fzf-docker) Necesitamos instalar los plugins de zsh-autosuggestions, zsh-syntax-highlightingm docker-helpers, fzf y fzf-docker.\nPara instalar zsh-autosuggestions:\ngit clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/plugins/zsh-autosuggestions Para instalar zsh-syntax-highlighting:\ngit clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/plugins/zsh-syntax-highlighting Para instalar fzf usamos los repositorios oficiales:\nsudo pacman -Sy fzf Para instalar fzf-docker:\ngit clone https://github.com/pierpo/fzf-docker ~/.oh-my-zsh/plugins/fzf-docker Para instalar docker-helpers:\ngit clone https://github.com/unixorn/docker-helpers.zshplugin ~/.oh-my-zsh/plugins/docker-helpers Configurar al gusto y actualizar los cambios del fichero ~/.zshrc:\nsource ~/.zshrc Snapd Instalación Se instala los paquetes snapd y core:\nsudo apt install -y snapd core Añadir ruta de ejecutables al PATH de bash y Zhs Se añade la ruta de ejecutables snap al PATH:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc Se comprueba que se ha añadido correctamente la ruta:\necho $PATH Añadir lanzadores al menú de aplicaciones Se crea un enlace simbólico desde el directorio que almacena los lanzadores de snaps (/var/lib/snapd/desktop/applications) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/snapd/desktop/applications /usr/share/applications/snapd Flatpak Instalación De la documentación oficial de Flatpak, se siguen los siguientes pasos:\nInstalar Flatpak sudo apt install flatpak -y Se instala el repositorio de Flatpak flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo Se reinicia el sistema para aplicar los cambios. Añadir lanzadores al menú Se crea un enlace simbólico desde el directorio que almacena los lanzadores de flatpak (/var/lib/flatpak/exports/share/applications/) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/flatpak/exports/share/applications/ /usr/share/applications/flatpak KeePassXC Nota: se instala a través de Snap porque los repositorios oficiales tienen una versión desactualizada.\nSe instala a través de snap: sudo snap install keepassxc Se descarga la extensión para el navegador.\nSe configura la extensión del navegador a través de un script oficial de KeePassXC. Guardar script y ejecutar:\nwget https://raw.githubusercontent.com/keepassxreboot/keepassxc/master/utils/keepassxc-snap-helper.sh zsh keepassxc-snap-helper.sh En caso de obtener el error Could not find keepassxc.proxy! Ensure the keepassxc snap is installed properly., esto se debe a que falta añadir la ruta de ejecutables snap al PATH mediante:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc Volver a ejecutar el script:\nbash keepassxc-snap-helper.sh VSCodium 4 Añade la clave GPG del repositorio: wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | gpg --dearmor | sudo dd of=/etc/apt/trusted.gpg.d/vscodium.gpg Añade el repositorio: echo 'deb [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs vscodium main' | sudo tee /etc/apt/sources.list.d/vscodium.list Actualización de repositorios e instalación de VSCodium: sudo apt update \u0026\u0026 sudo apt install codium Instalación de Ubuntu en la Raspberry - Atareao ↩︎\nArchLinux, Arch ↩︎\nsTheZoc, Raspberry Pi Setup Guide ↩︎ ↩︎\nDebian Documentation, Fonts ↩︎ ↩︎\nVSCodium Documentation, Installation ↩︎\n",
    "description": "",
    "tags": [
      "raspberry pi",
      "ansible"
    ],
    "title": "Instalación y configuración de Debian, Ubuntu, RaspberryPiOS, LibreElec o Arch en una Raspbery Pi",
    "uri": "/technological_sovereignty/raspberry/instalacion_configuracion_debian_arch_raspberrypi/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para instalar y configurar WLED en una placa ESP8266.\nFlashear el ESP8266 NodeMCU es un firmware de código abierto basado en Lua para el SOC WiFi ESP8266 de Espressif y utiliza un sistema de archivos SPIFFS basado en la flash del módulo. NodeMCU está implementado en C y se basa en el SDK NON-OS de Espressif.\nEl firmware se desarrolló inicialmente como un proyecto complementario a los populares módulos para desarrollo NodeMCU basados en ESP8266, pero el proyecto está ahora apoyado por la comunidad, y el firmware puede ejecutarse en cualquier módulo ESP 1.\nPara flasear el ESP8266 intalams la herramienta esptool:\npip install esptool Descargamos la última versión de WLED de su GitHub y flaseamos la placa con el siguiente comando:\nesptool.py write_flash 0x0 ./WLED_0.13.1_ESP8266.bin Documentación NodeMCU ↩︎\n",
    "description": "",
    "tags": [
      "ESP8266",
      "WLED"
    ],
    "title": "Instalación y configuración de WLED en ESP8266",
    "uri": "/technological_sovereignty/esp8622/wled/"
  },
  {
    "content": "Angular Tabla de Contenidos Multilenguaje en Angular 10/9/8 con la librería ngx-translate (i18n) ",
    "description": "",
    "tags": null,
    "title": "Angular",
    "uri": "/development/angular/"
  },
  {
    "content": "Docker Tabla de Contenidos Comandos útiles de docker ",
    "description": "",
    "tags": null,
    "title": "Docker",
    "uri": "/sysadmin/docker/"
  },
  {
    "content": "Kubernetes Tabla de Contenidos Introducción a Kubernetes Componentes de la arquitectura de Kubernetes Objetos básicos de Kubernetes Comandos básicos de Kubernetes Primeros pasos con Minikube ",
    "description": "",
    "tags": null,
    "title": "Kubernetes",
    "uri": "/sysadmin/kubernetes/"
  },
  {
    "content": "En esta entrada se configurará el sistema operativo Debian.\n¿Qué es Debian? Debian GNU/Linux es un sistema operativo libre, desarrollado por miles de voluntarios de todo el mundo, que colaboran a través de Internet.\nLa dedicación de Debian al software libre, su base de voluntarios, su naturaleza no comercial y su modelo de desarrollo abierto la distingue de otras distribuciones del sistema operativo GNU1.\nAñadir drivers para la tarjeta de WiFi y NVIDIA Ejecutando los siguientes comandos se iniciará sesión como root y se añadirán los repositorios necesarios para añadir los drivers no incluidos en los repositorios totalmente libres:\n# Log in as root su - # Install vim apt install -y vim # Add contrib and non-free reopositories ## Edit /etc/apt/sources.list vim /etc/apt/sources.list ## Add contrib and non-free at the end deb http://mirror.librelabucm.org/debian/ buster main contrib non-free deb http://security.debian.org/debian-security buster/updates main contrib non-free deb http://mirror.librelabucm.org/debian/ buster-updates main contrib non-free # Add non-free drivers for WiFi apt install -y firmware-iwlwifi firmware-atheros firmware-misc-nonfree firmware-intelwimax firmware-realtek firmware-linux firmware-linux-nonfree Comprobar que los paquetes han sido instalados:\nsudo apt list --installed | grep firmware Añadir a un usuario al grupo sudo su - usermod -aG sudo username Comprobar que se ha añadido al grupo sudo getent group sudo Iniciar sesión con el usuario del grupo sudo su - username Instalar git y wget sudo apt install git wget -y Instalar zsh y Oh my zsh2 sudo apt install zsh sh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\" Instalar Powerlevel10k Descargar y pegar las 4 fuentes .ttf Meslo Nerd en /usr/local/share/fonts. Deben tener los permisos 644 (-rw-r–r–).3\nMesloLGS NF Regular.ttf MesloLGS NF Bold.ttf MesloLGS NF Italic.ttf MesloLGS NF Bold Italic.ttf Creamos la carpeta /usr/local/share/fonts:\nsudo mkdir /usr/local/share/fonts cd /usr/local/share/fonts Descargamos las fuentes:\nsudo wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf Clonar el proyecto de powerlevel10k:\ngit clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k Sustituir el siguiente valor en ~/.zshrc:\nZSH_THEME=\"powerlevel10k/powerlevel10k\" Configurar al gusto y actualizar los cambios del fichero ~/.zshrc:\nsource ~/.zshrc Añadir lanzadores al menú Utilizar el siguiente comando para emular en zsh las aplicaciones en /etc/profile.\nemulate sh -c 'source /etc/profile' Instalación de programas recomendados Snapd Instalación Se instala los paquetes snapd y core:\nsudo apt install snapd sudo snap install core Añadir ruta de ejecutables al PATH de bash y Zhs Se añade la ruta de ejecutables snap al PATH:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc Se comprueba que se ha añadido correctamente la ruta:\necho $PATH Añadir lanzadores al menú de aplicaciones Se crea un enlace simbólico desde el directorio que almacena los lanzadores de snaps (/var/lib/snapd/desktop/applications) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/snapd/desktop/applications /usr/share/applications/snapd Flatpak Instalación De la documentación oficial de Flatpak, se siguen los siguientes pasos:\nInstalar Flatpak sudo apt install flatpak -y Se instala el repositorio de Flatpak flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo Se reinicia el sistema para aplicar los cambios. Añadir lanzadores al menú Se crea un enlace simbólico desde el directorio que almacena los lanzadores de flatpak (/var/lib/flatpak/exports/share/applications/) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/flatpak/exports/share/applications/ /usr/share/applications/flatpak Aptitude sudo apt install aptitude Cliente de sincronización de Nextcloud Descargar el archivo AppImage desde Nextcloud, darle permisos de ejecución al usuario y ejecutarlo con:\nchmod u+x Nextcloud-3.3.5-x86_64.AppImage ./Nextcloud-3.3.5-x86_64.AppImage Sincronizar carpetas.\nKeePassXC Nota: se instala a través de Snap porque los repositorios oficiales tienen una versión desactualizada.\nSe instala a través de snap: sudo snap install keepassxc Se descarga la extensión para el navegador.\nSe configura la extensión del navegador a través de un script oficial de KeePassXC. Guardar script y ejecutar:\nwget https://raw.githubusercontent.com/keepassxreboot/keepassxc/master/utils/keepassxc-snap-helper.sh zsh keepassxc-snap-helper.sh En caso de obtener el error Could not find keepassxc.proxy! Ensure the keepassxc snap is installed properly., esto se debe a que falta añadir la ruta de ejecutables snap al PATH mediante:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc Volver a ejecutar el script:\nbash keepassxc-snap-helper.sh VSCodium 4 Añade la clave GPG del repositorio: wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | gpg --dearmor | sudo dd of=/etc/apt/trusted.gpg.d/vscodium.gpg Añade el repositorio: echo 'deb [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs vscodium main' | sudo tee /etc/apt/sources.list.d/vscodium.list Actualización de repositorios e instalación de VSCodium: sudo apt update \u0026\u0026 sudo apt install codium Usar LaTeX con VSCodium En settings buscar por word wrap y activar para que las líneas no sean infinitas. Instalar la distibución de LaTeX Texlive (recomendada por la extensión LateX Workshop de VSCodium), ChkTex para comprobar la semántica de Latex y texlive-extra-utils para extensiones como latexindent. apt-get install -y texlive texlive-latex-extra texlive-extra-utils chktex latexmk texlive-fonts-recommended texlive-fonts-extra texlive-science texlive-latex-base-doc Añadir la ruta echo 'export PATH=$PATH:/usr/share' \u003e\u003e ~/.bashrc echo 'export PATH=$PATH:/usr/share' \u003e\u003e ~/.zshrc source ~/.bashrc source ~/.zshrc Inskape Instalar a través de los repositorios de flatpak.\nflatpak install org.inkscape.Inkscape Mattermost-Desktop Según la documentación oficial de Mattermost, para los sistemas operativos basados en Debian, los pasos a seguir son:\nSe descarga la última version de Mattermost (usar la página documentación oficial): 64-bit systems mattermost-desktop-4.6.2-linux-amd64.deb Zotero Los pasos que se han tomado de referencia son los que vienen en la wiki de Debian para instalar Zotero.\nSe instala Zotero a través de Flatpak:\nflatpak install flathub org.zotero.Zotero Se añade Zotero al PATH:\necho 'export PATH=$PATH:/var/lib/flatpak/exports/bin' \u003e\u003e ~/.bashrc Se ejecuta Zotero:\nflatpak run org.zotero.Zotero Se sincroniza la biblioblioteca y se instala el plugin BetterBibTex. Para instalar el plugin de BetterBibTex se sigue su documentación.\nUna vez instalado, añadir el siguiente script para que añada las keywords al exportarlo con\nOwnCloud Seguir la guía de installación para Debian.\nUna vez esté instalado, sincronizar carpetas.\nThunderbird Copiar y pegar la carpeta .thunderbird para hacer migración completa. Instalar con:\nsudo apt install thunderbird Pip sudo apt install python3-pip Node y npm sudo curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash - sudo apt-get install -y nodejs Kubernetes kubectl Install using native package management\nConfiguración de sonido HDMI Según este post, se debe añadir en /etc/pulse/default.pa lo siguiente:\nload-module module-alsa-sink device=hdmi:0 load-module module-combine-sink sink_name=combined set-default-sink combined Customización de xfce en Debian Tema Se descargan temas desde xfce-look, filtrando por rating. Alguno recomendado son Qogir-dark, Ultimate-dark o Nordic . Se descomprimen y se copian en la carpeta .themes, ubicada en /home/nombreUsuario/.themes.\nSe accede a Appeareance -\u003e Themes -\u003e Qogir-dark.\nIconos Se añaden los iconos Qogir-dark. Son descargados de xfce-look, se descomprimen y se copian en la carpeta .icons ubicada en /home/nombreUsuario/.icons.\nSe accede a Appeareance -\u003e Icons -\u003e Qogir-dark\nDock Instalación de Plank:\nsudo apt-get install plank Gestor de ventanas Instalar emerald:\nsudo apt install emerald Ejecutar el programa emerald-theme-manager y escoger un tema:\nemerald-theme-manager Correr en segundo plano:\nemerald --replace \u0026 Plymouth Pasos seguidos de la wiki oficial de Debian.\nGestor de ventanas i3wm sudo apt install i3 i3status Wikipedia, Debian ↩︎\nOh My Zsh Documentation, Install oh-my-zsh ↩︎\nDebian Documentation, Fonts ↩︎\nVSCodium Documentation, Installation ↩︎\n",
    "description": "",
    "tags": [
      "GNU/Linux",
      "debian"
    ],
    "title": "Configuración de Debian",
    "uri": "/gnu_linux/debian/debian_configuration/"
  },
  {
    "content": "En esta entrada se configurará el sistema operativo Arch.\n1. Instalación de Arch 1.1. ¿Qué es Arch? Arch Linux es una distribución GNU/Linux de propósito general x86-64, desarrollada de forma independiente, que se esfuerza por ofrecer las últimas versiones estables de la mayoría del software siguiendo un modelo rolling-release. La instalación por defecto es un sistema base mínimo, configurado por el usuario para añadir sólo lo que se requiere a propósito 1.\n1.2. Conceptos básicos LVM es una implementación de un gestor de volúmenes lógicos para el núcleo Linux. LVM incluye muchas de las características que se esperan de un administrador de volúmenes, incluyendo:\nRedimensionado de grupos lógicos Redimensionado de volúmenes lógicos Instantáneas de sólo lectura (LVM2 ofrece lectura y escritura) RAID0 de volúmenes lógicos. LVM no implementa RAID1 o RAID5, por lo que se recomienda usar software específico de RAID para estas operaciones, teniendo las LV por encima del RAID 2. En esta configuración no se usará RAID.\nLUKS es una especificación de cifrado de disco creado por Clemens Fruhwirth, originalmente destinado para Linux. Mientras la mayoría del software de cifrado de discos implementan diferentes e incompatibles formatos no documentados, LUKS especifica un formato estándar en disco, independiente de plataforma, para usar en varias herramientas. Esto no sólo facilita la compatibilidad y la interoperabilidad entre los diferentes programas, sino que también garantiza que todas ellas implementen gestión de contraseñas en un lugar seguro y de manera documentada. La implementación de referencia funciona en Linux y se basa en una versión mejorada de cryptsetup, utilizando dm-crypt como la interfaz de cifrado de disco 3.\nUn boot loader carga un kernel del sistema operativo en la memoria y lo ejecuta. Un boot manager entrega el control a otro programa de arranque. GRUB es tanto un boot loader como un boot manager. Refind es sólo un boot manager.\nOtro concepto fundamental es conocer la diferencia entre EFI/UEFI y BIOS.\nLVM es una implementación de un gestor de volúmenes lógicos para el núcleo Linux. LVM incluye muchas de las características que se esperan de un administrador de volúmenes, incluyendo:\nRedimensionado de grupos lógicos Redimensionado de volúmenes lógicos Instantáneas de sólo lectura (LVM2 ofrece lectura y escritura) RAID0 de volúmenes lógicos. LVM no implementa RAID1 o RAID5, por lo que se recomienda usar software específico de RAID para estas operaciones, teniendo las LV por encima del RAID 2. En esta configuración no se usará RAID.\nLUKS es una especificación de cifrado de disco creado por Clemens Fruhwirth, originalmente destinado para Linux. Mientras la mayoría del software de cifrado de discos implementan diferentes e incompatibles formatos no documentados, LUKS especifica un formato estándar en disco, independiente de plataforma, para usar en varias herramientas. Esto no sólo facilita la compatibilidad y la interoperabilidad entre los diferentes programas, sino que también garantiza que todas ellas implementen gestión de contraseñas en un lugar seguro y de manera documentada. La implementación de referencia funciona en Linux y se basa en una versión mejorada de cryptsetup, utilizando dm-crypt como la interfaz de cifrado de disco 3.\nEn la tabla de particiones Tabla de particiones se utiliza el formato ext4 para las particiones porque mejora la velocidad de entrada y salida y utiliza menos CPU que los formatos ext3 y ext2. Se recomiendan como mínimo los siguientes valores:\nParticion Tamaño recomendado Asignado Debian Asignado Propio Contiene / \u003e= 750MB 22GB 64GB /etc, /bin, /sbin, /lib, /dev, /usr /usr \u003e= 4-6GB 0 0 Programas de usuario, lib y docs /var \u003e= 2-3GB 32GB 112GB Variables de datos como emails /tmp \u003e= 100MB 16GB 32GB Páginas web, caché de paquetes, datos temporales /home \u003e= 100MB 200GB 288GB Directorio con Documentos, Descargas, … /boot \u003e= 256MB 500MB 512GB Partición Primaria, ext4 o ext2, no se recomienda cifrarla /boot/efi \u003e= 100MB 250MB 0 No se recomienda cifrarla y bootable flag: on /swap \u003e= 8GB 16GB 16GB Área de intercambio 1.3. Quemar la imagen de Arch Se ha seguido los pasos de la instalación de Arch 4.\nUna forma de quemar una imagen es con el comando dd como se muestra a continuación:\n# See the partitions lsblk -f # Umount the USB partition umount /dev/sda1 # Flash the ISO into USB sudo dd bs=4M if=archlinux-2022.05.01-x86_64.iso of=/dev/sda conv=fsync oflag=direct status=progress 1.4. Arrancamos Arch Conectamos el USB, ethernet y mediante la BIOS, arrancamos Boot Arch Linux desde el USB.\n2. Configuración inicial 2.1. Definir la distribución del teclado en el entorno live Cambiamos el teclado a castellano:\nloadkeys es 2.2. Configurar la WiFi Si no está instalado el paquete iwd, lo instalamos con una conexión ethernet;\nsudo pacman -yS iwd Configuramos la interfaz WiFi con:\n: wlan0 : nombre de la WiFi : contraseña Para localizar dichos valores, podemos utilizar el comando iwctl y después device device show.\niwctl --passphrase \u003cpassphrase\u003e station \u003cdevice\u003e connect \u003cSSID\u003e Para ver las redes WiFi disponibles escribimos los siguientes comandos:\niwctl station list iwctl station wlan0 scan iwctl station station get-networks Comprobamos que tenemos IP con:\nip a Ahora si cambiamos la contraseña al usuario root, con el comando passwd, nos podremos conectar a la máquina con:\nssh root@\u003cIP-máquina\u003e 2.3. Actualización horaria Seguimos esta guía con los primeros pasos después de haber instalado Arch 5. Cambiamos la hora a la que nos corresponde con:\ntimedatectl set-timezone Europe/Madrid Actualizamos el reloj con internet:\ntimedatectl set-ntp true 2.4. Desbloquear partición cifrada con LUKS y configurada con volúmenes lógicos LVM Desciframos la partición con:\ncryptsetup luksOpen /dev/sdaX all-Operative-Systems Posteriormente detectaremos el grupo de los volúmenes LVM con:\nvgchange -a y Nota: es probable que los siguientes pasos no funcionen a la primera y sea necesario completarlos con la siguiente sección. Por lo que se podría obviar el final de esta sección e instalar el grub directamente.\nUna vez ejecutados los comandos anteriores, seguir con la instalación hasta la instalación del GRUB. Volvemos a abrir una terminal e identificamos el UUID de la partición cifrada con:\nblkid /dev/sdaX \u003e\u003e nano /etc/crypttab Lo siguiente es modificar el archivo /etc/crypttab:\nnano /etc/crypttab Y se añade el siguiente contenido, donde el UUID es el obtenido del comando blkid:\nall-Operative-Systems UUID=524c1ad6-1111-2222-0000-c8db1286b262 none luks Parece que esta configuración es necesaria repetirla más adelante.\n2.5. Montar las particiones Según la documentación de Arch para crear sistemas de archivos y montar volúmnes, formateamos los volúmenes ya creados y montamos las siguientes particiones:\n# Formateamos y montamos la partición root mkfs.ext4 -L arch-root /dev/lvm-all-OS/lvm-arch-root mount /dev/lvm-all-OS/lvm-arch-root /mnt # Formateamos y montamos la partición home mkfs.ext4 -L arch-home /dev/lvm-all-OS/lvm-arch-home mount --mkdir /dev/lvm-all-OS/lvm-arch-home /mnt/home # Formateamos y montamos la partición EFI o ESP, y la BOOT # Si no está formateada la partición boot en FAT32, utilizamos el siguiente comando comentado # mkfs.fat -F 32 -n boot-arch /dev/sda4 mkfs.ext4 -L boot-arch /dev/sda4 mount --mkdir /dev/sda4 /mnt/boot mount --mkdir /dev/sda1 /mnt/boot/efi 2.6. Instalación de paquetes esenciales y recomendados Fuentes:\n[https://denovatoanovato.net/instalar-arch-linux/#uefi] [https://linuxhint.com/setup-luks-encryption-on-arch-linux/] Probar a seguirlo con encrypt en vez de lvm2 o poniendo ambas Paquetes esenciales:\npacstrap /mnt base base-devel linux linux-firmware lvm2 nano vim intel-ucode iwd Paquetes recomendados (aunque alguno puede dar error):\npacstrap /mnt grub networkmanager dhcpcd efibootmgr gvfs gvfs-mtp netctl wpa_supplicant dialog nano initramfs Para activar el touchpad, instalar el paquete xf86-input-synaptics.\nOtros paquetes adicionales podrían ser os-probes (parece que da error).\nDespués generaremos el archivo fstab, el encargado de contiener la tabla de particiones del sistema.\ngenfstab -pU /mnt \u003e\u003e /mnt/etc/fstab 2.7. Entrar al sistema base Ya es momento que entremos al sistema base instalado, para seguir configurándolo desde dentro. Para acceder al sistema en chroot ejecutamos:\narch-chroot /mnt 2.8 Actualizar hostname echo nombredehost \u003e /etc/hostname 2.9. Actualizar zona horaria ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime 2.10. Ajustamos el reloj hwclock --systohc 2.11. Configurar distibución de teclado echo KEYMAP=es \u003e\u003e /etc/vconsole.conf 2.12. Configurar mkinitcpio Fuentes:\n[https://www.linuxserver.io/blog/2014-01-18-installing-arch-linux-with-root-on-an-lvm] [https://wiki.archlinux.org/title/LVM_(Espa%C3%B1ol)#Crear_sistemas_de_archivos_y_montar_los_vol%C3%BAmenes_l%C3%B3gicos] nano /etc/mkinitcpio.conf Modificamos el HOOKS y añadimos lo siguiente:\nHOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck) Y ejecutamos:\nmkinitcpio -p linux Ahora, ya podríamos desmontar la partición y reiniciar el sistema operativo con los siguientes comandos en caso de no haber instalado Arch en una partición cifrada. En caso de haberlo instalado en una partición cifrada, deberemos configurar el grub para indicar que está cifrado (paso 2.13).\numount -R /mnt sudo reboot 2.13. Configurar Grub Instalamos grub con los siguientes comandos:\ngrub-install --boot-directory=/boot --efi-directory=/boot/efi --target=x86_64-efi --recheck /dev/sda4 En /etc/default/grub editamos la línea GRUB_CMDLINE_LINUX por:\nGRUB_CMDLINE_LINUX=\"cryptdevice=/dev/sda2:luks:allow-discards\" [Consejo] Para buscar automáticamente otros sistemas operativos en su ordenador, instale os-prober (pacman -S os-prober) antes de ejecutar el siguiente comando.\nPor último, configuramos el grub con:\ngrub-mkconfig -o /boot/grub/grub.cfg grub-mkconfig -o /boot/efi/EFI/arch/grub.cfg 2.14. Configuración para particición cifrada con LUKS Nota: los siguientes son los repetidos en la sección 2.4., por lo que fijarse bien si funcionó en ese paso o hay que repetirlos.\nDetectamos el UUID de la partición cifrada. La X de sdaX corresponde al número de la partición cifrada, si no se conoce simplemente utilizar el comando blkid.\nblkid /dev/sdaX \u003e\u003e /etc/crypttab Editamos el archivo /etc/crypttab con nano:\nsudo nano /etc/crypttab Añadimos lo siguiente:\nall-Operative-Systems UUID=524c1ad6-1111-2222-0000-c8db1286b262 none luks Instalamos initramfs:\npacman -Sy initramfs Una vez terminado se utiliza el siguiente comando para actualizar initramfs:\nsudo update-initramfs -u 2.14 (Opcional) Inicialización del llavero de pacman Instalamos el llavero:\npacman -Sy archlinux-keyring Inicializamos el llavero de pacman y rellenar las claves de firma de los paquetes de Arch Linux ARM (en caso de ser una raspberry):\npacman-key --init pacman-key --populate archlinuxarm 2.15 Desmontar las particiones Desmontamos la partición mnt\numount -R /mnt Reiniciamos el sistema operativo con:\nsudo reboot 3. Configuración Avanzada Volvemos a acceder por ssh a la máquina y seguimos los siguientes pasos.\n3.1. Actualización del sistema Una vez tengamos una consola con un usuario sin privilegios de root, abriremos una nueva consola como el usuario root:\nsu - La contraseña por defecto suele ser root o la que ya se haya configurado previamente.\nActualizamos Arch: pacman -Syu 3.2. Actualización del idioma Si no está configurado anteriormente, descomentamos el idioma deseado en el archivo locale.gen (por ejemplo: en_US.UTF-8) :\nnano /etc/locale.gen Ejecutamos:\nlocale-gen Y ejecutamos:\nlocalectl set-locale LANG=en_US.UTF-8 3.3. Cambio de hostname Cambiamos el hostname con:\nhostnamectl set-hostname \u003cnombre\u003e Añadimos un alias par el hostname en el archivo /etc/hosts del oredenador que estemos utilizando para la configuración. Usamos nano /etc/hosts:\n127.0.0.1\tlocalhost.localdomain\t\u003cnombre\u003e\tlocalhost ::1\tlocalhost.localdomain\t\u003cnombre\u003e\tlocalhost 3.4. (Opcional) Cambiar el color a la salida de pacman Si utilizamos Arch, ejecutamos:\nsed -i 's/#Color/Color/' /etc/pacman.conf 3.5. (Opcional) Añadimos 8GB de memoria SWAP Si utilizamos Arch, ejecutamos:\nfallocate -l 8192M /swapfile 3.6. (Opcional) Nuevo usuario con permisos sudo Si utilizamos Arch, ahora usaremos la utilidad visudo para editar los permisos de grupo para ejecutar comandos administrativos con sudo.\npacman -S sudo EDITOR=nano visudo Descomentamos la siguiente línea:\n## Uncomment to allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL Creamos un nuevo grupo sudo con:\nsudo groupadd sudo Creamos un nuevo usuario con:\nuseradd -m -G sudo nombre_usuario Ponemos una contraseña al nuevo usuario:\npasswd nombre_usuario Una vez tengamos el nuevo usuario, borraremos el usuario alarm o el usuario por defecto de la instalación (en caso de existir uno).\nuserdel alarm Modificamos los permisos del usuario que habíamos creado durante la instalació y lo añadidos al grupo sudo con el siguiente comando:\nsu - usermod -aG sudo username Reiniciamos el sistema:\nreboot 3.6. Claves SSH En el siguiente paso es necesario copiar la clave pública al archivo ~/.ssh/authorized_keys de la máquina. Para ello se utilizará el siguiente comando:\nssh-copy-id -i \u003cidentity.pub\u003e pi@\u003cip de la máquina\u003e Ahora nos pedirá la contraseña de nuestra clave SSH y nos conectaremos a la máquina mediante:\nssh pi@\u003cip de la máquina\u003e 3.7. (Optional) Configuración Wi-Fi Reproducido de la guía: los primeros pasos después de haber instalado Arch 5.karog, on ArchLinux ARM forums provee una manera de conectarse al Wi-Fi es muy sencilla. Como root, haz los siguientes pasos:\nnano /etc/systemd/network/wlan0.network para configurar la interfaz wlan0: Añade el siguiente contenido al archivo: [Match] Name=wlan0 [Network] DHCP=yes wpa_passphrase \"\u003cSSID\u003e\" \"\u003cPASSWORD\u003e\" \u003e /etc/wpa_supplicant/wpa_supplicant-wlan0.conf. Sustituye y por el nombre y la contraseña de su red Wi-Fi. systemctl enable wpa_supplicant@wlan0 para habilitar el Wi-Fi al arrancar systemctl start wpa_supplicant@wlan0 para conectarse al Wi-Fi. Ya está todo listo. Aunque, si alguna vez quieres quitar la conexión Wi-Fi (por ejemplo, cuando quieras hacer que se conecte sólo a través de ethernet):\nsystemctl stop wpa_supplicant@wlan0 systemctl disable wpa_supplicant@wlan0 rm /etc/wpa_supplicant/wpa_supplicant-wlan0.conf rm /etc/systemd/network/wlan0.network 4. Instalación de paquetes y programas 4.1. Paquetes básicos git y wget: sudo pacman -S -y git wget yay: Los ayudantes de AUR más utilizados en Arch Linux son Yaourt y Packer. Puede utilizarlos fácilmente para las tareas de gestión de paquetes de Arch Linux, como la instalación y actualización de paquetes. Sin embargo, los dos han sido descontinuados en favor de yay, abreviatura de Yet Another Yaourt. Yay es un moderno ayudante de AUR escrito en el lenguaje GO. Tiene muy pocas dependencias y soporta el completamiento de pestañas de AUR para que no tengas que escribir los comandos en su totalidad.\nLo instalamos con los siguientes comandos en el directorio opt por ser la carpeta destinada a almacenar los programas externos.\ncd /opt sudo git clone https://aur.archlinux.org/yay.git sudo chown -R $USER:$USER ./yay makepkg -si Actualizamos los repos con:\nsudo yay -Syu 4.2 Instalar zsh, Oh my zsh y Powerlevel10k Instalamos zsh y oh-my-zsh con los siguientes comandos:\nsudo pacman -S zsh sh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\" Para instalar Powerlevel10k, necesitamos instalar las fuentes necesarias mediante el comando:\nyay -Sy --noconfirm ttf-meslo-nerd-font-powerlevel10k sudo pacman -S powerline-common awesome-terminal-fonts Como alternativa lo podremos hacer manualmente si se descarga y se pega las 4 fuentes .ttf Meslo Nerd en /usr/local/share/fonts. Deben tener los permisos 644 (-rw-r–r–)6.\nMesloLGS NF Regular.ttf MesloLGS NF Bold.ttf MesloLGS NF Italic.ttf MesloLGS NF Bold Italic.ttf Creamos la carpeta /usr/local/share/fonts:\nsudo mkdir /usr/local/share/fonts cd /usr/local/share/fonts Descargamos las fuentes:\nsudo wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf Instalamos y configuramos Powerlevel10k con:\nyay -S --noconfirm zsh-theme-powerlevel10k-git echo 'source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme' \u003e\u003e~/.zshrc 4.2. Docker y docker compose Se recomienda instalar docker rootless (4.2.2.) pero puede dar problemas con algunos contenedores docker. En caso de no que quieras pegarte con esos problemas o que estes configurando un servidor en producción que requiera seguridad, sigue el siguiente apartado (4.2.1.).\n4.2.1. Instalación en Arch Instalamos docker de los repositorios oficiales:\nsudo pacman -Sy docker docker-compose Añadir usuario al grupo docker:\nsudo usermod -aG docker ${USER} Activamos el demonio de docker:\nsudo systemctl enable docker.service sudo systemctl enable docker.socket Si da error reiniciamos la máquina.\n4.2.2 Docker rootless Arch: sudo pacman -S shadow sudo pacman -S fuse-overlayfs Añade kernel.unprivileged_userns_clone=1 in /etc/sysctl.conf:\nsudo nano /etc/sysctl.conf sudo sysctl --system sudo touch /etc/subuid \u0026\u0026 sudo touch /etc/subgid su - echo \"pi:100000:65536\" \u003e\u003e /etc/subgid echo \"pi:100000:65536\" \u003e\u003e /etc/subuid exit sudo systemctl disable --now docker.service docker.socket curl -fsSL https://get.docker.com/rootless | sh systemctl --user start docker systemctl --user enable docker sudo loginctl enable-linger $(whoami) export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock Se prueba con docker run -d -p 8080:80 nginx.\nSi queremos que se arranque en el arranque, escribimos los siguientes comandos:\nsudo systemctl enable docker.service sudo systemctl enable containerd.service 4.3 Gestor de ventanas i3wm Siguiendo los pasos de Low Orbit Flux - Arch Linux How to Install i3 Gaps,instalamos el paquete xorg-xinit que instala xinit. El programa xinit permite al usuario iniciar manualmente un servidor de visualización Xorg. Instalamos el servidor de ventanas X xorg y xterm.\nsudo pacman -S xorg xorg-xinit xterm Instalamos unos extras opcionales:\npacman -S xorg-xeyes xorg-xclock Instalamos todo el grupo de i3, priorizamos i3-gaps sobre i3-wm por ser un fork el primero del segundo.\nsudo apt install i3-w Instalamos los drivers necesarios para nuestra máquina.\nsudo pacman -S nvidia nvidia-utils # NVIDIA sudo pacman -S xf86-video-amdgpu mesa # AMD sudo pacman -S xf86-video-intel mesa # Intel Seguimos los pasos de Low Orbit Flux - Arch Linux How to Install i3 Gaps hasta terminarlos.\n5. Referencias ArchLinux, Arch ↩︎\nWikipedia, Logical Volume Manager (Linux) ↩︎ ↩︎\nWikipedia, LUKS (Linux Unified Key Setup) ↩︎ ↩︎\nArchLinux, Installation Guide ↩︎\nGitHub - TheZoc/Setting up guide for ArchLinux on Raspberry Pi.md ↩︎ ↩︎\nDebian Documentation, Fonts ↩︎\n",
    "description": "",
    "tags": [
      "GNU/Linux",
      "Arch"
    ],
    "title": "Instalación y configuración de Arch",
    "uri": "/gnu_linux/arch/arch_configuration/"
  },
  {
    "content": "Instalar requirements.txt Pipenv # Install pip install pipenv # Install a packages for the project pipenv install \u003cpackage\u003e # Activate Virtual Env pipenv shell # Run a script in the virtual env pipenv run python \u003cscript.py\u003e Generate requirements.txt:\npipenv lock -r \u003e\u003e requirements.txt ",
    "description": "",
    "tags": null,
    "title": "Python",
    "uri": "/development/python/"
  },
  {
    "content": "En esta entrada se realizará un repaso de los comandos básicos del cli kubectl que se pueden aplicar a los objetos de Kubernetes. Algunos de los ejemplos de los objetos de Kubernetes son los Pods, ReplicaSets, Deployments, Namespaces, etc.\nNamespaces Se utilizan namespaces en Kubernetes para organizar los objetos del clúster. A fin de cuentas, un namespace representa una carpeta que contiene un conjunto de objetos. Por defecto, kubectl interactúa con el namespace default. Para usar otro tipo de de namespace es necesario utilizar el flag --namespace, por ejemplo --namespace=ejemplo. Si se quiere interacturar con todo el conjunto de namespaces, se utiliza el flag --all-namespace 1.\nContexts En caso de querer cambiar el namespace predreterminado de forma permanente, se puede utilizar un context. Al utilizarlo se registra en el archivo de configuración de kubectl, almacenado en HOME/.kube/config. Para crear un context con un nuevo nobre predeterminado de namespace, ejecutar 1:\nkubectl config set-context my-context --namespace=nuevonamespacepordefecto kubectl config use-context my-context Objetos de la API de Kubernetes Cada objeto de Kubernetes está representado por un recurso RESTful y existe en una ruta HTTP única a la API de Kubernetes. Los recursos se representan como archivos JSON o YAML. A través del comando kubectl, se podrá acceder a dichos objetos. Por ejemplo, mediante el comando kubectl get se puede acceder a cualquier recurso del namespace por defecto 1:\nkubectl get \u003cnombre-recurso\u003e En caso de querer un recurso más específico:\nkubectl get \u003cnombre-recurso\u003e \u003cnombre-obj\u003e En caso de querer obtener más información del objeto en formato JSON o YAML, se pueden agregar los flags -o json o -o yaml respectivamente. Esta información no es tan legible para los humanos.\nOtra opción para obtener más detalles del objeto legible para humanos es usar el comando kubectl describe:\nkubectl describe \u003cnombre-recurso\u003e \u003cnombre-obj\u003e Creación, actualización o destrucción de objetos de Kubernetes Como se ha mencionado anteriormente, los objetos o recursos de Kubernetes se representan mediante archivos JSON o YAML. Para crear, actualizar o eliminar dichos objetos se utilizan ese tipo de archivos. Por ejemplo, en caso de querer crear o actualizar un objeto almacenado en ejemplo.yaml se ejecuta:\nkubectl apply -f ejemplo.yaml En caso de desear realizar ediciones intectivas en lugar del archivo local, se puede utilizar el comando kubectl edit para descargar la versión más reciente y lanza un editor. Después de guardar el archivo se subirá el archivo y se actualizará automáticamente.\nkubectl edit \u003cnombre-recurso\u003e \u003cnombre-obj\u003e El comando kubectl apply también guardará el historial de versiones de los archivos de configuración. Se pueden acceder a estos registros mediante las opciones edit-last-applied, set-last-applied, y view-last-applied.\nkubectl apply -f myobj.yaml view-last-applied Para eliminar un objeto, simplemente se necesita ejecutar:\nkubectl delete -f ejemplo.yaml Depuración kubectl también tiene una serie de comandos para depurar sus contenedores. Para ver los registros de un contenedor en ejecución, se ejecuta:\nkubectl logs \u003cnombre-pod\u003e Si existen varios contenedores en el pod, se puede elegir el contenedor que desea inspeccionar con el flag -c.\nDe forma predeterminada, kubectl logs enumera los registros y salidas actuales. Si, en cambio, se quiere transmitir continuamente los registros a la terminal, se puede agregar el flag -f (follow) en la línea de comandos.\nTambién se puede usar el comando exec para ejecutar un comando en un contenedor en ejecución:\nkubectl exec -it \u003cpod-name\u003e -- bash Esto proporcionará una consola interactiva dentro del contenedor en ejecución para realizar una depuración más detallada.\nO’Reilly, Kubernetes: Up and Running ↩︎ ↩︎ ↩︎\n",
    "description": "",
    "tags": [
      "teoría",
      "kubernetes",
      "devops"
    ],
    "title": "Comandos básicos de Kubernetes",
    "uri": "/sysadmin/kubernetes/basic_commands_kubernetes/"
  },
  {
    "content": "Administración de sistemas Tabla de Contenidos Comandos útiles para administrar sistemas GNU/linux Docker Comandos útiles de docker Kubernetes Introducción a Kubernetes Componentes de la arquitectura de Kubernetes Objetos básicos de Kubernetes Comandos básicos de Kubernetes Primeros pasos con Minikube Ansible Hardening de OS y SSH ",
    "description": "",
    "tags": null,
    "title": "Administración de sistemas",
    "uri": "/sysadmin/"
  },
  {
    "content": "En esta entrada se instalará y se configurará un arranque dual de múltiples distribuciones de GNU/Linux (Debian y ParrotOS) mediante rEFInd. Si usas GRUB para arrancar múltiples distribuciones y nunca has oído hablar de rEFInd entonces esta publicación es para ti. Hemos seguido las indicación de este artículo.\nNota importante: la instalación que se describe a continuación se ha realizado sobre un disco de almacenamiento limpio. Si tienes datos que quieras guardar, se recomienda encarecidamente hacer una copia de seguridad de todos los datos para realizar la instalaciones sobre un disco vacío.\nRequisitos Disco de almacenamiento limpio. USB flasheado con Debian y posteriormente con Parrot Revisar los conceptos básicos Conceptos básicos Debian GNU/Linux es un sistema operativo libre, desarrollado por miles de voluntarios de todo el mundo, que colaboran a través de Internet.\nLa dedicación de Debian al software libre, su base de voluntarios, su naturaleza no comercial y su modelo de desarrollo abierto la distingue de otras distribuciones del sistema operativo GNU1.\nLVM es una implementación de un gestor de volúmenes lógicos para el núcleo Linux. LVM incluye muchas de las características que se esperan de un administrador de volúmenes, incluyendo:\nRedimensionado de grupos lógicos Redimensionado de volúmenes lógicos Instantáneas de sólo lectura (LVM2 ofrece lectura y escritura) RAID0 de volúmenes lógicos. LVM no implementa RAID1 o RAID5, por lo que se recomienda usar software específico de RAID para estas operaciones, teniendo las LV por encima del RAID2. En esta configuración no se usará RAID.\nLUKS es una especificación de cifrado de disco creado por Clemens Fruhwirth, originalmente destinado para Linux. Mientras la mayoría del software de cifrado de discos implementan diferentes e incompatibles formatos no documentados, LUKS especifica un formato estándar en disco, independiente de plataforma, para usar en varias herramientas. Esto no sólo facilita la compatibilidad y la interoperabilidad entre los diferentes programas, sino que también garantiza que todas ellas implementen gestión de contraseñas en un lugar seguro y de manera documentada. La implementación de referencia funciona en Linux y se basa en una versión mejorada de cryptsetup, utilizando dm-crypt como la interfaz de cifrado de disco3.\nUn boot loader carga un kernel del sistema operativo en la memoria y lo ejecuta. Un boot manager entrega el control a otro programa de arranque. GRUB es tanto un boot loader como un boot manager. Refind es sólo un boot manager.\nOtro concepto fundamental es conocer la diferencia entre EFI/UEFI y BIOS.\nLVM es una implementación de un gestor de volúmenes lógicos para el núcleo Linux. LVM incluye muchas de las características que se esperan de un administrador de volúmenes, incluyendo:\nRedimensionado de grupos lógicos Redimensionado de volúmenes lógicos Instantáneas de sólo lectura (LVM2 ofrece lectura y escritura) RAID0 de volúmenes lógicos. LVM no implementa RAID1 o RAID5, por lo que se recomienda usar software específico de RAID para estas operaciones, teniendo las LV por encima del RAID2. En esta configuración no se usará RAID.\nLUKS es una especificación de cifrado de disco creado por Clemens Fruhwirth, originalmente destinado para Linux. Mientras la mayoría del software de cifrado de discos implementan diferentes e incompatibles formatos no documentados, LUKS especifica un formato estándar en disco, independiente de plataforma, para usar en varias herramientas. Esto no sólo facilita la compatibilidad y la interoperabilidad entre los diferentes programas, sino que también garantiza que todas ellas implementen gestión de contraseñas en un lugar seguro y de manera documentada. La implementación de referencia funciona en Linux y se basa en una versión mejorada de cryptsetup, utilizando dm-crypt como la interfaz de cifrado de disco3.\nEn la tabla de particiones Tabla de particiones se utiliza el formato ext4 para las particiones porque mejora la velocidad de entrada y salida y utiliza menos CPU que los formatos ext3 y ext2. Se recomiendan como mínimo los siguientes valores:\nParticion Tamaño recomendado Asignado Debian Asignado Propio Contiene / \u003e= 750MB 22GB 64GB /etc, /bin, /sbin, /lib, /dev, /usr /usr \u003e= 4-6GB 0 0 Programas de usuario, lib y docs /var \u003e= 2-3GB 32GB 112GB Variables de datos como emails /tmp \u003e= 100MB 16GB 32GB Páginas web, caché de paquetes, datos temporales /home \u003e= 100MB 200GB 288GB Directorio con Documentos, Descargas, … /boot \u003e= 256MB 500MB 512GB Partición Primaria, ext4 o ext2, no se recomienda cifrarla /boot/efi \u003e= 100MB 250MB 0 No se recomienda cifrarla y bootable flag: on /swap \u003e= 8GB 16GB 16GB Área de intercambio GParted Mediante GParted ejecutado desde un USB live, se eliminan todas las particiones y se crea una nueva tabla de particiones GPT(GUID Partition Table). GPT es un formato utilizado por los sistemas con EFI y es una alternativa moderna al formato MBR(Master Boot Record) que se utiliza en los sistemas con BIOS.\nUEFI requiere que cada disco de arranque tenga una partición especial llamada EFI System Partion (ESP). El ESP es una simple partición FAT16 o FAT32 con los flags de partición boot y esp. El ESP almacena archivos ejecutables EFI, a pesar que son de un tamaño inferior a 100MB, algunos sistemas operativos requieren que la partición tenga una capacidad de 500MB. Por lo tanto, se procede a crear una partición de 550MB de tipo primaria, fat32, con la etiqueta ESP y efi como el nombre de la partición. Se aplican los cambios y en la opción de manage flags se selecionan boot y esp.\nEl siguiente paso es crear dos particiones ext4 para los sistemas operativos Debian y ParrotOS. Por ejemplo, se puede asignar 250GB a Debian, 150GB a Parrot y el resto puede ser una partición de datos que sea compartida. A cada partición se recomienda asignar su correspondiente etiqueta.\nInstalación de Debian Accedemos a la instalación en modo experto con gráfica y avanzamos hasta la detección de discos y particiones. Creamos las siguientes particiones:\n500MB para una partición EFI común. 500MB para la partición boot de Debian. 500MB para la partición boot de ParrotOS. El resto en una partición donde irán los distintos sistemas operativos. Primero se crea un volumen cifrado en la partición con la etiqueta all-Operative-Systems indicando que no se formatee o se borre la partición. Después se crea un volumen LVM de grupo y los siguientes volúmenes lógicos:\nVolúmenes Debian: 8GB para SWAP. 250GB para root. 100GB para home. Volúmenes ParrotOS: 8GB para SWAP. 250GB para root. 100GB para home. Volúmenes datos comunes: El resto para datos comunes. Se asigna a cada volumen lógico de Debian el punto de montaje correspondiente y se termina la instalación eligendo el entorno de escritorio al gusto del consumidor.\nInstalación de ParrotOS Como ParrotOS es una distribución derivada de Debian, la instalación se realiza igual que en el apartado anterior. Se accede al modo experto de instalación gráfica y se avanza hasta el punto de detección de discos. Como la partición de los sistemas operativos está cifrada, es necesario descifrarla y detectar el grupo de volúmenes LVM. Para ello, saldremos de la sección de detección de discos y iremos a la sección de abrir una terminal o shell. Lo primero será desencriptar la partición cifrada con:\nNota: la partición /dev/sdaX debe corresponder a la cifrada y el nombre debe ser el asignado en la etiqueta.\ncryptsetup luksOpen /dev/sdaX all-Operative-Systems Posteriormente detectaremos el grupo de los volúmenes LVM con:\nvgchange -a y Nota: es probable que los siguientes pasos no funcionen a la primera y sea necesario completarlos con la siguiente sección. Por lo que se podría obviar el final de esta sección e instalar el grub directamente.\nUna vez ejecutados los comandos anteriores, seguir con la instalación hasta la instalación del GRUB. Volvemos a abrir una terminal e identificamos el UUID de la partición cifrada con:\nblkid /dev/sdaX Lo siguiente es modificar el archivo /etc/crypttab:\nnano /etc/crypttab Y se añade el siguiente contenido, donde el UUID es el obtenido del comando blkid:\nall-Operative-Systems UUID=524c1ad6-fabe-4f32-9bb0-c8db1286b262 none luks Terminamos la instalación y reiniciamos el sistema operativo. Si todo funciona correctamente, ya estaría terminado. Lo más habitual es que al intentar arrancar el sistema operativo no pueda abrir la partición cifrada, ni los volúmenes cifrados. Entonces, abrirá una terminal de initramfs y tendremos que configurar los siguientes pasos.\nNo abre la partición cifrada y salta una terminal de initramfs En caso de obtener una terminal con initramfs, será necesario volver a repetir los pasos de descifrar la partición y abrir el grupo de volúmenes cifrados como se menciona anteriormente.\nAbrimos la partición cifrada con:\ncryptsetup luksOpen /dev/sdaX all-Operative-Systems Posteriormente detectaremos el grupo de los volúmenes LVM con:\nvgchange -a y Para arrancar el sistema, simplemente utilizamos el siguiente comando:\nexit Nos llevará al login y entraremos con las credenciales creadas en la instalación. Una vez iniciado el sistema operativo, abrimos una terminal y detectamos el UUID de la partición cifrada. La X de sdaX corresponde al número de la partición cifrada, si no se conoce simplemente utilizar el comando blkid.\nblkid /dev/sdaX Editamos el archivo /etc/crypttab con nano:\nsudo nano /etc/crypttab Añadimos lo siguiente:\nall-Operative-Systems UUID=524c1ad6-fabe-4f32-9bb0-c8db1286b262 none luks Una vez terminado se utiliza el siguiente comando para actualizar initramfs:\nsudo update-initramfs -u Reiniciamos el sistema operativo con:\nsudo reboot Instalación rEFInd La instalación de rEFInd se realiza con el siguiente comando:\nsudo apt install refind Wikipedia, Debian ↩︎\nWikipedia, Logical Volume Manager (Linux) ↩︎ ↩︎\nWikipedia, LUKS (Linux Unified Key Setup) ↩︎ ↩︎\n",
    "description": "",
    "tags": [
      "debian",
      "parrot",
      "rEFInd",
      "luks",
      "administración de sistemas"
    ],
    "title": "Instalación de Debian y ParrotOS con arranque dual en una partición cifrada con LUKS, volúmenes LVM y rEFInd",
    "uri": "/gnu_linux/debian/multiboot_refind_luks/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar una Raspberry Pi y hacerla accesible desde internet.\nAsignar IP fija a raspberry pi Para configurar una IP estática en derivados de Debian, debemos editar el fichero /etc/dhcpcd.conf con el comando:\nsudo nano /etc/dhcpcd.conf Descomentamos y modificamos las líneas que están comentandas para la IP estática de manera que nos quedaría lo siguiente:\ninterface eth0 static ip_address=192.168.1.200/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 Una vez guardado, reseteamos la raspberry:\nsudo reboot Y una vez encendida lo comprobamos con:\nip a Mapeo de IP a nombres más legibles Modificamos el archivo /etc/hosts en cada máquina que se quiera mapear la dirección IP a un nombre más legible con:\nsudo nano /etc/hosts Y añadimos al final:\n192.168.1.200 pi.local pi Seguridad Configuración SSH Una opción para hardenizar la configuración SSH es mediante la colección de ansible [ssh_hardening]](https://github.com/dev-sec/ansible-collection-hardening/tree/master/roles/ssh_hardening). Para la simplicación de esta sección, editaremos el archivo /etc/ssh/sshd_config y añadiremos lo siguiente.\nPort 2251 PermitRootLogin no ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no AuthenticationMethods publickey PubkeyAuthentication yes AllowUsers pi X11Forwarding no Banner /etc/issue Validamos la configuración del fichero sshd_config es correcta con los siguientes comandos:\n#Versión simple sudo sshd -t #Versión extendida sudo sshd -T Se guardan los cambios y se reinicia el servicio con:\nsudo systemctl restart ssh Ahora el comando para conectarnos es:\nssh -p 2251 pi@192.168.1.200 En caso de olvidar el puerto escogido, se puede hallar mediante un escaneo de puertos con el comando:\nsudo nmap -p 1-65535 -T4 -A -v \u003cip-servidora\u003e Configuración de fail2ban Se instala con los siguientes comandos:\nsudo apt-get update sudo apt-get install fail2ban Fail2ban trae un archivo de configuración de ejemplo: /etc/fail2ban/jail.conf. Es recomendable copiarlo y guardarlo en el mismo directorio con el nombre jail.local.\nsudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local Editamos el archivo jail.local y modificamos lo siguiente:\n# \"bantime\" is the number of seconds that a host is banned. bantime = 604800 # 7 days # A host is banned if it has generated \"maxretry\" during the last \"findtime\" # seconds. findtime = 3600 # \"maxretry\" is the number of failures before a host get banned. maxretry = 3 [sshd] # To use more aggressive sshd modes set filter parameter \"mode\" in jail.local: # normal (default), ddos, extra or aggressive (combines all). # See \"tests/files/logs/sshd\" or \"filter.d/sshd.conf\" for usage example and details. #mode = normal enable = true port = 2251 logpath = %(sshd_log)s backend = %(sshd_backend)s [traefik-auth] # to use 'traefik-auth' filter you have to configure your Traefik instance, # see `filter.d/traefik-auth.conf` for details and service example. enable = true port = http,https logpath = /var/log/traefik/access.log Como se puede apreciar, hemos activado los módulos de sshd y traefik con enable = true.\nUna vez modificado, reiniciamos el servicio con:\nsudo service fail2ban restart Para ver qué IPs han sido bloqueadas, se puede utilizar el siguiente comando:\nsudo cat /var/log/fail2ban.log | grep 'Ban' Para comprobar los módulos o jaulas activas, se utiliza:\nsudo fail2ban-client status Configuración del firewall UFW Se instala con:\nsudo apt-get install ufw Por defecto está desactivado, entonces, empezaremos configurando que deniegue cualquier tipo de conexión por cualquier puerto con el comando:\nsudo ufw default deny incoming Por otro lado, permitiremos las salidas de paquetes para cualquier puerto:\nsudo ufw default allow outgoing Ahora, permitiremos las conexiones de entrada de SSH en el puerto 2251 y para los servicios web en los puertos 80 (protocolo HTTP) y el 443 (protocolo HTTPS).\nsudo ufw allow 80,443,2251/tcp Para ver la regla añadida, se utiliza el comando:\nsudo ufw show added Se activan las reglas con el comando:\nsudo ufw enable Para ver el estado del cortafuegos se puede ejecutar:\nsudo ufw status verbose Mantener el sistema actualizado Automatizaremos la actualización de paquetes utilizando la herramienta crontab. Por ejemplo, actualizaremos el paquete ssh todos los días a las 7 de la mañana y que se guarden los logs en el archivo /var/log/ssh_update.txt.\nsudo crontab -e Añadimos la siguiente línea:\n0 7 * * * sudo apt update \u0026\u0026 sudo apt-get install ssh -y \u003e\u003e /var/log/ssh_update.txt 2\u003e\u00261 Configuración del router Entramos en la configuración del router buscando la IP 192.168.1.1 en un navegador. Cambiaremos la contraseña por defecto de administración y la SSID y contraseña del Wi-Fi.\nRecomendamos seguir la entrada de Configuración de seguridad y privacidad un router\n",
    "description": "",
    "tags": [
      "raspberry pi"
    ],
    "title": "Configurar una Raspberry Pi para hacerla accesible desde internet",
    "uri": "/technological_sovereignty/raspberry/2021-11-01_raspberrypi-internet/"
  },
  {
    "content": "Instalación en local de Kubernetes Existen varias herramientas que se pueden utilizar para desplegar Kubernetes en uno o muchos clusters. Algunos de ellos serían:\nMinikube Kind Docker Desktop MicroK8s K3S Minikube es el método más fácil y preferido para crear una configuración de Kubernetes de forma local. Se utiliza para administrar un clúster de un solo nodo aunque ya existe una funcionalidad experimental que es compatible con los clústeres de múltiples nodos.\nMinikube El proyecto minikube es una implementación local de clusters de Kubernetes para Linux, mac0S y Windows. Su objetivo es ser la mejor herramienta para desarrollar localmente aplicaciones de Kubernetes 1.\nLos primeros pasos con minikube se pueden seguir en la documentación oficial y son los siguientes 2:\nRequisitos 2 CPUs o más 2GB de memoria RAM 20GB de espacio en disco Conexión a internet Manejador de contenedores o máquinas virtuales, como: Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, o VMWare. Instalación de minikube Para Linux hay tres opciones:\nPaquete binario: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube Paquete Debian: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb sudo dpkg -i minikube_latest_amd64.deb Paquete RPM: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm sudo rpm -ivh minikube-latest.x86_64.rpm Para empezar con minikube ejecutar:\nminikube start Para parar de forma segura minikube ejecutar:\nminikube stop Instalación de kubernetes Kubernetes puede instalarse localmente en máquinas virtuales o directamente en el sistema operativo. Existen herramientas como Ansible o kubeadm para automatizar la instalación.\nCon la herramienta CLI kubectl se pueden administrar, desplegar y configurar los recursos y las aplicaciones del cluster de Minikube, por lo tanto se instala con los siguientes comandos:\nsudo apt-get update \u0026\u0026 sudo apt-get install -y apt-transport-https gnupg2 curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubectl Para los dellates de los comandos de kubectl se puede buscar en el libro de kubectl, en la documentación oficial de Kubernetes o en su repositorio github.\nUn paso muy habitual después de la instalación, es configurar y habilitar la autocompletado de comandos de kubectl:\nsudo apt install -y bash-completion source /usr/share/bash-completion/bash-completion source \u003c(kubectl completion bash) echo 'source \u003c(kubectl completion bash)' \u003e\u003e~/.bashrc Otros paquetes relevantes a instalar son los siguientes:\nkubeadm: sirve para administrar o automatizar la instalación kubelet: es un agente que se ejecuta en cada nodo y se comunica con los componentes del plano de control kubernetes-cni: permite configurar los elementos de red sudo apt-get install kubelet kubeadm kubernetes-cni GitHub, minikube ↩︎\nMinikube, Cómo empezar ↩︎\n",
    "description": "",
    "tags": [
      "minikube",
      "kubernetes",
      "devops"
    ],
    "title": "Primeros pasos con Minikube",
    "uri": "/sysadmin/kubernetes/minikube/"
  },
  {
    "content": "DevOps Tabla de Contenidos ",
    "description": "",
    "tags": null,
    "title": "DevOps",
    "uri": "/devops/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar un servidor DNS en una Raspberry Pi.\nInstalación de DNSMasq sudo apt install -y dnsmasq Configuración de dnsmasq sudo nano /etc/dnsmasq.conf Buscamos (CTRL+W) y descomentamos las siguientes líneas eliminando el signo de almohadilla (#):\ndomain-needed - Configuramos el servidor DNS para que no reenvíe los nombres sin un punto (.) o un nombre de dominio a los servidores upstream. Los nombres sin punto o dominio se quedan en la red local. bogus-priv - Impide que el servidor DNS reenvíe las consultas de búsqueda inversa del rango de IP local a los servidores DNS ascendentes. Esto previene la filtración de la red local a los servidores upstream. no-resolv - Deja de leer los servidores de nombres upstream del archivo /etc/resolv.conf, confiando en cambio en los de la configuración de DNSMasq. Buscamos (CTRL+W) y eliminamos la siguiente línea:\n#sever=/localnet/192.168.0.1 La sustitimos por las DNS de Cloudflare:\nserver=1.1.1.1 server=1.0.0.1 Este paso hace uso de los servidores DNS de Google para los servidores de nombres ascendentes.\nBuscamos (CTRL+W) la siguiente línea:\n#cache-size=150 Descomentamos y cambiamos el tamaño de la caché a 1000:\ncache-size=1000 Aumentar el tamaño de la caché ahorra un mayor número de peticiones DNS a la caché de DNSMasq. El rendimiento de la red mejora porque el tiempo de búsqueda de DNS se reduce.\nGuardamos el archivo con CTRL+X, luego presionamos Y y pulsamos Enter para guardar los cambios.\nReiniciamos DNSMasq para aplicar los cambios:\nsudo systemctl restart dnsmasq Comprobamos el estado del servidor DNS con:\nsudo systemctl status dnsmasq Añadir una url sudo nano /etc/dnsmasq.d/example.conf Añadimos la ip local asociada a un nombre de dominio, por ejemplo home.localhost.\naddress=home.localhost/192.168.1.130 Probar el servidor DNS en una sudo apt install -y dnsutils ",
    "description": "",
    "tags": [
      "raspberry pi",
      "DNS",
      "redes",
      "administración de sistemas"
    ],
    "title": "Configuración de servidor DNS en una Raspbery Pi",
    "uri": "/technological_sovereignty/raspberry/2021-11-22_configurar_dns_en_raspberry_pi/"
  },
  {
    "content": "Ansible ",
    "description": "",
    "tags": null,
    "title": "Ansible",
    "uri": "/sysadmin/ansible/"
  },
  {
    "content": "Privacidad Tabla de Contenidos Capitalismo de vigilancia Privacidad Aplicaciones de móvil ",
    "description": "",
    "tags": null,
    "title": "Privacidad",
    "uri": "/privacy/"
  },
  {
    "content": "Seguridad Tabla de Contenidos Recopilación de herramientas de seguridad ",
    "description": "",
    "tags": null,
    "title": "Seguridad",
    "uri": "/security/"
  },
  {
    "content": "Investigación Académica Notes and first steps to realize a research in Computer Science and Intelligent Systems fields.\nTabla de Contenidos ",
    "description": "",
    "tags": null,
    "title": "Investigación académica",
    "uri": "/research/"
  },
  {
    "content": "Análisis de datos Tabla de Contenidos ",
    "description": "",
    "tags": null,
    "title": "Análisis de datos",
    "uri": "/data_analysis/"
  },
  {
    "content": "Filosofía Notas sobre filosofía.\nTabla de Contenidos Etica I Teoría de Señales ",
    "description": "",
    "tags": null,
    "title": "Filosofía",
    "uri": "/philosophy/"
  },
  {
    "content": "LineageOS Tabla de Contenidos Instalación de LineageOS ",
    "description": "",
    "tags": null,
    "title": "LineageOS",
    "uri": "/gnu_linux/lineageos/"
  },
  {
    "content": "Blog Tabla de Contenidos Aplicaciones de móvil Despliegue de un servidor multimedia Jellyfin con descargas automatizadas con Torrent Instalación y configuración de un servidor VSCode y expuesto con Traefik en docker-compose en una Raspberry Pi Instalación y configuración de NextcloudPi con Docker o con la imagen completa de Nextcloud con Let's Encrypt y Traefik en Docker Compose en una Raspberry Pi Configuración de seguridad y privacidad un router Instalación de Debian y ParrotOS con arranque dual en una partición cifrada con LUKS, volúmenes LVM y rEFInd Despliegue de un servidor multimedia Jellyfin Configuración del Plymouth Configurar una Raspberry Pi para hacerla accesible desde internet Configuración de servidor DNS en una Raspbery Pi Instalación y configuración de una Raspbery Pi Comandos útiles de docker Configuración de Debian Instalación de Debian con volúmenes LVM cifrados con LUKS Permisos en GNU/Linux Instalación y configuración de NextcloudPi Comandos básicos de Kubernetes Objetos básicos de Kubernetes Primeros pasos con Minikube Componentes de la arquitectura de Kubernetes Introducción a Kubernetes Multilenguaje en Angular 10/9/8 con la librería ngx-translate (i18n) Git Gitflow Base de datos SQL o NoSQL Configuración de tu propio servidor Nextcloud Colección de herramientas Primeros pasos con una Raspberry Pi Ejemplo de sintaxis de Markdown ",
    "description": "",
    "tags": null,
    "title": "Blog",
    "uri": "/blog/"
  },
  {
    "content": "ESP8266 Cómo configurar el ESP8266.\nTabla de Contenidos Instalación y configuración de WLED en ESP8266 ",
    "description": "",
    "tags": null,
    "title": "ESP8266",
    "uri": "/technological_sovereignty/esp8622/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "Categories",
    "uri": "/categories/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "mycroft",
    "uri": "/tags/mycroft/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "picroft",
    "uri": "/tags/picroft/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "raspberry pi",
    "uri": "/tags/raspberry-pi/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "soberanía tecnológica",
    "uri": "/categories/soberan%C3%ADa-tecnol%C3%B3gica/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "Tags",
    "uri": "/tags/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "Ética I",
    "uri": "/tags/%C3%A9tica-i/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "Filosofía",
    "uri": "/categories/filosof%C3%ADa/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "android",
    "uri": "/tags/android/"
  },
  {
    "content": "En esta entrada se exponen varias aplicaciones android de software libre que pueden descargar desde F-Droid.\nF-Droid AntennaPod\nAurora Store\nArchivos\nCalendario\nContactos\nF-Droid: repositorios\nF-Droid Archive\nF-Droid\nGuardian Project Archive\nGuardiann Project Official Releases\nPartido Interdimensional Pirata: https://fdroid.partidopirata.com.ar/fdroid/repo?fingerprint=3DF6969EA3A2186D8A5DB00884B3F42F164931E8CFAFD7CC48263CAD1361A1D5\narchive.newpipe.net/fdroid/repo: https://archive.newpipe.net/fdroid/repo?fingerprint=E2402C78F9B97C6C89E97DB914A2751FDA1D02FE2039CC0897A462BDB57E7501\nFedilab\nGalería\nGitFox\nGitNex\nGrabadora\nHacker’s Keyboard\nIceCatMobile\nJami\nK-9 Mail\nLibreOffice Viewer\nLibrera\nMarkor\nMoneyBuster\nMusica\nNewPipe\nNextcloud\nOpenkeyChain\nOpenTrack\nOSM DashBoard\nOsmAnd~\nProtonmail\nRiseUpVPN\nStandart Notes\nTutanota\nUntrackme\nVLC\n",
    "description": "",
    "tags": [
      "f-droid",
      "android"
    ],
    "title": "Aplicaciones de móvil",
    "uri": "/blog/2022-06-03_apps_movil/"
  },
  {
    "content": "En esta entrada se exponen varias aplicaciones android de software libre que pueden descargar desde F-Droid.\nF-Droid AntennaPod\nAurora Store\nArchivos\nCalendario\nContactos\nF-Droid: repositorios\nF-Droid Archive\nF-Droid\nGuardian Project Archive\nGuardiann Project Official Releases\nPartido Interdimensional Pirata: https://fdroid.partidopirata.com.ar/fdroid/repo?fingerprint=3DF6969EA3A2186D8A5DB00884B3F42F164931E8CFAFD7CC48263CAD1361A1D5\narchive.newpipe.net/fdroid/repo: https://archive.newpipe.net/fdroid/repo?fingerprint=E2402C78F9B97C6C89E97DB914A2751FDA1D02FE2039CC0897A462BDB57E7501\nFedilab\nGalería\nGitFox\nGitNex\nGrabadora\nHacker’s Keyboard\nIceCatMobile\nJami\nK-9 Mail\nLibreOffice Viewer\nLibrera\nMarkor\nMoneyBuster\nMusica\nNewPipe\nNextcloud\nOpenkeyChain\nOpenTrack\nOSM DashBoard\nOsmAnd~\nProtonmail\nRiseUpVPN\nStandart Notes\nTutanota\nUntrackme\nVLC\n",
    "description": "",
    "tags": [
      "f-droid",
      "android"
    ],
    "title": "Aplicaciones de móvil",
    "uri": "/privacy/apps_movil/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "ciberseguridad",
    "uri": "/categories/ciberseguridad/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "f-droid",
    "uri": "/tags/f-droid/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "herramientas",
    "uri": "/categories/herramientas/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "privacidad",
    "uri": "/categories/privacidad/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "software libre",
    "uri": "/categories/software-libre/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar un servidor multimedia con descargas automatizadas con Torrenten una Raspberry Pi y hacerla accesible desde internet. La instalación se realizará en contenedoes mediante docker-comnpose.\n¿Qué es Jellyfin? Jellyfin es la solución construida por voluntarios permite el control de contenidos multimedia. Transmite a cualquier dispositivo desde un servidor propio, sin ataduras. Tus medios, tu servidor, a tu manera. Es un sistema multimedia de software libre que permite controlar la gestión y el streaming de archivos multimedia. Es una alternativa a los sistemas propietarios Emby y Plex, para proporcionar medios desde un servidor dedicado a los dispositivos de los usuarios finales a través de múltiples aplicaciones. 1.\nRequisitos Instalar:\nDocker\nDocker-compose\nInstalación y configuración de una Raspbery Pi\nActualizar el sistema\nRecomendaciones Obtener un dominio\nConfigurar una Raspberry Pi para hacerla accesible desde internet\nConfiguración de seguridad y privacidad un router\nUtilizar un gestor de contraseñas como KeePassXC\nInstalación en docker-compose básica de Jellyfin En la documentación de Jellyfin, se recomienda utilizar la imagen de LinuxServer.io [^2] para la instalación en una raspberry pi. El archivo inicial docker-compose.yml es el siguiente:\n--- version: \"2.1\" services: jellyfin: image: lscr.io/linuxserver/jellyfin container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Europe/London - JELLYFIN_PublishedServerUrl=192.168.0.5 #optional volumes: - /path/to/library:/config - /path/to/tvseries:/data/tvshows - /path/to/movies:/data/movies - /opt/vc/lib:/opt/vc/lib #optional - /media/pi/Cineteca:/data/movies/Cineteca ports: - 8096:8096 - 8920:8920 #optional - 7359:7359/udp #optional - 1900:1900/udp #optional devices: # - /dev/dri:/dev/dri #optional # - /dev/vcsm:/dev/vcsm #optional # - /dev/vchiq:/dev/vchiq #optional - /dev/video10:/dev/video10 #optional - /dev/video11:/dev/video11 #optional - /dev/video12:/dev/video12 #optional restart: unless-stopped Nota: Hemos añadido el volumen /media/pi/Cineteca porque es un disco duro externo que se monta en la raspberry pi con el comando:\nudisksctl mount -b /dev/sdb1 Arrancar el docker-compose Utilizamos el siguiente comando para levantar el escenario:\ndocker-compose up Una vez levantado, es accesible en la dirección http://\u003cip-raspberry\u003e:8096.\nInstalación en docker-compose con traefik y certificados Let’s Encrypt Antes de todo, utilizamos el siguiente comando en Linux para generar un nombre de usuario y una contraseña ya escapados:\necho $(htpasswd -nb username mystrongpassword) | sed -e s/\\\\$/\\\\$\\\\$/g Primero, añadimos la variable de entorno con el nombre del dominio:\nexport $DOMINIO=dominioejemplo.org En segundo lugar creamos un fichero docker-compose.yml y añadimos el siguiente contenido:\nversion: \"3.3\" services: traefik: image: \"traefik:v2.5\" container_name: \"traefik\" command: - \"--log.level=DEBUG\" - \"--api.insecure=true\" - \"--providers.docker=true\" - \"--providers.docker.exposedbydefault=false\" - \"--entrypoints.websecure.address=:443\" - \"--certificatesresolvers.myresolver.acme.tlschallenge=true\" - \"--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory\" - \"--certificatesresolvers.myresolver.acme.email=hello@${DOMAIN}.org\" - \"--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json\" ports: - \"443:443\" - \"8080:8080\" volumes: - \"./letsencrypt:/letsencrypt\" - \"/var/run/docker.sock:/var/run/docker.sock:ro\" # extra_hosts: # - host.docker.internal:172.17.0.1 # Needed to avoid Bad Gateway. whoami: image: \"traefik/whoami\" container_name: \"simple-service\" labels: - \"traefik.enable=true\" - \"traefik.http.routers.whoami.rule=Host(`whoami.${DOMAIN}`)\" - \"traefik.http.routers.whoami.entrypoints=websecure\" - \"traefik.http.routers.whoami.tls.certresolver=myresolver\" jellyfin: image: lscr.io/linuxserver/jellyfin container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Europe/London - JELLYFIN_PublishedServerUrl=jellyfin.${DOMAIN} #optional volumes: - /path/to/library:/config - /path/to/tvseries:/data/tvshows - /path/to/movies:/data/movies - /opt/vc/lib:/opt/vc/lib #optional ports: - 8096:8096 - 8920:8920 #optional # - 7359:7359/udp #optional # - 1900:1900/udp #optional devices: # - /dev/dri:/dev/dri #optional # - /dev/vcsm:/dev/vcsm #optional # - /dev/vchiq:/dev/vchiq #optional - /dev/video10:/dev/video10 #optional - /dev/video11:/dev/video11 #optional - /dev/video12:/dev/video12 #optional restart: unless-stopped labels: - \"traefik.enable=true\" - \"traefik.http.routers.jellyfin.rule=Host(`jellyfin.${DOMAIN}`)\" - \"traefik.http.routers.jellyfin.entrypoints=websecure\" - \"traefik.http.routers.jellyfin.tls.certresolver=myresolver\" Una vez levantado, es accesible en la dirección http://\u003cip-raspberry\u003e:8096.\nDocumentación, Jellyfin ↩︎\n",
    "description": "",
    "tags": [
      "raspberry pi",
      "jellyfin",
      "traefik",
      ""
    ],
    "title": "Despliegue de un servidor multimedia Jellyfin con descargas automatizadas con Torrent",
    "uri": "/blog/2022-05-21_home_media_server/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "jellyfin",
    "uri": "/tags/jellyfin/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "traefik",
    "uri": "/tags/traefik/"
  },
  {
    "content": "En esta entrada se instalará y se configurará Code Server en una Raspberry Pi. Se utilizará la versión dockerizada linuxserver/code-server, se instalará mediante docker-compose y el balanceo de carga se realizará con traefik.\n¿Qué es Code Server? Code-server es VS Code corriendo en un servidor remoto, accesible a través del navegador.\nRequisitos Instalar:\nDocker\nDocker-compose\nInstalación y configuración de una Raspbery Pi\nActualizar el sistema\nRedomendaciones Obtener un dominio (No aseguramos que funcione sin un dominio)\nConfigurar una Raspberry Pi para hacerla accesible desde internet\nConfiguración de seguridad y privacidad un router\nUtilizar un gestor de contraseñas como KeePassXC y la consola zsh\nActualizar el sistema Lo primero siempre es actualizar el sistema con:\nsudo apt update -y \u0026\u0026 sudp apt upgrade -y Configurar cortafuegos ufw Para instalar el cortafuegos ufw ejecutar:\nsudo apt-get install ufw Permitimos las conexiones por el puerto 80 (HTTP), 443(HTTPS) y 2251(SSH configurado).\nsudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 4443/tcp sudo ufw allow 2251/tcp Para activarlo:\nsudo ufw enable Para ver las reglas por defecto:\nsudo ufw show raw También se puede ver con un formato más legible:\nsudo ufw status verbose Apagar la Raspberry Pi de forma correcta Para apagar la Raspberry Pi evitando que se corrompa la tarjeta SD se ejecuta el siguiente comando:\nsudo shutdown -h now Esperar a que la luz verde deje de parpadear para desenchufar el cable de alimentación.\nObtener dominio (Opcional) Se requiere un dominio en caso de querer acceder desde el exterior de la red local, en otras palabras, desde Internet. Para ello existen varias páginas donde obtener dominios gratuitos o por menos de 1€ al año. Lo más importante es que el resgistrador de nombres de dominio tenga protección de Whois (WhoisGuard) para prevenir ataques de spam o de suplantación de indentidad a través de los datos personales que tienen que ser públicos al registrar un dominio en el ICANN.\nEn caso de usar un dominio de freenom, es necesario cambiar el DNS a un de Cloudflare siguiendo los pasos de este tutorial.\nDesplegar VSCode Server con Docker Para levantar el contenedor docker de code-server, simplemente se necesitan los siguientes pasos:\nAñadir la variable de entorno con el nombre del dominio: export $DOMINIO=dominioejemplo.org Levantar el contenedor desde el repositorio de Docker Hub: docker run -d \\ --name=code-server \\ -e PUID=1000 \\ -e PGID=1000 \\ -e TZ=Europe/London \\ -e PASSWORD=password `#optional` \\ -e HASHED_PASSWORD= `#optional` \\ -e SUDO_PASSWORD=password `#optional` \\ -e SUDO_PASSWORD_HASH= `#optional` \\ -e PROXY_DOMAIN=code-server.my.domain `#optional` \\ -e DEFAULT_WORKSPACE=/config/workspace `#optional` \\ -p 8443:8443 \\ -v /path/to/appdata/config:/config \\ --restart unless-stopped \\ lscr.io/linuxserver/code-server:latest Escribir en el navegador la dirección http://\u003cIP-Raspberry-Pi\u003e:8443 y escribir la contraseña elegida.\nConfiguración en producción de code-server en una Raspberry Pi Nota importante: no funciona sin un dominio.\nCreamos una carpeta raiz que contendrá una carpeta con el nombre de cada autoalojemos, por ejemplo la llamaremos servicios-autoalojados:\nmkdir servicios-autoalojados Variables de entorno de Traefik Una vez creado nos dirigidos al directorio y creamos otra carpeta llamada traefik. Además, añadimos un nuevo archivo .env en la carpeta traefik con el siguiente contenido. Es la variable de entorno necesaria para traefik. También se pueden incluir en cada carpeta raiz y tenerlas centralizadas en dicha carpeta, el inconveniene es que todos los contenedores tendrían acceso a todas las variables de entorno y eso podría dar lugar a problemas de seguridad. Por esa razón, recomendamos tener un archivo de variables de entorno separado por cada servicio que despleguemos.Para que funcione correctamente, es importante borrar el comentario que se ha añadido en el siguiente ejemplo.\nDOMAIN=dominioejemplo.org # Cambiar por un dominio propio Docker-compose de producción de Traefik Después, creamos un archivo docker-compose.yml con la siguiente configuración:\nversion: \"3.3\" services: traefik: image: \"traefik:v2.6\" container_name: \"traefik\" command: - \"--log.level=DEBUG\" # - \"--api.insecure=false\" - \"--providers.docker=true\" - \"--providers.docker.exposedbydefault=false\" - \"--entrypoints.websecure.address=:443\" - \"--entrypoints.web.address=:80\" - \"--entrypoints.web.http.redirections.entryPoint.to=websecure\" - \"--entrypoints.web.http.redirections.entryPoint.scheme=https\" - \"--entrypoints.web.http.redirections.entrypoint.permanent=true\" - \"--certificatesresolvers.myresolver.acme.tlschallenge=true\" - \"--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory\" - \"--certificatesresolvers.myresolver.acme.email=admin@${DOMAIN}\" # Email de ejemplo, cambiarlo para recibir correos de la renovación de los certificados - \"--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json\" ports: - \"443:443\" - \"8080:8080\" volumes: - \"./letsencrypt:/letsencrypt\" - \"/var/run/docker.sock:/var/run/docker.sock:ro\" env_file: - .env networks: - traefik-external-network - vscode-network restart: unless-stopped networks: traefik-external-network: driver: bridge external: true vscode-network: driver: bridge En el hemos creado una red de docker llamada traefik-external-network donde se expodrán los servicios al exterior y es obligatorio que sea de tipo external, mientras que code-server-network servirá para conectar la base de datos postgres con netxcloud.\nDesplegamos el docker-compose con:\ndocker-compose up --build --force-recreate Variables de entorno de Code Server A continuación, creamos una carpeta llamada code-server. Una vez creada nos dirigidos al directorio y añadimos un nuevo archivo .env en la carpeta code-server con el siguiente contenido. Son las variables de entorno necesarias para el servidor de código.\nPrimero, creamos un archivo .env donde guardaremos las variables de entorno. Es importante borrar los comentarios que se han añadido en el siguiente ejemplo para que funcione correctamente.\nDOMAIN=dominioejemplo.org SUBDOMAIN_CODE_SERVER=code-server PUID=1000 PGID=1000 TZ=Europe/London PASSWORD= #optional HASHED_PASSWORD= #optional SUDO_PASSWORD= #optional SUDO_PASSWORD_HASH= #optional PROXY_DOMAIN=code-server.dominioejemplo.org #optional DEFAULT_WORKSPACE=/config/workspace #optional En segundo lugar, creamos un archivo docker-compose.yml con el siguiente contenido:\nversion: \"3.3\" services: # Visual Studio code server code-server: image: lscr.io/linuxserver/code-server:latest container_name: code-server env_file: - .env volumes: - ./code-server-config:/home/coder/.config - ./code-server-data:/home/coder/projects # command: code-server --auth password --disable-telemetry /home/coder/project ports: - 8443:8443 networks: - traefik-external-network restart: unless-stopped labels: - \"traefik.enable=true\" # Code-server URL - \"traefik.http.routers.code-server.rule=Host(`${SUBDOMAIN_CODE_SERVER}.${DOMAIN}`)\" - \"traefik.http.routers.code-server.service=code-server\" - \"traefik.http.routers.code-server.entrypoints=websecure\" - \"traefik.http.services.code-server.loadbalancer.server.port=8443\" - \"traefik.http.routers.code-server.tls=true\" - \"traefik.http.routers.code-server.tls.certresolver=myresolver\" - \"traefik.http.services.code-server.loadbalancer.passhostheader=true\" volumes: code-server-config: code-server-data: networks: traefik-external-network: driver: bridge external: true Desplegamos el docker-compose con:\ndocker-compose up --build --force-recreate El certificado de Let’s Encrypt puede tardar unos minutos en obtenerse, por lo tanto, espere y si obtiene algún warning en los logs de Traefik, no es preocupante. Una forma para probar si se ha generado correctamente es leer el archivo acme.json de la carpeta letsencrypt creada en el directorio code-server. También se pueden recrear los servicios hasta que funcione todo correctamente.\nPor último, ya podemos buscar en el navegador nuestro dominio https://code-server.dominiodeejemplo.org\n",
    "description": "",
    "tags": [
      "traefik",
      "vscode",
      "raspberry pi",
      "let's encrypt",
      "self-hosted",
      "programación"
    ],
    "title": "Instalación y configuración de un servidor VSCode y expuesto con Traefik en docker-compose en una Raspberry Pi",
    "uri": "/blog/2022-03-23-code-server/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "let's encrypt",
    "uri": "/tags/lets-encrypt/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "programación",
    "uri": "/tags/programaci%C3%B3n/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "seguridad",
    "uri": "/categories/seguridad/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "self-hosted",
    "uri": "/tags/self-hosted/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "vscode",
    "uri": "/tags/vscode/"
  },
  {
    "content": "En esta entrada se instalará y se configurará Nextcloud para una Raspberry Pi. Se utilizará la versión dockerizada nextcloud, se instalará mediante docker-compose y el balanceo de carga se realizará con traefik. Tendremos como referencia el archivo docker-compose del repositorio heyValdemar/nextcloud-traefik-letsencrypt-docker-compose\n¿Qué es Nextcloud? Nextcloud es una serie de programas de código abierto, tanto el cliente como el servidor, con el objetivo de crear un servicio de alojamiento de archivos. Permite el alojamiento en un servidor propio, a modo de nube privada, para no tener la dependencia de nubes de terceros como Dropbox o Google Drive.\nRequisitos Instalar:\nDocker\nDocker-compose\nInstalación y configuración de una Raspbery Pi\nActualizar el sistema\nRedomendaciones Obtener un dominio (No aseguramos que funcione sin un dominio)\nConfigurar una Raspberry Pi para hacerla accesible desde internet\nConfiguración de seguridad y privacidad un router\nUtilizar un gestor de contraseñas como KeePassXC y la consola zsh\nActualizar el sistema Lo primero siempre es actualizar el sistema con:\nsudo apt update -y \u0026\u0026 sudp apt upgrade -y Configurar cortafuegos ufw Para instalar el cortafuegos ufw ejecutar:\nsudo apt-get install ufw Permitimos las conexiones por el puerto 80 (HTTP), 443(HTTPS), 2251(SSH configurado) y 4443(puerto de configuración de nextcloud).\nsudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 4443/tcp sudo ufw allow 2251/tcp Para activarlo:\nsudo ufw enable Para ver las reglas por defecto:\nsudo ufw show raw También se puede ver con un formato más legible:\nsudo ufw status verbose Apagar la Raspberry Pi de forma correcta Para apagar la Raspberry Pi evitando que se corrompa la tarjeta SD se ejecuta el siguiente comando:\nsudo shutdown -h now Esperar a que la luz verde deje de parpadear y ya desenchufar el cable de alimentación.\nObtener dominio (Opcional) Se requiere un dominio en caso de querer acceder desde el exterior de la red local, en otras palabras, desde Internet. Para ello existen varias páginas donde obtener dominios gratuitos o por menos de 1€ al año. Lo más importante es que el resgistrador de nombres de dominio tenga protección de Whois (WhoisGuard) para prevenir ataques de spam o de suplantación de indentidad a través de los datos personales que tienen que ser públicos al registrar un dominio en el ICANN.\nEn caso de usar un dominio de freenom, es necesario cambiar el DNS a un de Cloudflare siguiendo los pasos de este tutorial.\nDesplegar NextcloudPi con Docker Para levantar el contenedor docker de nextcloudpi, simplemente se necesitan los siguientes pasos:\nAñadir la variable de entorno con el nombre del dominio: export $DOMINIO=dominioejemplo.org Levantar el contenedor desde el repositorio de Docker Hub: docker run -d -p 4443:4443 -p 443:443 -p 80:80 -v ncdata:/data --restart unless-stopped --name nextcloudpi ownyourbits/nextcloudpi $DOMINIO Activación de nextcloudpi Escribir en el navegador la dirección http://\u003cIP-Raspberry-Pi\u003e. Aceptar el riesgo de seguridad. Aparecerá la ventana de activación de nextcloudpi. Es importante guardar las credenciales que se muestran, por ejemplo:\nNextcloudpi: ncp cVYu90pMiZ8GyglILiLVUlD67ID69AOCarv68l4l/so Nextcloud user: ncp 1CAhXuQgPEQ99/zfI5xeCNaE7cHeqZpjGhYnuBqVehI Pulsar activar e introducir las credenciales de nextcloudpi. En la primera ejecución, si se quiere acceder al servidor desde la fuera de la red local, se pedirá que se realice el Port forwarding para los puerto 80 (HTTP) y 443(HTTPS) para la IP asignada a la raspberrypi. Se necesita acceder al router desde un navegador a la IP 192.168.1.1 mediante la contraseña del router, suele estar en una etiqueta debajo del router o por defecto es admin o 1234. Si no se permite desde la configuración del proveedor, será necesario realizarlo desde los ajustes avanzados del router.\nUna vez realizado, o en caso de no que no quiera ser accesible desde fuera, se requiere ir al panel de configuración de nextcloudpi y en CONFIG-\u003enc-trusted-domains. En caso de querer exponer la raspberry pi accesible desde internet, se recomienta seguir la entrada “Configuración de seguridad y privacidad un router” y continuar leyendo los siguientes apartados. De todas maneras, ya se puede acceder al nextcloud desplegado en la red LAN.\nAceso a nextcloud Mediante el usuario ncp y la contraseña del Nextcloud user, ya se puede acceder al servidor de almacenamiento Nextcloud. Además tiene para calendario, notas, tareas y otras herramientas y aplicaciones que se pueden añadir como edición de textos de manera colaborativa, videollamadas, servidor de comunicación, mapas, reproductor de música y radio, gestor de contraseña, etc. Tiene una infinidad de opciones.\nDesplegar la imagen completa de Nextcloud con Let’s Encrypt y Traefik en Docker Compose Primero, creamos un archivo donde guardaremos las variables de entorno:\nPOSTGRES_HOST=postgres # Es el nombre del contenedor Docker de postgres DB_PORT=5432 # Es el puerto para la base de datos postgres POSTGRES_VERSION=13.3 POSTGRES_DB=nextcloud-db POSTGRES_USER=postgres POSTGRES_PASSWORD= NEXTCLOUD_ADMIN_USER=nc_admin NEXTCLOUD_ADMIN_PASSWORD= DOMAIN=localhost # Si no teneos ningún dominio poner \"localhost\", sino \"dominioejemplo.org\" NEXTCLOUD_TRUSTED_DOMAINS= \"cloud.localhost localhost\" # Añadir dominio y subdominio de la dirección de Nextcloud (si tenemos) NEXTCLOUD_VERSION=\"24.0.1\" En segundo lugar, creamos un archivo docker-compose.yml con el siguiente contenido:\nversion: \"3.3\" services: traefik: image: \"traefik:v2.6\" container_name: \"traefik\" command: - \"--log.level=DEBUG\" - \"--api.insecure=true\" - \"--providers.docker=true\" - \"--providers.docker.exposedbydefault=false\" - \"--entrypoints.websecure.address=:443\" - \"--entrypoints.web.address=:80\" - \"--entrypoints.web.http.redirections.entryPoint.to=websecure\" - \"--entrypoints.web.http.redirections.entryPoint.scheme=https\" - \"--entrypoints.web.http.redirections.entrypoint.permanent=true\" - \"--certificatesresolvers.myresolver.acme.tlschallenge=true\" - \"--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory\" - \"--certificatesresolvers.myresolver.acme.email=hello@${DOMAIN}\" # Email de ejemplo, cambiarlo para recibir correos de la renovación de los certificados - \"--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json\" ports: - \"443:443\" - \"8080:8080\" volumes: - \"./letsencrypt:/letsencrypt\" - \"/var/run/docker.sock:/var/run/docker.sock:ro\" networks: - nextcloud-network restart: unless-stopped postgres: # Image tag image: postgres:${POSTGRES_VERSION} volumes: - ./nextcloud-postgres:/var/lib/postgresql/data env_file: - .env networks: - nextcloud-network nextcloud: # Image tag image: nextcloud:${NEXTCLOUD_VERSION}-apache volumes: - ./nextcloud-data:/var/www/html image: nextcloud networks: - nextcloud-network env_file: - .env labels: - \"traefik.enable=true\" # Nextcloud URL - \"traefik.http.routers.nextcloud.rule=Host(`cloud.${DOMAIN}`)\" - \"traefik.http.routers.nextcloud.service=nextcloud\" - \"traefik.http.routers.nextcloud.entrypoints=websecure\" - \"traefik.http.services.nextcloud.loadbalancer.server.port=80\" - \"traefik.http.routers.nextcloud.tls=true\" - \"traefik.http.routers.nextcloud.tls.certresolver=myresolver\" - \"traefik.http.services.nextcloud.loadbalancer.passhostheader=true\" - \"traefik.http.routers.nextcloud.middlewares=compresstraefik\" - \"traefik.http.middlewares.compresstraefik.compress=true\" restart: unless-stopped depends_on: - postgres - traefik volumes: nextcloud-data: nextcloud-postgres: traefik-certificates: networks: nextcloud-network: driver: bridge Ya podemos buscar en el navegador nuestro dominio http://cloud.localhost (o si tenemos dominio se substituiría por http://cloud.dominioejemplo.org) o nuestra dirección http://\u003cIP-Raspberry-Pi\u003e y configurar nuestra servidra Nextcloud. En caso de querer tener configurada la raspberry de forma continuada en el tiempo y querer alojar más servicios en un futuro, recomendamos seguir la siguiente estructura de la configuración para facilitar la escalabilidad futura.\nConfiguración en producción de Nextcloud en una Raspberry Pi Nota importante: no funciona sin un dominio.\nCreamos una carpeta raiz que contendrá una carpeta con el nombre de cada autoalojemos, por ejemplo la llamaremos servicios-autoalojados:\nmkdir servicios-autoalojados Variables de entorno de Traefik Una vez creado nos dirigidos al directorio y creamos otra carpeta llamada traefik. Además, añadimos un nuevo archivo .env en la carpeta traefik con el siguiente contenido. Es la variable de entorno necesaria para traefik. También se pueden incluir en cada carpeta raiz y tenerlas centralizadas en dicha carpeta, el inconveniene es que todos los contenedores tendrían acceso a todas las variables de entorno y eso podría dar lugar a problemas de seguridad. Por esa razón, recomendamos tener un archivo de variables de entorno separado por cada servicio que despleguemos.\nDOMAIN=dominioejemplo.org # Cambiar por un dominio propio Docker-compose de producción de Traefik Después, creamos un archivo docker-compose.yml con la siguiente configuración:\nversion: \"3.3\" services: traefik: image: \"traefik:v2.6\" container_name: \"traefik\" command: - \"--log.level=DEBUG\" # - \"--api.insecure=false\" - \"--providers.docker=true\" - \"--providers.docker.exposedbydefault=false\" - \"--entrypoints.websecure.address=:443\" - \"--entrypoints.web.address=:80\" - \"--entrypoints.web.http.redirections.entryPoint.to=websecure\" - \"--entrypoints.web.http.redirections.entryPoint.scheme=https\" - \"--entrypoints.web.http.redirections.entrypoint.permanent=true\" - \"--certificatesresolvers.myresolver.acme.tlschallenge=true\" - \"--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory\" # - \"--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory\" # Staging URL of Let's Encrypt - \"--certificatesresolvers.myresolver.acme.email=admin@${DOMAIN}\" # Email de ejemplo, cambiarlo para recibir correos de la renovación de los certificados - \"--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json\" ports: - \"443:443\" - \"8080:8080\" volumes: - \"./letsencrypt:/letsencrypt\" - \"/var/run/docker.sock:/var/run/docker.sock:ro\" env_file: - .env networks: - traefik-external-network - nextcloud-network restart: unless-stopped volumes: letsencrypt: networks: traefik-external-network: driver: bridge external: true nextcloud-network: driver: bridge En el hemos creado una red de docker llamada traefik-external-network donde se expodrán los servicios al exterior y es obligatorio que sea de tipo external, mientras que nextcloud-network servirá para conectar la base de datos postgres con netxcloud.\nDesplegamos el docker-compose con:\ndocker-compose up --build --force-recreate Variables de entorno de Nextcloud, Postgres y Redis A continuación, creamos una carpeta llamada nextcloud. Una vez creada nos dirigidos al directorio y añadimos un nuevo archivo .env en la carpeta nextcloud con el siguiente contenido. Son las variables de entorno necesarias para nextcloud y postgres. Es importante borrar los comentarios que se han añadido en el siguiente ejemplo para que funcione correctamente.\nDOMAIN=localhost # Si no teneos ningún dominio poner \"localhost\" SUBDOMAIN_NEXTCLOUD=cloud # Si no tenemos ningún dominio, nuestra dirección será cloud.localhost POSTGRES_HOST=postgres # Es el nombre del contenedor Docker de postgres DB_PORT=5432 # Es el puerto para la base de datos postgres POSTGRES_VERSION=13.3 POSTGRES_DB=nextclouddb POSTGRES_USER=postgres POSTGRES_PASSWORD= NEXTCLOUD_ADMIN_USER=nc_admin NEXTCLOUD_ADMIN_PASSWORD= NEXTCLOUD_TRUSTED_DOMAINS= \"cloud.localhost localhost\" # Añadimos nuestro dominio o si no teneos ningún dominio poner \"localhost\". La dircción por defecto del subdominio es cloud NEXTCLOUD_VERSION=\"24.0.1\" REDIS_HOST=redis TRUSTED_PROXIES=192.168.1.0/24 OVERWRITEPROTOCOL=https Docker-compose de producción de Nextcloud y Postgres Después, creamos un archivo docker-compose.yml con la siguiente configuración:\nversion: \"3.3\" services: postgres: # Image tag image: postgres:${POSTGRES_VERSION} container_name: postgres volumes: - ./nextcloud-postgres:/var/lib/postgresql/data env_file: - .env networks: - nextcloud-network restart: unless-stopped nextcloud: # Image tag image: nextcloud:${NEXTCLOUD_VERSION} container_name: nextcloud volumes: - ./nextcloud-data:/var/www/html image: nextcloud networks: - traefik-external-network - nextcloud-network env_file: - .env labels: - \"traefik.enable=true\" # Utilizar la red traefik-external-network que se define más abajo - \"traefik.docker.network=traefik-external-network\" # Nextcloud URL - \"traefik.http.routers.nextcloud.rule=Host(`${SUBDOMAIN_NEXTCLOUD}.${DOMAIN}`)\" - \"traefik.http.routers.nextcloud.service=nextcloud\" - \"traefik.http.routers.nextcloud.entrypoints=websecure\" - \"traefik.http.services.nextcloud.loadbalancer.server.port=80\" - \"traefik.http.routers.nextcloud.tls=true\" - \"traefik.http.routers.nextcloud.tls.certresolver=myresolver\" - \"traefik.http.services.nextcloud.loadbalancer.passhostheader=true\" - \"traefil.docker.network=traefik-external-network\" ## Middlewares - \"traefik.http.routers.nextcloud.middlewares=secHeaders,nextcloud_dav\" # Security headers - \"traefik.http.middlewares.secHeaders.headers.customFrameOptionsValue=SAMEORIGIN\" - \"traefik.http.middlewares.secHeaders.headers.framedeny=true\" - \"traefik.http.middlewares.secHeaders.headers.sslredirect=true\" - \"traefik.http.middlewares.secHeaders.headers.STSIncludeSubdomains=true\" - \"traefik.http.middlewares.secHeaders.headers.STSPreload=true\" - \"traefik.http.middlewares.secHeaders.headers.STSSeconds=315360000\" - \"traefik.http.middlewares.secHeaders.headers.forceSTSHeader=true\" - \"traefik.http.middlewares.secHeaders.headers.sslProxyHeaders.X-Forwarded-Proto=https\" # WebDav - \"traefik.http.middlewares.nextcloud_dav.redirectregex.permanent=true\" - \"traefik.http.middlewares.nextcloud_dav.redirectregex.regex=/.well-known/(card|cal)dav\" - \"traefik.http.middlewares.nextcloud_dav.redirectregex.replacement=/remote.php/dav/\" restart: unless-stopped depends_on: - postgres - redis redis: image: redis:6.2-alpine container_name: redis hostname: redis restart: unless-stopped networks: - nextcloud-network volumes: - ./nextcloud-redis:/data volumes: nextcloud-data: nextcloud-postgres: nextcloud-redis: networks: traefik-external-network: driver: bridge external: true nextcloud-network: driver: bridge Se añaden los siguientes middlewares para activar la sincronización utilizando el proxy inverso de Traefik. Las redirecciones para CalDAV o CardDAV no funcionan si Nextcloud se ejecuta detrás de un proxy inverso. La solución recomendada es que su proxy inverso haga las redirecciones. Para ello, hemos incluido las siguientes líneas de código en el docker-compose:\n## Middlewares - \"traefik.http.routers.nextcloud.middlewares=secHeaders,nextcloud_dav\" # Security headers - \"traefik.http.middlewares.secHeaders.headers.customFrameOptionsValue=SAMEORIGIN\" - \"traefik.http.middlewares.secHeaders.headers.framedeny=true\" - \"traefik.http.middlewares.secHeaders.headers.sslredirect=true\" - \"traefik.http.middlewares.secHeaders.headers.STSIncludeSubdomains=true\" - \"traefik.http.middlewares.secHeaders.headers.STSPreload=true\" - \"traefik.http.middlewares.secHeaders.headers.STSSeconds=315360000\" - \"traefik.http.middlewares.secHeaders.headers.forceSTSHeader=true\" - \"traefik.http.middlewares.secHeaders.headers.sslProxyHeaders.X-Forwarded-Proto=https\" # WebDav - \"traefik.http.middlewares.nextcloud_dav.redirectregex.permanent=true\" - \"traefik.http.middlewares.nextcloud_dav.redirectregex.regex=/.well-known/(card|cal)dav\" - \"traefik.http.middlewares.nextcloud_dav.redirectregex.replacement=/remote.php/dav/\" Desplegamos el docker-compose con:\ndocker-compose up --build --force-recreate El certificado de Let’s Encrypt puede tardar unos minutos en obtenerse, por lo tanto, espere y si obtiene algún warning en los logs de Traefik, no es preocupante. Una forma para probar si se ha generado correctamente es leer el archivo acme.json de la carpeta letsencrypt creada en el directorio nextcloud. También se pueden recrear los servicios hasta que funcione todo correctamente.\nPor último, ya podemos buscar en el navegador nuestro dominio https://cloud.dominiodeejemplo.org\n",
    "description": "",
    "tags": [
      "traefik",
      "nextcloud",
      "raspberry pi",
      "let's encrypt",
      "self-hosted",
      "nube"
    ],
    "title": "Instalación y configuración de NextcloudPi con Docker o con la imagen completa de Nextcloud con Let's Encrypt y Traefik en Docker Compose en una Raspberry Pi",
    "uri": "/blog/2022-02-02-nextcloud_traefik/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "nextcloud",
    "uri": "/tags/nextcloud/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "nube",
    "uri": "/tags/nube/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "administración de sistemas",
    "uri": "/tags/administraci%C3%B3n-de-sistemas/"
  },
  {
    "content": "En esta entrada se configurará un router pensando en la seguridad y privacidad.\nFirewall Activar:\nDenial of Services (DoS) (en caso de que exista esta opción) Permitir todo el tráfico de salida. Denegar todo el tráfico de entrada. Seleccionar IP estática del dispositivo que queramos exponer en la DMZ. Hacer Port forwarding de los puertos que queramos abrir y redireccionar a la IP del dispositivo expuesto. En caso de abrir un puerto para ssh, se recomienda que sea un puerto superior a los 1000 primeros para evitar ataques automatizados. Contraseñas Cambiar contraseña del WiFi y la contraseña de administración. Desativar WPS ",
    "description": "",
    "tags": [
      "router",
      "firewall",
      "redes",
      "administración de sistemas"
    ],
    "title": "Configuración de seguridad y privacidad un router",
    "uri": "/blog/2022-01-11-router_conf/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "firewall",
    "uri": "/tags/firewall/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "redes",
    "uri": "/tags/redes/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "router",
    "uri": "/tags/router/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "debian",
    "uri": "/tags/debian/"
  },
  {
    "content": "En esta entrada se instalará y se configurará un arranque dual de múltiples distribuciones de GNU/Linux (Debian y ParrotOS) mediante rEFInd. Si usas GRUB para arrancar múltiples distribuciones y nunca has oído hablar de rEFInd entonces esta publicación es para ti. Hemos seguido las indicación de este artículo.\nConceptos básicos Un boot loader carga un kernel del sistema operativo en la memoria y lo ejecuta. Un boot manager entrega el control a otro programa de arranque. GRUB es tanto un boot loader como un boot manager. Refind es sólo un boot manager.\nOtro concepto fundamental es conocer la diferencia entre EFI/UEFI y BIOS.\nGParted Mediante GParted ejecutado desde un USB live, se eliminan todas las particiones y se crea una nueva tabla de particiones GPT(GUID Partition Table). GPT es un formato utilizado por los sistemas con EFI y es una alternativa moderna al formato MBR(Master Boot Record) que se utiliza en los sistemas con BIOS.\nUEFI requiere que cada disco de arranque tenga una partición especial llamada EFI System Partion (ESP). El ESP es una simple partición FAT16 o FAT32 con los flags de partición boot y esp. El ESP almacena archivos ejecutables EFI, a pesar que son de un tamaño inferior a 100MB, algunos sistemas operativos requieren que la partición tenga una capacidad de 500MB. Por lo tanto, se procede a crear una partición de 550MB de tipo primaria, fat32, con la etiqueta ESP y efi como el nombre de la partición. Se aplican los cambios y en la opción de manage flags se selecionan boot y esp.\nEl siguiente paso es crear dos particiones ext4 para los sistemas operativos Debian y ParrotOS. Por ejemplo, se puede asignar 250GB a Debian, 150GB a Parrot y el resto puede ser una partición de datos que sea compartida. A cada partición se recomienda asignar su correspondiente etiqueta.\nInstalación de Debian Accedemos a la instalación en modo experto con gráfica y avanzamos hasta la detección de discos y particiones. Creamos las siguientes particiones:\n500MB para una partición EFI común. 500MB para la partición boot de Debian. 500MB para la partición boot de ParrotOS. El resto en una partición donde irán los distintos sistemas operativos. Primero se crea un volumen cifrado en la partición con la etiqueta all-Operative-Systems indicando que no se formatee o se borre la partición. Después se crea un volumen LVM de grupo y los siguientes volúmenes lógicos:\nVolúmenes Debian: 8GB para SWAP. 250GB para root. 100GB para home. Volúmenes ParrotOS: 8GB para SWAP. 250GB para root. 100GB para home. Volúmenes datos comunes: El resto para datos comunes. Se asigna a cada volumen lógico de Debian el punto de montaje correspondiente y se termina la instalación eligendo el entorno de escritorio al gusto del consumidor.\nInstalación de ParrotOS Como ParrotOS es una distribución derivada de Debian, la instalación se realiza igual que en el apartado anterior. Se accede al modo experto de instalación gráfica y se avanza hasta el punto de detección de discos. Como la partición de los sistemas operativos está cifrada, es necesario descifrarla y detectar el grupo de volúmenes LVM. Para ello, saldremos de la sección de detección de discos y iremos a la sección de abrir una terminal o shell. Lo primero será desencriptar la partición cifrada con:\nNota: la partición /dev/sdaX debe corresponder a la cifrada y el nombre debe ser el asignado en la etiqueta.\ncryptsetup luksOpen /dev/sdaX all-Operative-Systems Posteriormente detectaremos el grupo de los volúmenes LVM con:\nvgchange -a y Nota: es probable que los siguientes pasos no funcionen a la primera y sea necesario completarlos con la siguiente sección. Por lo que se podría obviar el final de esta sección e instalar el grub directamente.\nUna vez ejecutados los comandos anteriores, seguir con la instalación hasta la instalación del GRUB. Volvemos a abrir una terminal e identificamos el UUID de la partición cifrada con:\nblkid /dev/sdaX Lo siguiente es modificar el archivo /etc/crypttab:\nnano /etc/crypttab Y se añade el siguiente contenido, donde el UUID es el obtenido del comando blkid:\nall-Operative-Systems UUID=524c1ad6-fabe-4f32-9bb0-c8db1286b262 none luks Terminamos la instalación y reiniciamos el sistema operativo. Si todo funciona correctamente, ya estaría terminado. Lo más habitual es que al intentar arrancar el sistema operativo no pueda abrir la partición cifrada, ni los volúmenes cifrados. Entonces, abrirá una terminal de initramfs y tendremos que configurar los siguientes pasos.\nNo abre la partición cifrada y salta una terminal de initramfs En caso de obtener una terminal con initramfs, será necesario volver a repetir los pasos de descifrar la partición y abrir el grupo de volúmenes cifrados como se menciona anteriormente.\nAbrimos la partición cifrada con:\ncryptsetup luksOpen /dev/sdaX all-Operative-Systems Posteriormente detectaremos el grupo de los volúmenes LVM con:\nvgchange -a y Para arrancar el sistema, simplemente utilizamos el siguiente comando:\nexit Nos llevará al login y entraremos con las credenciales creadas en la instalación. Una vez iniciado el sistema operativo, abrimos una terminal y detectamos el UUID de la partición cifrada. La X de sdaX corresponde al número de la partición cifrada, si no se conoce simplemente utilizar el comando blkid.\nblkid /dev/sdaX Editamos el archivo /etc/crypttab con nano:\nsudo nano /etc/crypttab Añadimos lo siguiente:\nall-Operative-Systems UUID=524c1ad6-fabe-4f32-9bb0-c8db1286b262 none luks Una vez terminado se utiliza el siguiente comando para actualizar initramfs:\nsudo update-initramfs -u Reiniciamos el sistema operativo con:\nsudo reboot Instalación rEFInd La instalación de rEFInd se realiza con el siguiente comando:\nsudo apt install refind ",
    "description": "",
    "tags": [
      "debian",
      "parrot",
      "rEFInd",
      "luks",
      "administración de sistemas"
    ],
    "title": "Instalación de Debian y ParrotOS con arranque dual en una partición cifrada con LUKS, volúmenes LVM y rEFInd",
    "uri": "/blog/2022-01-06-multiboot_refind_luks/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "luks",
    "uri": "/tags/luks/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "parrot",
    "uri": "/tags/parrot/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "rEFInd",
    "uri": "/tags/refind/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar un servidor multimedia en una Raspberry Pi y hacerla accesible desde internet. La instalación se realizará en contenedoes mediante docker-comnpose.\n¿Qué es Jellyfin? Jellyfin es la solución construida por voluntarios permite el control de contenidos multimedia. Transmite a cualquier dispositivo desde un servidor propio, sin ataduras. Tus medios, tu servidor, a tu manera. Es un sistema multimedia de software libre que permite controlar la gestión y el streaming de archivos multimedia. Es una alternativa a los sistemas propietarios Emby y Plex, para proporcionar medios desde un servidor dedicado a los dispositivos de los usuarios finales a través de múltiples aplicaciones. 1.\nRequisitos Instalar:\nDocker\nDocker-compose\nInstalación en docker-compose básica En la documentación de Jellyfin, se recomienda utilizar la imagen de LinuxServer.io [^2] para la instalación en una raspberry pi. El archivo inicial docker-compose.yml es el siguiente:\n--- version: \"2.1\" services: jellyfin: image: lscr.io/linuxserver/jellyfin container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Europe/London - JELLYFIN_PublishedServerUrl=192.168.0.5 #optional volumes: - /path/to/library:/config - /path/to/tvseries:/data/tvshows - /path/to/movies:/data/movies - /opt/vc/lib:/opt/vc/lib #optional - /media/pi/Cineteca:/data/movies/Cineteca ports: - 8096:8096 - 8920:8920 #optional - 7359:7359/udp #optional - 1900:1900/udp #optional devices: # - /dev/dri:/dev/dri #optional # - /dev/vcsm:/dev/vcsm #optional # - /dev/vchiq:/dev/vchiq #optional - /dev/video10:/dev/video10 #optional - /dev/video11:/dev/video11 #optional - /dev/video12:/dev/video12 #optional restart: unless-stopped Nota: Hemos añadido el volumen /media/pi/Cineteca porque es un disco duro externo que se monta en la raspberry pi con el comando:\nudisksctl mount -b /dev/sdb1 Arrancar el docker-compose Utilizamos el siguiente comando para levantar el escenario:\ndocker-compose up Una vez levantado, es accesible en la dirección http://\u003cip-raspberry\u003e:8096.\nInstalación en docker-compose con traefik y certificados Let’s Encrypt Primero, añadimos la variable de entorno con el nombre del dominio:\nexport $DOMINIO=dominioejemplo.org En segundo lugar creamos un fichero docker-compose.yml y añadimos el siguiente contenido:\nversion: \"3.3\" services: traefik: image: \"traefik:v2.5\" container_name: \"traefik\" command: - \"--log.level=DEBUG\" - \"--api.insecure=true\" - \"--providers.docker=true\" - \"--providers.docker.exposedbydefault=false\" - \"--entrypoints.websecure.address=:443\" - \"--certificatesresolvers.myresolver.acme.tlschallenge=true\" - \"--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory\" - \"--certificatesresolvers.myresolver.acme.email=hello@email-example.org\" - \"--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json\" ports: - \"443:443\" - \"8080:8080\" volumes: - \"./letsencrypt:/letsencrypt\" - \"/var/run/docker.sock:/var/run/docker.sock:ro\" # extra_hosts: # - host.docker.internal:172.17.0.1 # Needed to avoid Bad Gateway. whoami: image: \"traefik/whoami\" container_name: \"simple-service\" labels: - \"traefik.enable=true\" - \"traefik.http.routers.whoami.rule=Host(`whoami.${DOMAIN}`)\" - \"traefik.http.routers.whoami.entrypoints=websecure\" - \"traefik.http.routers.whoami.tls.certresolver=myresolver\" jellyfin: image: lscr.io/linuxserver/jellyfin container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Europe/London - JELLYFIN_PublishedServerUrl=jellyfin.${DOMAIN} #optional volumes: - /path/to/library:/config - /path/to/tvseries:/data/tvshows - /path/to/movies:/data/movies - /opt/vc/lib:/opt/vc/lib #optional ports: - 8096:8096 - 8920:8920 #optional # - 7359:7359/udp #optional # - 1900:1900/udp #optional devices: # - /dev/dri:/dev/dri #optional # - /dev/vcsm:/dev/vcsm #optional # - /dev/vchiq:/dev/vchiq #optional - /dev/video10:/dev/video10 #optional - /dev/video11:/dev/video11 #optional - /dev/video12:/dev/video12 #optional restart: unless-stopped labels: - \"traefik.enable=true\" - \"traefik.http.routers.jellyfin.rule=Host(`jellyfin.${DOMAIN}`)\" - \"traefik.http.routers.jellyfin.entrypoints=websecure\" - \"traefik.http.routers.jellyfin.tls.certresolver=myresolver\" Una vez levantado, es accesible en la dirección http://\u003cip-raspberry\u003e:8096.\nDocumentación, Jellyfin) ↩︎\n",
    "description": "",
    "tags": [
      "raspberry pi"
    ],
    "title": "Despliegue de un servidor multimedia Jellyfin",
    "uri": "/blog/2021-12-26_jellyfin/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar un servidor multimedia en una Raspberry Pi y hacerla accesible desde internet. La instalación se realizará en contenedoes mediante docker-comnpose.\n¿Qué es Jellyfin? Jellyfin es la solución construida por voluntarios permite el control de contenidos multimedia. Transmite a cualquier dispositivo desde un servidor propio, sin ataduras. Tus medios, tu servidor, a tu manera. Es un sistema multimedia de software libre que permite controlar la gestión y el streaming de archivos multimedia. Es una alternativa a los sistemas propietarios Emby y Plex, para proporcionar medios desde un servidor dedicado a los dispositivos de los usuarios finales a través de múltiples aplicaciones. 1.\nRequisitos Instalar:\nDocker\nDocker-compose\nInstalación en docker-compose básica En la documentación de Jellyfin, se recomienda utilizar la imagen de LinuxServer.io [^2] para la instalación en una raspberry pi. El archivo inicial docker-compose.yml es el siguiente:\n--- version: \"2.1\" services: jellyfin: image: lscr.io/linuxserver/jellyfin container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Europe/London - JELLYFIN_PublishedServerUrl=192.168.0.5 #optional volumes: - /path/to/library:/config - /path/to/tvseries:/data/tvshows - /path/to/movies:/data/movies - /opt/vc/lib:/opt/vc/lib #optional - /media/pi/Cineteca:/data/movies/Cineteca ports: - 8096:8096 - 8920:8920 #optional - 7359:7359/udp #optional - 1900:1900/udp #optional devices: # - /dev/dri:/dev/dri #optional # - /dev/vcsm:/dev/vcsm #optional # - /dev/vchiq:/dev/vchiq #optional - /dev/video10:/dev/video10 #optional - /dev/video11:/dev/video11 #optional - /dev/video12:/dev/video12 #optional restart: unless-stopped Nota: Hemos añadido el volumen /media/pi/Cineteca porque es un disco duro externo que se monta en la raspberry pi con el comando:\nudisksctl mount -b /dev/sdb1 Arrancar el docker-compose Utilizamos el siguiente comando para levantar el escenario:\ndocker-compose up Una vez levantado, es accesible en la dirección http://\u003cip-raspberry\u003e:8096.\nInstalación en docker-compose con traefik y certificados Let’s Encrypt Primero, añadimos la variable de entorno con el nombre del dominio:\nexport $DOMINIO=dominioejemplo.org En segundo lugar creamos un fichero docker-compose.yml y añadimos el siguiente contenido:\nversion: \"3.3\" services: traefik: image: \"traefik:v2.5\" container_name: \"traefik\" command: - \"--log.level=DEBUG\" - \"--api.insecure=true\" - \"--providers.docker=true\" - \"--providers.docker.exposedbydefault=false\" - \"--entrypoints.websecure.address=:443\" - \"--certificatesresolvers.myresolver.acme.tlschallenge=true\" - \"--certificatesresolvers.myresolver.acme.caserver=https://acme-v02.api.letsencrypt.org/directory\" - \"--certificatesresolvers.myresolver.acme.email=hello@email-example.org\" - \"--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json\" ports: - \"443:443\" - \"8080:8080\" volumes: - \"./letsencrypt:/letsencrypt\" - \"/var/run/docker.sock:/var/run/docker.sock:ro\" # extra_hosts: # - host.docker.internal:172.17.0.1 # Needed to avoid Bad Gateway. whoami: image: \"traefik/whoami\" container_name: \"simple-service\" labels: - \"traefik.enable=true\" - \"traefik.http.routers.whoami.rule=Host(`whoami.${DOMAIN}`)\" - \"traefik.http.routers.whoami.entrypoints=websecure\" - \"traefik.http.routers.whoami.tls.certresolver=myresolver\" jellyfin: image: lscr.io/linuxserver/jellyfin container_name: jellyfin environment: - PUID=1000 - PGID=1000 - TZ=Europe/London - JELLYFIN_PublishedServerUrl=jellyfin.${DOMAIN} #optional volumes: - /path/to/library:/config - /path/to/tvseries:/data/tvshows - /path/to/movies:/data/movies - /opt/vc/lib:/opt/vc/lib #optional ports: - 8096:8096 - 8920:8920 #optional # - 7359:7359/udp #optional # - 1900:1900/udp #optional devices: # - /dev/dri:/dev/dri #optional # - /dev/vcsm:/dev/vcsm #optional # - /dev/vchiq:/dev/vchiq #optional - /dev/video10:/dev/video10 #optional - /dev/video11:/dev/video11 #optional - /dev/video12:/dev/video12 #optional restart: unless-stopped labels: - \"traefik.enable=true\" - \"traefik.http.routers.jellyfin.rule=Host(`jellyfin.${DOMAIN}`)\" - \"traefik.http.routers.jellyfin.entrypoints=websecure\" - \"traefik.http.routers.jellyfin.tls.certresolver=myresolver\" Una vez levantado, es accesible en la dirección http://\u003cip-raspberry\u003e:8096.\nDocumentación, Jellyfin) ↩︎\n",
    "description": "",
    "tags": [
      "raspberry pi"
    ],
    "title": "Despliegue de un servidor multimedia Jellyfin",
    "uri": "/technological_sovereignty/sefl-hosted/jellyfin/jellyfin/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar el playmouth en Debian teniendo todas las particiones cifradas con LUKS, menos la partición /boot. Se utiliza como refencia el repositorio plymouth-themes.\n¿Qué es el Playmouth? Plymouth es una aplicación que se inicia muy temprano en el proceso de booteo o inicio (incluso antes de que el sistema de archivos esté montado) que proporcional una animación gráfica de booteo o inicio mientas el proceso de inicio ocurre en segundo plano.\nEsta diseñado para trabajar en sistemas que tengan drivers DRM modesetting. La idea es que muy temprano en el proceso de booteo o inicio se configure de forma nativa el modesetting, Plymouth usa este modo, este modo debe mantenerse durante todo el proceso de booteo o inicio incluso después de iniciar el servidor gráfico X. El máximo propósito es evitar los parpadeos durante el proceso de inicio 1.\nInstalación de Playmouth sudo apt install plymouth Modificación del Grub Modificar el archivo grub que viene por defecto:\nsudo nano /etc/default/grub Modificamos la línea 9 añadiendo splash:\nGRUB_CMDLINE_LINUX_DEFAULT=\"quiet splash\" Temas para el plymouth Clonamos el repositorio de temas:\ngit clone https://github.com/adi1090x/plymouth-themes.git Nos movemos dentro de algún directorio llamado pack_X, por ejemplo el pack_3:\ncd plymouth-themes/pack_3 Seleccionamos el tema que queremos, por ejemplo `lone:\nsudo cp -r lone /usr/share/plymouth/themes/ Plymouth - Debian ↩︎\n",
    "description": "",
    "tags": [
      "plymouth",
      "debian"
    ],
    "title": "Configuración del Plymouth",
    "uri": "/blog/2021-11-25_playmouth/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar el playmouth en Debian teniendo todas las particiones cifradas con LUKS, menos la partición /boot. Se utiliza como refencia el repositorio plymouth-themes.\n¿Qué es el Playmouth? Plymouth es una aplicación que se inicia muy temprano en el proceso de booteo o inicio (incluso antes de que el sistema de archivos esté montado) que proporcional una animación gráfica de booteo o inicio mientas el proceso de inicio ocurre en segundo plano.\nEsta diseñado para trabajar en sistemas que tengan drivers DRM modesetting. La idea es que muy temprano en el proceso de booteo o inicio se configure de forma nativa el modesetting, Plymouth usa este modo, este modo debe mantenerse durante todo el proceso de booteo o inicio incluso después de iniciar el servidor gráfico X. El máximo propósito es evitar los parpadeos durante el proceso de inicio 1.\nInstalación de Playmouth sudo apt install plymouth Modificación del Grub Modificar el archivo grub que viene por defecto:\nsudo nano /etc/default/grub Modificamos la línea 9 añadiendo splash:\nGRUB_CMDLINE_LINUX_DEFAULT=\"quiet splash\" Temas para el plymouth Clonamos el repositorio de temas:\ngit clone https://github.com/adi1090x/plymouth-themes.git Nos movemos dentro de algún directorio llamado pack_X, por ejemplo el pack_3:\ncd plymouth-themes/pack_3 Seleccionamos el tema que queremos, por ejemplo `lone:\nsudo cp -r lone /usr/share/plymouth/themes/ Plymouth - Debian ↩︎\n",
    "description": "",
    "tags": [
      "plymouth",
      "debian"
    ],
    "title": "Configuración del Plymouth",
    "uri": "/gnu_linux/debian/playmouth/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "plymouth",
    "uri": "/tags/plymouth/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "administración de sistemas",
    "uri": "/categories/administraci%C3%B3n-de-sistemas/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar una Raspberry Pi y hacerla accesible desde internet.\nAsignar IP fija a raspberry pi Para configurar una IP estática en derivados de Debian, debemos editar el fichero /etc/dhcpcd.conf con el comando:\nsudo nano /etc/dhcpcd.conf Descomentamos y modificamos las líneas que están comentandas para la IP estática de manera que nos quedaría lo siguiente:\ninterface eth0 static ip_address=192.168.1.200/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 Una vez guardado, reseteamos la raspberry:\nsudo reboot Y una vez encendida lo comprobamos con:\nip a Mapeo de IP a nombres más legibles Modificamos el archivo /etc/hosts en cada máquina que se quiera mapear la dirección IP a un nombre más legible con:\nsudo nano /etc/hosts Y añadimos al final:\n192.168.1.200 pi.local pi Seguridad Configuración SSH Una opción para hardenizar la configuración SSH es mediante la colección de ansible [ssh_hardening]](https://github.com/dev-sec/ansible-collection-hardening/tree/master/roles/ssh_hardening). Para la simplicación de esta sección, editaremos el archivo /etc/ssh/sshd_config y añadiremos lo siguiente.\nPort 2251 PermitRootLogin no ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no AuthenticationMethods publickey PubkeyAuthentication yes AllowUsers pi X11Forwarding no Banner /etc/issue Validamos la configuración del fichero sshd_config es correcta con los siguientes comandos:\n#Versión simple sudo sshd -t #Versión extendida sudo sshd -T Se guardan los cambios y se reinicia el servicio con:\nsudo systemctl restart ssh Ahora el comando para conectarnos es:\nssh -p 2251 pi@192.168.1.200 En caso de olvidar el puerto escogido, se puede hallar mediante un escaneo de puertos con el comando:\nsudo nmap -p 1-65535 -T4 -A -v \u003cip-servidora\u003e Configuración de fail2ban Se instala con los siguientes comandos:\nsudo apt-get update sudo apt-get install fail2ban Fail2ban trae un archivo de configuración de ejemplo: /etc/fail2ban/jail.conf. Es recomendable copiarlo y guardarlo en el mismo directorio con el nombre jail.local.\nsudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local Editamos el archivo jail.local y modificamos lo siguiente:\n# \"bantime\" is the number of seconds that a host is banned. bantime = 604800 # 7 days # A host is banned if it has generated \"maxretry\" during the last \"findtime\" # seconds. findtime = 3600 # \"maxretry\" is the number of failures before a host get banned. maxretry = 3 [sshd] # To use more aggressive sshd modes set filter parameter \"mode\" in jail.local: # normal (default), ddos, extra or aggressive (combines all). # See \"tests/files/logs/sshd\" or \"filter.d/sshd.conf\" for usage example and details. #mode = normal enable = true port = 2251 logpath = %(sshd_log)s backend = %(sshd_backend)s [traefik-auth] # to use 'traefik-auth' filter you have to configure your Traefik instance, # see `filter.d/traefik-auth.conf` for details and service example. enable = true port = http,https logpath = /var/log/traefik/access.log Como se puede apreciar, hemos activado los módulos de sshd y traefik con enable = true.\nUna vez modificado, reiniciamos el servicio con:\nsudo service fail2ban restart Para ver qué IPs han sido bloqueadas, se puede utilizar el siguiente comando:\nsudo cat /var/log/fail2ban.log | grep 'Ban' Para comprobar los módulos o jaulas activas, se utiliza:\nsudo fail2ban-client status Configuración del firewall UFW Se instala con:\nsudo apt-get install ufw Por defecto está desactivado, entonces, empezaremos configurando que deniegue cualquier tipo de conexión por cualquier puerto con el comando:\nsudo ufw default deny incoming Por otro lado, permitiremos las salidas de paquetes para cualquier puerto:\nsudo ufw default allow outgoing Ahora, permitiremos las conexiones de entrada de SSH en el puerto 2251 y para los servicios web en los puertos 80 (protocolo HTTP) y el 443 (protocolo HTTPS).\nsudo ufw allow 80,443,2251/tcp Para ver la regla añadida, se utiliza el comando:\nsudo ufw show added Se activan las reglas con el comando:\nsudo ufw enable Para ver el estado del cortafuegos se puede ejecutar:\nsudo ufw status verbose Mantener el sistema actualizado Automatizaremos la actualización de paquetes utilizando la herramienta crontab. Por ejemplo, actualizaremos el paquete ssh todos los días a las 7 de la mañana y que se guarden los logs en el archivo /var/log/ssh_update.txt.\nsudo crontab -e Añadimos la siguiente línea:\n0 7 * * * sudo apt update \u0026\u0026 sudo apt-get install ssh -y \u003e\u003e /var/log/ssh_update.txt 2\u003e\u00261 Configuración del router Entramos en la configuración del router buscando la IP 192.168.1.1 en un navegador. Cambiaremos la contraseña por defecto de administración y la SSID y contraseña del Wi-Fi.\nRecomendamos seguir la entrada de Configuración de seguridad y privacidad un router\n",
    "description": "",
    "tags": [
      "raspberry pi"
    ],
    "title": "Configurar una Raspberry Pi para hacerla accesible desde internet",
    "uri": "/blog/2021-11-01_raspberrypi-internet/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "redes",
    "uri": "/categories/redes/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "ansible",
    "uri": "/tags/ansible/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para configurar un servidor DNS en una Raspberry Pi.\nInstalación de DNSMasq sudo apt install -y dnsmasq Configuración de dnsmasq sudo nano /etc/dnsmasq.conf Buscamos (CTRL+W) y descomentamos las siguientes líneas eliminando el signo de almohadilla (#):\ndomain-needed - Configuramos el servidor DNS para que no reenvíe los nombres sin un punto (.) o un nombre de dominio a los servidores upstream. Los nombres sin punto o dominio se quedan en la red local. bogus-priv - Impide que el servidor DNS reenvíe las consultas de búsqueda inversa del rango de IP local a los servidores DNS ascendentes. Esto previene la filtración de la red local a los servidores upstream. no-resolv - Deja de leer los servidores de nombres upstream del archivo /etc/resolv.conf, confiando en cambio en los de la configuración de DNSMasq. Buscamos (CTRL+W) y eliminamos la siguiente línea:\n#sever=/localnet/192.168.0.1 La sustitimos por las DNS de Cloudflare:\nserver=1.1.1.1 server=1.0.0.1 Este paso hace uso de los servidores DNS de Google para los servidores de nombres ascendentes.\nBuscamos (CTRL+W) la siguiente línea:\n#cache-size=150 Descomentamos y cambiamos el tamaño de la caché a 1000:\ncache-size=1000 Aumentar el tamaño de la caché ahorra un mayor número de peticiones DNS a la caché de DNSMasq. El rendimiento de la red mejora porque el tiempo de búsqueda de DNS se reduce.\nGuardamos el archivo con CTRL+X, luego presionamos Y y pulsamos Enter para guardar los cambios.\nReiniciamos DNSMasq para aplicar los cambios:\nsudo systemctl restart dnsmasq Comprobamos el estado del servidor DNS con:\nsudo systemctl status dnsmasq Añadir una url sudo nano /etc/dnsmasq.d/example.conf Añadimos la ip local asociada a un nombre de dominio, por ejemplo home.localhost.\naddress=home.localhost/192.168.1.130 Probar el servidor DNS en una sudo apt install -y dnsutils ",
    "description": "",
    "tags": [
      "raspberry pi",
      "DNS",
      "redes",
      "administración de sistemas"
    ],
    "title": "Configuración de servidor DNS en una Raspbery Pi",
    "uri": "/blog/2021-11-22_configurar_dns_en_raspberry_pi/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "DNS",
    "uri": "/tags/dns/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "ESP8266",
    "uri": "/tags/esp8266/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "herramientas",
    "uri": "/tags/herramientas/"
  },
  {
    "content": "¿Qué es LineageOS? Instalación de LineageOS en Xiami Mi A1 Requerimientos Material utilizado en el escenario:\nXiaomi Mi A1 LineageOS16 oficial (nightly=en desarrollo) LineageOS17 Unofficial TWRP Recovery Descargas Descargar e instalar los archivos de desarrollo android(SDK platform) adb y fastboot(en mi caso: minimal_adb_fastboot_v1.4.3).\nActivar EOEM Se activa el EOEM y la depuración USB en los ajustes del teléfono.\nDesbloqueo del bootloader Se utilizan los siguientes comandos para desbloaquear bootloader. Se ejecutan en la carpeta de abd y fastboot:\nadb devices # Se reinicia el móvil en modo fastboot adb reboot bootloader # Se comprueba el estado del dispositivo fastboot oem device-info # Se desbloquea el bootloader fastboot oem unlock #Se reinicia el móvil Se comprueba que se ha desbloqueado correctamente con:\nadb devices adb reboot bootloader fastboot oem device-info Instalación del modo recovery Después de haber activado modo depuración USB y desbloqueado la eoem, se instala el modo recovery con el archivo .img en la misma carpeta que abd y fastboot:\nfastboot flash recovery twrp-installer-3.3.1-0-tissot.img Se obtiene el siguiente error:\ntarget reported max download size of 534773760 bytes sending 'recovery' (29348 KB)... OKAY [ 0.683s] writing 'recovery'... FAILED (remote: partition table doesn't exist) finished. total time: 0.699s Entonces descubrimos que se soluciona con:\nfastboot flash boot twrp-3.3.1-0-tissot.img Obtenemos el siguiente resultado:\nRESULTADO: fastboot flash boot twrp-3.3.1-0-tissot.img target reported max download size of 534773760 bytes sending 'boot' (29348 KB)... OKAY [ 0.679s] writing 'boot'... OKAY [ 0.181s] finished. total time: 0.860s Instalación de la imagen Se reinicia en modo recovery con botón power + vol arriba y se siguen los siguientes pasos:\nWipe-\u003e Format Data Advanced Wipe-\u003e Dalvikk, system y data Install -\u003e lineage-1-…-tissot.zip Wipe Dalvik t reboot sistem. Una vez seguidos, ya está instalado LineageOS. Por defecto no viene con Google Play instalado. En caso de dar algún error, se pueden instalar las GApps en su versión mínima, por ejemplo open_gapps-arm-9.0-pico-20200408.zip.\n",
    "description": "",
    "tags": [
      "lineageOS",
      "android"
    ],
    "title": "Instalación de LineageOS",
    "uri": "/gnu_linux/lineageos/lineageos/"
  },
  {
    "content": "En esta entrada se definen los pasos a seguir para instalar y configurar una Raspberry Pi para desplegar una serie de servicios.\n1. Instalación del SO Usando el programa Raspberry Pi Imager se puede quemar la imagen de Ubuntu, RaspberryPiOS, LibreElec o que prefieras, en cualquier tarjeta micro SD o USB 1. Por ejemplo elegiremos la imagen de Raspbian OS con escritorio y la quemaremos en un USB de 64GB.\nOtra forma de quemar una imagen en una tarjeta SD o un USB sería usando los siguientes comandos:\n# See the partitions lsblk # Umount the USB partition umount /dev/sdc1 # Format in vFAT mkfs.vfat -F 32 /dev/sdc -I # Flash the ISO into USB dd status=progress if=NAME.iso of=/dev/sdc 2. Configuración Básica Una vez esté instalado el sistema operativo, existen varias opciones para configurar la raspi. Se puede configurar sin necesidad de una pantalla, teclado y ratón extra como se explicó en un post anterior o usando estos tres periféricos externos. En este caso, usaremos una pantalla, un teclado y un ratón externo para simplificar la publicación. Por lo tanto, una vez encendida la raspi con el USB o la tarjeta SD conectada, aparecerá un dialogo para configurar el idioma, el wifi y una contraseña (por ejemplo: 1234567890).\n# Update and upgrade packages system sudo apt-get update -y \u0026\u0026 sudo apt-get upgrade -y Añadimos un alias par el hostname en el archivo /etc/hosts del oredenador que estemos utilizando para la configuración.\n\u003cip de la raspberry\u003e node-1 En el siguiente paso es necesario copiar la clave pública al archivo ~/.ssh/authorized_keys de la RaspberryPi. Para ello se utilizará el siguiente comando:\nssh-copy-id -i pi@\u003cip de la raspberry o node-1\u003e Ahora nos pedirá la contraseña de nuestra clave SSH y nos conectaremos a la RaspberryPi mediante:\nssh pi@node-1 3. Instalación de Programas Paquetes básicos sudo apt install -y software-properties-common git wget Docker y docker compose Instalación Instalamos docker con el script de instalación:\ncurl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh Mientras que la instación de docker-compose lo realizamos a través de pithon3:\nsudo apt-get install libffi-dev libssl-dev sudo apt install python3-dev sudo apt-get install -y python3 python3-pip sudo pip3 install docker-compose Añadir usuario al grupo docker sudo usermod -aG docker ${USER} Ansible sudo apt install -y ansible Instalar zsh y Oh my zsh2 sudo apt install zsh sh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\" Instalar Powerlevel10k Descargar y pegar las 4 fuentes .ttf Meslo Nerd en /usr/local/share/fonts. Deben tener los permisos 644 (-rw-r–r–).3\nMesloLGS NF Regular.ttf MesloLGS NF Bold.ttf MesloLGS NF Italic.ttf MesloLGS NF Bold Italic.ttf Creamos la carpeta /usr/local/share/fonts:\nsudo mkdir /usr/local/share/fonts cd /usr/local/share/fonts Descargamos las fuentes:\nsudo wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf Clonar el proyecto de powerlevel10k:\ngit clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k Sustituir el siguiente valor en ~/.zshrc:\nZSH_THEME=\"powerlevel10k/powerlevel10k\" Configurar al gusto y actualizar los cambios del fichero ~/.zshrc:\nsource ~/.zshrc Snapd Instalación Se instala los paquetes snapd y core:\nsudo apt install -y snapd core Añadir ruta de ejecutables al PATH de bash y Zhs Se añade la ruta de ejecutables snap al PATH:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc Se comprueba que se ha añadido correctamente la ruta:\necho $PATH Añadir lanzadores al menú de aplicaciones Se crea un enlace simbólico desde el directorio que almacena los lanzadores de snaps (/var/lib/snapd/desktop/applications) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/snapd/desktop/applications /usr/share/applications/snapd Flatpak Instalación De la documentación oficial de Flatpak, se siguen los siguientes pasos:\nInstalar Flatpak sudo apt install flatpak -y Se instala el repositorio de Flatpak flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo Se reinicia el sistema para aplicar los cambios. Añadir lanzadores al menú Se crea un enlace simbólico desde el directorio que almacena los lanzadores de flatpak (/var/lib/flatpak/exports/share/applications/) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/flatpak/exports/share/applications/ /usr/share/applications/flatpak KeePassXC Nota: se instala a través de Snap porque los repositorios oficiales tienen una versión desactualizada.\nSe instala a través de snap: sudo snap install keepassxc Se descarga la extensión para el navegador.\nSe configura la extensión del navegador a través de un script oficial de KeePassXC. Guardar script y ejecutar:\nwget https://raw.githubusercontent.com/keepassxreboot/keepassxc/master/utils/keepassxc-snap-helper.sh zsh keepassxc-snap-helper.sh En caso de obtener el error Could not find keepassxc.proxy! Ensure the keepassxc snap is installed properly., esto se debe a que falta añadir la ruta de ejecutables snap al PATH mediante:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc Volver a ejecutar el script:\nbash keepassxc-snap-helper.sh VSCodium [^4] Añade la clave GPG del repositorio: wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | gpg --dearmor | sudo dd of=/etc/apt/trusted.gpg.d/vscodium.gpg Añade el repositorio: echo 'deb [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs vscodium main' | sudo tee /etc/apt/sources.list.d/vscodium.list Actualización de repositorios e instalación de VSCodium: sudo apt update \u0026\u0026 sudo apt install codium Configuración usando Ansibles Usando una colección Instalación: ansible-galaxy install dev-sec.os-hardening ansible-galaxy install dev-sec.ssh-hardening Crea un playbook para cada rol de ansible llamado ansible-os-hardening.yaml y ansible-ssh-hardening.yaml.\nEjecuta estos playbooks con los siguientes comandos:\nansible-playbook ansible-os-hardening.yaml --ask-become-pass ansible-playbook ansible-ssh-hardening.yaml --ask-become-pass Usando un playbook básico Añade tu clave ssh en un ssh-agent usando zsh (o bash): ssh-agent zsh ssh-add ~/.ssh/id_ed25519 Ejecutar el playbook de ansible con la contraseña sudo requerida para los comandos: ansible-playbook playbook.yaml --ask-become-pass Instalación de Ubuntu en la Raspberry - Atareao ↩︎\nDebian Documentation, Fonts ↩︎\nVSCodium Documentation, Installation ↩︎\n",
    "description": "",
    "tags": [
      "raspberry pi",
      "ansible"
    ],
    "title": "Instalación y configuración de una Raspbery Pi",
    "uri": "/blog/2021-10-21_raspberrypi-ii/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "lineageOS",
    "uri": "/tags/lineageos/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "WLED",
    "uri": "/tags/wled/"
  },
  {
    "content": "Purgar todos los recursos de Docker docker system prune --all docker system prune --volumes Eliminar todas las imágenes docker rmi -f $(docker images -a -q) ",
    "description": "",
    "tags": [
      "GNU/Linux",
      "docker"
    ],
    "title": "Comandos útiles de docker",
    "uri": "/blog/2021-06-20-docker-cheatsheet/"
  },
  {
    "content": "Purgar todos los recursos de Docker docker system prune --all docker system prune --volumes Eliminar todas las imágenes docker rmi -f $(docker images -a -q) ",
    "description": "",
    "tags": [
      "GNU/Linux",
      "docker"
    ],
    "title": "Comandos útiles de docker",
    "uri": "/sysadmin/docker/cheatsheet/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "devops",
    "uri": "/categories/devops/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "docker",
    "uri": "/tags/docker/"
  },
  {
    "content": "Hacking Awesome hacking Awesome Hacking Resources Administración de sistemas Snowflake SSH Client es una navaja suiza para los administradores de sistemas Análisis de red Subdominios Comparativa de herramientas de enumeración de subdominios:\nAmass: más lenta pero encuentra más subdominios válidos Findomain: más rápida con buen número de subdominios encontrados Subfinder Sublist3r DNSRecon dnssearch Knock SubBrute Programación segura Revisión de código De pago: Check Marx VeraCode Fortify AppScan-IBM Kiuwan Revisión de dependencias: Dependency check Kiuwan Sonatype SourceClear BlackDuck Snyk Secretos hardcodeados (contraseñas en el código) Gitleaks ",
    "description": "",
    "tags": [
      "GNU/Linux",
      "docker"
    ],
    "title": "Recopilación de herramientas de seguridad",
    "uri": "/security/recopilacion/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "Arch",
    "uri": "/tags/arch/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "cifrado",
    "uri": "/tags/cifrado/"
  },
  {
    "content": "En esta entrada se configurará el sistema operativo Debian.\n¿Qué es Debian? Debian GNU/Linux es un sistema operativo libre, desarrollado por miles de voluntarios de todo el mundo, que colaboran a través de Internet.\nLa dedicación de Debian al software libre, su base de voluntarios, su naturaleza no comercial y su modelo de desarrollo abierto la distingue de otras distribuciones del sistema operativo GNU1.\nAñadir drivers para la tarjeta de WiFi y NVIDIA Ejecutando los siguientes comandos se iniciará sesión como root y se añadirán los repositorios necesarios para añadir los drivers no incluidos en los repositorios totalmente libres:\n# Log in as root su - # Install vim apt install -y vim # Add contrib and non-free reopositories ## Edit /etc/apt/sources.list vim /etc/apt/sources.list ## Add contrib and non-free at the end deb http://mirror.librelabucm.org/debian/ buster main contrib non-free deb http://security.debian.org/debian-security buster/updates main contrib non-free deb http://mirror.librelabucm.org/debian/ buster-updates main contrib non-free # Add non-free drivers for WiFi apt install -y firmware-iwlwifi firmware-atheros firmware-misc-nonfree firmware-intelwimax firmware-realtek firmware-linux firmware-linux-nonfree Comprobar que los paquetes han sido instalados:\nsudo apt list --installed | grep firmware Añadir a un usuario al grupo sudo su - usermod -aG sudo username Comprobar que se ha añadido al grupo sudo getent group sudo Iniciar sesión con el usuario del grupo sudo su - username Instalar git y wget sudo apt install git wget -y Instalar zsh y Oh my zsh2 sudo apt install zsh sh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\" Instalar Powerlevel10k Descargar y pegar las 4 fuentes .ttf Meslo Nerd en /usr/local/share/fonts. Deben tener los permisos 644 (-rw-r–r–).3\nMesloLGS NF Regular.ttf MesloLGS NF Bold.ttf MesloLGS NF Italic.ttf MesloLGS NF Bold Italic.ttf Creamos la carpeta /usr/local/share/fonts:\nsudo mkdir /usr/local/share/fonts cd /usr/local/share/fonts Descargamos las fuentes:\nsudo wget https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf Clonar el proyecto de powerlevel10k:\ngit clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k Sustituir el siguiente valor en ~/.zshrc:\nZSH_THEME=\"powerlevel10k/powerlevel10k\" Configurar al gusto y actualizar los cambios del fichero ~/.zshrc:\nsource ~/.zshrc Añadir lanzadores al menú Utilizar el siguiente comando para emular en zsh las aplicaciones en /etc/profile.\nemulate sh -c 'source /etc/profile' Instalación de programas recomendados Snapd Instalación Se instala los paquetes snapd y core:\nsudo apt install snapd sudo snap install core Añadir ruta de ejecutables al PATH de bash y Zhs Se añade la ruta de ejecutables snap al PATH:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc Se comprueba que se ha añadido correctamente la ruta:\necho $PATH Añadir lanzadores al menú de aplicaciones Se crea un enlace simbólico desde el directorio que almacena los lanzadores de snaps (/var/lib/snapd/desktop/applications) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/snapd/desktop/applications /usr/share/applications/snapd Flatpak Instalación De la documentación oficial de Flatpak, se siguen los siguientes pasos:\nInstalar Flatpak sudo apt install flatpak -y Se instala el repositorio de Flatpak flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo Se reinicia el sistema para aplicar los cambios. Añadir lanzadores al menú Se crea un enlace simbólico desde el directorio que almacena los lanzadores de flatpak (/var/lib/flatpak/exports/share/applications/) al directorio de aplicaciones del sistema (usr/share/applications/)\nsudo ln -s /var/lib/flatpak/exports/share/applications/ /usr/share/applications/flatpak Aptitude sudo apt install aptitude Cliente de sincronización de Nextcloud Descargar el archivo AppImage desde Nextcloud, darle permisos de ejecución al usuario y ejecutarlo con:\nchmod u+x Nextcloud-3.3.5-x86_64.AppImage ./Nextcloud-3.3.5-x86_64.AppImage Sincronizar carpetas.\nKeePassXC Nota: se instala a través de Snap porque los repositorios oficiales tienen una versión desactualizada.\nSe instala a través de snap: sudo snap install keepassxc Se descarga la extensión para el navegador.\nSe configura la extensión del navegador a través de un script oficial de KeePassXC. Guardar script y ejecutar:\nwget https://raw.githubusercontent.com/keepassxreboot/keepassxc/master/utils/keepassxc-snap-helper.sh zsh keepassxc-snap-helper.sh En caso de obtener el error Could not find keepassxc.proxy! Ensure the keepassxc snap is installed properly., esto se debe a que falta añadir la ruta de ejecutables snap al PATH mediante:\necho \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.zshrc source ~/.zshrc echo \"export PATH=$PATH:/snap/bin\" \u003e\u003e ~/.bashrc source ~/.bashrc Volver a ejecutar el script:\nbash keepassxc-snap-helper.sh VSCodium 4 Añade la clave GPG del repositorio: wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | gpg --dearmor | sudo dd of=/etc/apt/trusted.gpg.d/vscodium.gpg Añade el repositorio: echo 'deb [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/debs vscodium main' | sudo tee /etc/apt/sources.list.d/vscodium.list Actualización de repositorios e instalación de VSCodium: sudo apt update \u0026\u0026 sudo apt install codium Usar LaTeX con VSCodium En settings buscar por word wrap y activar para que las líneas no sean infinitas. Instalar la distibución de LaTeX Texlive (recomendada por la extensión LateX Workshop de VSCodium), ChkTex para comprobar la semántica de Latex y texlive-extra-utils para extensiones como latexindent. apt-get install -y texlive texlive-latex-extra texlive-extra-utils chktex latexmk texlive-fonts-recommended texlive-fonts-extra texlive-science texlive-latex-base-doc Añadir la ruta echo 'export PATH=$PATH:/usr/share' \u003e\u003e ~/.bashrc echo 'export PATH=$PATH:/usr/share' \u003e\u003e ~/.zshrc source ~/.bashrc source ~/.zshrc Inskape Instalar a través de los repositorios de flatpak.\nflatpak install org.inkscape.Inkscape Mattermost-Desktop Según la documentación oficial de Mattermost, para los sistemas operativos basados en Debian, los pasos a seguir son:\nSe descarga la última version de Mattermost (usar la página documentación oficial): 64-bit systems mattermost-desktop-4.6.2-linux-amd64.deb Zotero Los pasos que se han tomado de referencia son los que vienen en la wiki de Debian para instalar Zotero.\nSe instala Zotero a través de Flatpak:\nflatpak install flathub org.zotero.Zotero Se añade Zotero al PATH:\necho 'export PATH=$PATH:/var/lib/flatpak/exports/bin' \u003e\u003e ~/.bashrc Se ejecuta Zotero:\nflatpak run org.zotero.Zotero Se sincroniza la biblioblioteca y se instala el plugin BetterBibTex. Para instalar el plugin de BetterBibTex se sigue su documentación.\nUna vez instalado, añadir el siguiente script para que añada las keywords al exportarlo con\nOwnCloud Seguir la guía de installación para Debian.\nUna vez esté instalado, sincronizar carpetas.\nThunderbird Copiar y pegar la carpeta .thunderbird para hacer migración completa. Instalar con:\nsudo apt install thunderbird Pip sudo apt install python3-pip Node y npm sudo curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash - sudo apt-get install -y nodejs Kubernetes kubectl Install using native package management\nConfiguración de sonido HDMI Según este post, se debe añadir en /etc/pulse/default.pa lo siguiente:\nload-module module-alsa-sink device=hdmi:0 load-module module-combine-sink sink_name=combined set-default-sink combined Customización de xfce en Debian Tema Se descargan temas desde xfce-look, filtrando por rating. Alguno recomendado son Qogir-dark, Ultimate-dark o Nordic . Se descomprimen y se copian en la carpeta .themes, ubicada en /home/nombreUsuario/.themes.\nSe accede a Appeareance -\u003e Themes -\u003e Qogir-dark.\nIconos Se añaden los iconos Qogir-dark. Son descargados de xfce-look, se descomprimen y se copian en la carpeta .icons ubicada en /home/nombreUsuario/.icons.\nSe accede a Appeareance -\u003e Icons -\u003e Qogir-dark\nDock Instalación de Plank:\nsudo apt-get install plank Gestor de ventanas Instalar emerald:\nsudo apt install emerald Ejecutar el programa emerald-theme-manager y escoger un tema:\nemerald-theme-manager Correr en segundo plano:\nemerald --replace \u0026 Plymouth Pasos seguidos de la wiki oficial de Debian.\nGestor de ventanas i3wm sudo apt install i3 i3status Wikipedia, Debian ↩︎\nOh My Zsh Documentation, Install oh-my-zsh ↩︎\nDebian Documentation, Fonts ↩︎\nVSCodium Documentation, Installation ↩︎\n",
    "description": "",
    "tags": [
      "GNU/Linux",
      "debian"
    ],
    "title": "Configuración de Debian",
    "uri": "/blog/2021-04-02-debian_configuration/"
  },
  {
    "content": "En esta entrada se instalará y se configurará el sistema operativo Debian con volúmenes LVM cifrados con LUKS.\n¿Qué es Debian? Debian GNU/Linux es un sistema operativo libre, desarrollado por miles de voluntarios de todo el mundo, que colaboran a través de Internet.\nLa dedicación de Debian al software libre, su base de voluntarios, su naturaleza no comercial y su modelo de desarrollo abierto la distingue de otras distribuciones del sistema operativo GNU1.\n¿Qué es LVM (Logical Volume Manager)? LVM es una implementación de un gestor de volúmenes lógicos para el núcleo Linux. LVM incluye muchas de las características que se esperan de un administrador de volúmenes, incluyendo:\nRedimensionado de grupos lógicos Redimensionado de volúmenes lógicos Instantáneas de sólo lectura (LVM2 ofrece lectura y escritura) RAID0 de volúmenes lógicos. LVM no implementa RAID1 o RAID5, por lo que se recomienda usar software específico de RAID para estas operaciones, teniendo las LV por encima del RAID2. En esta configuración no se usará RAID.\n¿Qué es LUKS (Linux Unified Key Setup)? LUKS es una especificación de cifrado de disco creado por Clemens Fruhwirth, originalmente destinado para Linux. Mientras la mayoría del software de cifrado de discos implementan diferentes e incompatibles formatos no documentados, LUKS especifica un formato estándar en disco, independiente de plataforma, para usar en varias herramientas. Esto no sólo facilita la compatibilidad y la interoperabilidad entre los diferentes programas, sino que también garantiza que todas ellas implementen gestión de contraseñas en un lugar seguro y de manera documentada. La implementación de referencia funciona en Linux y se basa en una versión mejorada de cryptsetup, utilizando dm-crypt como la interfaz de cifrado de disco3.\nTabla de particiones Se utiliza el formato ext4 para las particiones porque mejora la velocidad de entrada y salida y utiliza menos CPU que los formatos ext3 y ext2. Se recomiendan como mínimo los siguientes valores:\nParticion Tamaño recomendado Asignado Debian Asignado Propio Contiene / \u003e= 750MB 22GB 64GB /etc, /bin, /sbin, /lib, /dev, /usr /usr \u003e= 4-6GB 0 0 Programas de usuario, lib y docs /var \u003e= 2-3GB 32GB 112GB Variables de datos como emails /tmp \u003e= 100MB 16GB 32GB Páginas web, caché de paquetes, datos temporales /home \u003e= 100MB 200GB 288GB Directorio con Documentos, Descargas, … /boot \u003e= 256MB 500MB 512GB Partición Primaria, ext4 o ext2, no se recomienda cifrarla /boot/efi \u003e= 100MB 250MB 0 No se recomienda cifrarla y bootable flag: on /swap \u003e= 8GB 16GB 16GB Área de intercambio Pasos seguidos Se recomienda conectar la máquina a través de ethernet para que se actualice el sistema durante la instalación.\nSe configura el idioma, región, teclado, etc. (Saltar paso) Se realiza unas particiones manuales, concretamente se realizan 3, una para /boot, otra para /boot/efi y otra para las demás particiones que irá cifrada a través de LUKS. Se cifra con LUKS y se elige una contraseña de más de 20 carácteres. Se crea un volumen LVM y posteriormente se realizan las particiones de volumen lógico para cada partición. Se asignan las etiquetas y se termina la configuración de las particiones. Se le da un hostname y se crea el usuario root y el usuario sin privilegios de administrador. Referencias recomendadas Arch Wiki, dm-crypt/Encrypting an entire system Debian Wiki, LVM Youtube, How to install Debian GNU/Linux with LUKS encrypted LVM Wikipedia, Debian ↩︎\nWikipedia, Logical Volume Manager (Linux) ↩︎\nWikipedia, LUKS (Linux Unified Key Setup) ↩︎\n",
    "description": "Instalación de Debian con volúmenes LVM cifrados con LUKS",
    "tags": [
      "GNU/Linux",
      "debian",
      "lvm",
      "cifrado"
    ],
    "title": "Instalación de Debian con volúmenes LVM cifrados con LUKS",
    "uri": "/blog/2021-04-02-install_debian/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "lvm",
    "uri": "/tags/lvm/"
  },
  {
    "content": "Crear un grupo Se crea el grupo shared: sudo groupadd shared Añadir usuario Se añade el usuario devops al grupo shared: sudo usermod -a -G shared devops Para que los cambios surtan efecto se requiere cerrar sesión y volver a entrar en el usuario devops. Se comprobará con el comando:\ngroups Cambiar el grupo de una carpeta y sus ficheros Se cambia el grupo de la carpeta wiki por shared: sudo chgrp -R shared wiki Añadir permisos de escritura para el un grupo en una carpeta y sus ficheros Se añade los permisos de escritura w para el grupo de usuarios de la carpeta wiki.\nsudo chmod -R g+w wiki ",
    "description": "",
    "tags": [
      "GNU/Linux",
      "debian"
    ],
    "title": "Permisos en GNU/Linux",
    "uri": "/blog/2021-05-08_permisos/"
  },
  {
    "content": "Crear un grupo Se crea el grupo shared: sudo groupadd shared Añadir usuario Se añade el usuario devops al grupo shared: sudo usermod -a -G shared devops Para que los cambios surtan efecto se requiere cerrar sesión y volver a entrar en el usuario devops. Se comprobará con el comando:\ngroups Cambiar el grupo de una carpeta y sus ficheros Se cambia el grupo de la carpeta wiki por shared: sudo chgrp -R shared wiki Añadir permisos de escritura para el un grupo en una carpeta y sus ficheros Se añade los permisos de escritura w para el grupo de usuarios de la carpeta wiki.\nsudo chmod -R g+w wiki ",
    "description": "",
    "tags": [
      "GNU/Linux",
      "debian"
    ],
    "title": "Permisos en GNU/Linux",
    "uri": "/gnu_linux/permisos/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "capitalismo de vigilancia",
    "uri": "/tags/capitalismo-de-vigilancia/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "derechos digitales",
    "uri": "/tags/derechos-digitales/"
  },
  {
    "content": "En esta entrada se instalará y se configurará Nextcloud para una Raspberry Pi. Se utilizará la versión dockerizada nextcloudpi y se instalará sobre el sistema operativo HypriotOS.\n¿Qué es Nextcloud? Nextcloud es una serie de programas de código abierto, tanto el cliente como el servidor, con el objetivo de crear un servicio de alojamiento de archivos. Permite el alojamiento en un servidor propio, a modo de nube privada, para no tener la dependencia de nubes de terceros como Dropbox o Google Drive.\n¿Qué es Nextcloudpi? NextCloudPi es una instacia especial de Nextcloud que está adaptada y optimizada al hardware de las Raspberry Pi. De manera que garantiza la interacción más fluida posible de todos los componentes.\n¿Qué es HypriotOS? HypriotOS es un sistema operativo basado en Debian optimizado para ejecutar Docker en plataformas ARM como las Raspberry Pi.\nInstalación de HypriotOS En los siguientes pasos, se procede a quemar la imagen de HypriotOS en una tarjeta SD que esté conectada a un ordenador con sistema operativo GNU/Linux con distribuciones basadas en Debian o en Arch.\nFlasheo de la imagen Para quemar la imagen dentro de la tarjeta microSD, existen diversas maneras de hacerlo. Se recomienda utilizar la herramienta flash instalada de como se indica en su página de documentación:\nInstalación de la herramienta flash Distribuciones basadas en Debian: Se instala la herramienta con los siguientes comandos:\ncurl -LO https://github.com/hypriot/flash/releases/download/2.7.0/flash chmod +x flash sudo mv flash /usr/local/bin/flash Se instalan las dependencias con:\nsudo apt-get install -y pv curl python-pip unzip hdparm sudo pip install awscli Distribuciones basadas en Arch: La instalación más cómoda es instalar el paquete desde los repositorios oficiales de Arch. Para encontrar el paquete en el programa de añadir software buscar flash hypriot.\nQuema de la imagen en la tarjeta SD Una vez instalada la herramienta para quemar la imagen, se copia el enlace de la imagen ISO comprimida desde la página oficial de HypriotOS o se descarga la imagen. Durante el flasheo de la imagen, se puede realizar la configuración inicial del usuario y de la conexión WiFi. En caso de descargar la imagen es necesario verificar que el checksum es el mismo con los siguientes comandos:\nsha256sum hypriotos-rpi-v1.12.3.img.zip cat hypriotos-rpi-v1.12.3.img.zip.sha256 Una vez verificado el checksum se puede flasear la imagen con el comando a continuación. Aunque se recomienda leer y seguir la opción de configurar el WiFi antes de quemar la imagen.\nsudo flash hypriotos-rpi-v1.10.0.img.zip Para quemar la imagen con el enlace directo, ejecutar:\nsudo flash https://github.com/hypriot/image-builder-rpi/releases/download/v1.12.3/hypriotos-rpi-v1.12.3.img.zip Solicitará la ubicación de la partición de la tarjeta SD y una confirmación. Una vez termine el proceso, se introducirá la SD en la Raspberry Pi y ya está lista para usar.\nConfiguración del usuario inicial y WiFi Primer creamos un archivo llamado wifi.yaml con la siguiente plantilla, donde es necesario modificar el SSID del WiFi y la clave precompartida en texto plano o cifrada con wpa_passphrase SSID passwordWiFi. En caso de añadir la clave en texto plano será necesario ponerla entre comillas psk=\"ContraseñaWiFi\", mientras que si se añade cifrada no serán necesarias las comillas psk=jghXt58cfvfgbksFSJhoA. Para conseguir la contraseña cifrada es necesario ejecutar en un terminal wpa_passphrase \"NOMBRE_WIFI\" pedirá la contraseña en texto plano y devolverá la contraseña cifrada.\n#cloud-config # vim: syntax=yaml # # Set your hostname here, the manage_etc_hosts will update the hosts file entries as well hostname: hypriot manage_etc_hosts: true # You could modify this for your own user information users: - name: pi gecos: \"Hypriot Pirate\" sudo: ALL=(ALL) NOPASSWD:ALL shell: /bin/bash groups: users,docker,video,input plain_text_passwd: hypriot lock_passwd: false ssh_pwauth: true chpasswd: { expire: false } # # Set the locale of the system locale: \"es_ES.UTF-8\" # # Set the timezone # # Value of 'timezone' must exist in /usr/share/zoneinfo timezone: \"Europe/Madrid\" # # Update apt packages on first boot package_update: true package_upgrade: true package_reboot_if_required: true #package_upgrade: false # # Install any additional apt packages you need here packages: - software-properties-common # - python-software-properties # - xinput-calibrator # - console-data # - keyboard-configuration # - ntp # # WiFi connect to HotSpot # # - use `wpa_passphrase SSID PASSWORD` to encrypt the psk write_files: - content: | allow-hotplug wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp path: /etc/network/interfaces.d/wlan0 - content: | country=es ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid=\"NOMBRE_WIFI\" psk=\"ContraseñaWiFi\" proto=RSN key_mgmt=WPA-PSK pairwise=CCMP auth_alg=OPEN } path: /etc/wpa_supplicant/wpa_supplicant.conf # These commands will be ran once on first boot only runcmd: # Pickup the hostname changes - 'systemctl restart avahi-daemon' # # Activate WiFi interface - 'ifup wlan0' Una vez se haya descargado la imagen de HypriotOS y se haya configurado la platilla de configuración inicial guardada como wifi.yaml. Desde el mismo directorio que almacena los dos archivos ejecutamos:\nsudo flash --hostname hypriot --userdata wifi.yaml hypriotos-rpi-v1.12.3.img.zip Donde el flag --hostname sirve para cambiar el nombre de la máquina y el flag --userdata sirve para cargar la configuración inicial.\nSolicitará la ubicación de la partición de la tarjeta SD y una confirmación. Una vez termine el proceso, se introducirá la SD en la Raspberry Pi y ya está lista para usar.\nEn caso de querer cambiar el hostname después de la instalación, usar el siguiente comando:\nsudo hostnamectl set-hostname --static nuevohostname Además, para que sea un cambio persistenten es necesario modificar el archivo sudo nano /etc/cloud/cloud.cfg con lo siguiente:\npreserve_hostname: true Después comprobar que se ha cambiado el hostname en /etc/hostname y en /etc/hosts, si no es así modificarlo manualmente. Por último, reiniciar el sistema. Todo lo anterior es necesario debido a un error a partir de la versión de Hypriot 1.11 1.\nPrimer arranque de Raspberry Pi con HypriotOS Una vez instalado HypriotOS en la tarjeta SD, se introduce en la tarjeta en la Raspberry Pi y se conecta a la corriente de alimentación. Si se siguieron correctamento los pasos para preconfigurar el WiFi, al arrancar (tardará varios minutos, aproximadamente entr 5-10mins) será posible conectarse mediante SSH a la Raspberry Pi sin necesidad de conectar un cable RJ-45 (Ethernet) al router ni un teclado y monitor directamente a la máquina. Aunque a pesar de haber seguido correctamente los pasos antiores, se recomienda utilizar un teclado, un monitor y una conexión a internet mediante un cable Ethernet al router en el primer arranque. En caso de no tener monitor ni teclado, saltar a los pasos del apartado Localización de de la IP local de la Rasberry Pi y Acceso mediante ssh, leyendo los pasos anteriores para conocer las credenciales por defecto.\nIniciar sesión En caso de no haber utilizado, durante la instalación de hypriot, el flag –user-data con el fichero de configuración wifi.yaml, el usuario por defecto es pirate y la contraseña hypriot.\nEn caso de si haber utilizado el fichero de ejemplo, el usuario es pi y la contraseña hypriot.\nCambio de la contraseña por defecto Es obligatorio cambiar la contraseña del usuario por defecto (pirate) o del usuario creado con la configuración del archivo .yaml (pi) a partir de este punto.\nPara cambiar la contraseña se utiliza el comando:\npasswd Según el blog de HyriotOS 2, por motivos de seguridad no existe un usuario root construido por defecto.\nCambio de idioma de teclado Una vez conectado el monitor y el teclado USB, por defecto se ejecuta el teclado de US (Estados Unidos). Para cambiar al teclado ES (España), instalar el paquete console-data:\nsudo apt install console-data Se abrirá una pantalla gráfica con cuatro opciones, seleccionar la opción select keymap from full list. En la siguiente ventana seleccionar pc/qwerty/Spanish/Standard/CP850.\nAhora ya funcionarán todas las letras menos la ñ. Para poder usarla ejecutar:\nsudo loadkeys es Localización de la IP local de la Rasberry Pi Un método para conocer la IP de la Raspberry Pi, contectada a un monitor y un teclado, iniciar sesión con el usuario por defecto pirate(o el usuario de wifi.yaml, en el ejemplo es pi) y la contraseña por defecto hypriot. Una vez dentro, se ejecuta el comando:\nsudo ip addr show Primero ver a qué red local estamos conectados con el ordenador que queremos configurar la raspberry pi:\nsudo ip addr show ó\nsudo ifconfig Una vez que tengamos el rango de la subred (habitualmente siempre es por defecto la 192.168.1.0/24), realizamos un escaneo de red con nmap:\nsudo nmap -f 192.168.1.0/24 El flag -f es para realizar el escaneo rápido y poder averiguar la IP de la Raspberry mediante los dígitos fijos de la MAC del fabricante.\nUna vez terminado el escaneo, se mostrará una IP que la dirección MAC la identifique como un producto de la RaspberryPi Foundation.\nOtra opción para conocer la IP de la raspberry pi es a través de la interfaz web del router, accediendo mediante un navegador a http://192.168.1.1/. Solicitará la contraseña del router, por defecto siempre está escrita debajo del propio dispositivo o es admin o 1234). Dentro de la interfaz se debería de ver la IP asignada a la raspberry pi. Si se utiliza este método, se recomienda asignar una IP estática a la MAC de la raspberry pi para que siempre que se conecte al router se pueda acceder a través de la misma IP.\nAcceso mediante SSH Una vez se haya localizado la IP privada de la Raspberry y se conozca cuál es el usuario creado durante la instalación (usuario pirate y contraseña hypriot por defecto), ejecutamos lo siguiente:\nssh \u003cusuario\u003e@\u003cip_privada_raspberry_pi\u003e #Por ejemplo, en caso de haber usado el archivo wifi.yaml: ssh pi@192.168.1.50 Configuración de SSH a través de claves público-privada en vez de contraseña Desde el ordenador utilizado y desde la propia Raspberry Pi, al ejecutar el siguiente comando se generarán dos claves RSA, una pública y otra privada:\nssh-keygen Pedirá una contraseña y una vez generadas las claves, copiar el contenido de la clave pública $HOME/.ssh/id_rsa.pub en el fichero /home/pi/.ssh/authorized_keys de cada nodo del clúster. Para ello, se recomienda utilizar el siguiente comando:\nssh-copy-id -i $HOME/.ssh/id_rsa.pub pi@\u003cip de la raspberry\u003e Solicitará la contraseña de la clave SSH y se conectará a la Raspberry Pi.\nA partir de ahora, cada vez que se acceda por SSH a algún nodo, por defecto se pedirá la contraseña de la clave privada SSH en vez de la contraseña de sesión del nodo.\nLo último, será restringir el acceso remoto con contraseñas. De manera que sólo se podrán conectar remotamente a las máquinas aquellas que hayan subido previamente su clave pública SSH a cada Rasberry Pi. Para realizarlo, es necesario editar el fichero de configuración sshd_config y modificar la línea PasswordAuthentication no.\nsudo nano /etc/ssh/sshd_config En la línea PasswordAuthentication se modifica a no:\nPasswordAuthentication no Se guardan los cambios y se reinicia el servicio con:\nsudo service ssh restart Cambio del puerto por defecto de las conexiones SSH Una práctica de seguridad habitual es cambiar el puerto por defecto de SSH (puerto 22). Esto es porque durante un ataque, probablemente se pruebe la conexión por ese puerto. De esta manera, al cambiar el puerto, se reducen el número de intentos de conexión por parte de posibles atacantes 3.\nSe puede escoger un puerto alto entre el 1024 hasta el 65535, para evitar los escaneos rápidos de red de los puertos más comunes. Antes de seleccionar un puerto, es necesario revisar que no haya otro servicio utilizando el mismo puerto. Para ello se ejecuta el comando:\nnetstat -ltnp Donde los flags son:\nl muestra sólo los sockets a la escucha t muestra las conexiones tcp n muestra las direcciones de forma numérica p muestra los identificadores de procesos/programa Una vez comprobado que el puerto seleccionado no está en uso se modifica el archivo de configuración de SSH:\nsudo nano /etc/ssh/sshd_config Se cambia la línea #Port 22 por otro puerto, por ejemplo, Port 2251. Se guarda el fichero y se reinicia el servicio con:\nsudo service ssh restart En caso de haber un error en el proceso de cambio de puerto, se cerrará la sesión ssh de la máquina y se perderá el acceso. Por lo tanto, es recomendable estar físicamente cerca de la máquina.\nA partir de este momento, para acceder vía SSH a cada Raspberry Pi será necesario especificar el puerto modificado. El mandato a ejecutar será:\nssh -p 2251 pi@\u003cdirección ip\u003e En caso de olvidar el puerto escogido, se puede hallar mediante un escaneo de puertos con el comando:\nsudo nmap -p 1-65535 -T4 -A -v \u003cip-servidora\u003e Actualizar el sistema Utilizando la configuración del archivo wifi.yaml se actualizan todos los paquetes del sistema al iniciarlo, aunque para actualizar el sistema se utiliza en algún momento particular se utiliza:\nsudo apt update -y sudp apt upgrade -y Configurar cortafuegos ufw Para instalar el cortafuegos ufw ejecutar:\nsudo apt-get install ufw Permitimos las conexiones por el puerto 80 (HTTP), 443(HTTPS), 2251(SSH configurado) y 4443(puerto de configuración de nextcloud).\nsudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow 4443/tcp sudo ufw allow 2251/tcp Para activarlo:\nsudo ufw enable Para ver las reglas por defecto:\nsudo ufw show raw También se puede ver con un formato más legible:\nsudo ufw status verbose Apagar la Raspberry Pi de forma correcta Para apagar la Raspberry Pi evitando que se corrompa la tarjeta SD se ejecuta el siguiente comando:\nsudo shutdown -h now Esperar a que la luz verde deje de parpadear y ya desenchufar el cable de alimentación.\nObtener dominio Se requiere un dominio en caso de querer acceder desde el exterior de la red local, en otras palabras, desde Internet. Para ello existen varias páginas donde obtener dominios gratuitos o por menos de 1€ al año. Lo más importante es que el resgistrador de nombres de dominio tenga protección de Whois (WhoisGuard) para prevenir ataques de spam o de suplantación de indentidad a través de los datos personales que tienen que ser públicos al registrar un dominio en el ICANN.\nEn caso de usar un dominio de freenom, es necesario cambiar el DNS a un de Cloudflare siguiendo los pasos de este tutorial.\nInstalar NextcloudPi con Docker Para levantar el contenedor docker de nextcloudpi, simplemente se necesitan los siguientes pasos:\nAñadir la variable de entorno con el nombre del dominio: $DOMINIO=dominioejemplo.org Levantar el contenedor desde el repositorio de Docker Hub: docker run -d -p 4443:4443 -p 443:443 -p 80:80 -v ncdata:/data --restart unless-stopped --name nextcloudpi ownyourbits/nextcloudpi $DOMINIO Activación de nextcloudpi Escribir en el navegador la dirección http://\u003cIP-Raspberry-Pi\u003e. Aceptar el riesgo de seguridad. Aparecerá la ventana de activación de nextcloudpi. Es importante guardar las credenciales que se muestran, por ejemplo:\nNextcloudpi: ncp cVYu90pMiZ8GyglILiLVUlD67ID69AOCarv68l4l/so Nextcloud user: ncp 1CAhXuQgPEQ99/zfI5xeCNaE7cHeqZpjGhYnuBqVehI Pulsar activar e introducir las credenciales de nextcloudpi. En la primera ejecución, si se quiere acceder al servidor desde la fuera de la red local, se pedirá que se realice el Port forwarding para los puerto 80 (HTTP) y 443(HTTPS) para la IP asignada a la raspberrypi. Se necesita acceder al router desde un navegador a la IP 192.168.1.1 mediante la contraseña del router, suele estar en una etiqueta debajo del router o por defecto es admin o 1234. Si no se permite desde la configuración del proveedor, será necesario realizarlo desde los ajustes avanzados del router.\nUna vez realizado, o en caso de no que no quiera ser accesible desde fuera, se requiere ir al panel de configuración de nextcloudpi y en CONFIG-\u003enc-trusted-domains\nAceso a nextcloud Mediante el usuario ncp y la contraseña del Nextcloud user, ya se puede acceder al servidor de almacenamiento Nextcloud. Además tiene para calendario, notas, tareas y otras herramientas y aplicaciones que se pueden añadir como edición de textos de manera colaborativa, videollamadas, servidor de comunicación, mapas, reproductor de música y radio, gestor de contraseña, etc. Tiene una infinidad de opciones.\nHypriot GitHub. Issue: hostname can not be changed using normal CLI methods ↩︎\nHypriot Blog. Releasing HypriotOS 1.8.0: Raspberry Pi 3 B+, Stretch and more ↩︎\nSeguridad de SSH - Parte IV Securicemos nuestra servidora web | la_bekka ↩︎\n",
    "description": "",
    "tags": [
      "nextcloudpi",
      "nextcloud",
      "raspberry pi"
    ],
    "title": "Instalación y configuración de NextcloudPi",
    "uri": "/blog/2021-01-10-nextcloudpi/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "nextcloudpi",
    "uri": "/tags/nextcloudpi/"
  },
  {
    "content": "En esta entrada se realizará un repaso de los comandos básicos del cli kubectl que se pueden aplicar a los objetos de Kubernetes. Algunos de los ejemplos de los objetos de Kubernetes son los Pods, ReplicaSets, Deployments, Namespaces, etc.\nNamespaces Se utilizan namespaces en Kubernetes para organizar los objetos del clúster. A fin de cuentas, un namespace representa una carpeta que contiene un conjunto de objetos. Por defecto, kubectl interactúa con el namespace default. Para usar otro tipo de de namespace es necesario utilizar el flag --namespace, por ejemplo --namespace=ejemplo. Si se quiere interacturar con todo el conjunto de namespaces, se utiliza el flag --all-namespace 1.\nContexts En caso de querer cambiar el namespace predreterminado de forma permanente, se puede utilizar un context. Al utilizarlo se registra en el archivo de configuración de kubectl, almacenado en HOME/.kube/config. Para crear un context con un nuevo nobre predeterminado de namespace, ejecutar 1:\nkubectl config set-context my-context --namespace=nuevonamespacepordefecto kubectl config use-context my-context Objetos de la API de Kubernetes Cada objeto de Kubernetes está representado por un recurso RESTful y existe en una ruta HTTP única a la API de Kubernetes. Los recursos se representan como archivos JSON o YAML. A través del comando kubectl, se podrá acceder a dichos objetos. Por ejemplo, mediante el comando kubectl get se puede acceder a cualquier recurso del namespace por defecto 1:\nkubectl get \u003cnombre-recurso\u003e En caso de querer un recurso más específico:\nkubectl get \u003cnombre-recurso\u003e \u003cnombre-obj\u003e En caso de querer obtener más información del objeto en formato JSON o YAML, se pueden agregar los flags -o json o -o yaml respectivamente. Esta información no es tan legible para los humanos.\nOtra opción para obtener más detalles del objeto legible para humanos es usar el comando kubectl describe:\nkubectl describe \u003cnombre-recurso\u003e \u003cnombre-obj\u003e Creación, actualización o destrucción de objetos de Kubernetes Como se ha mencionado anteriormente, los objetos o recursos de Kubernetes se representan mediante archivos JSON o YAML. Para crear, actualizar o eliminar dichos objetos se utilizan ese tipo de archivos. Por ejemplo, en caso de querer crear o actualizar un objeto almacenado en ejemplo.yaml se ejecuta:\nkubectl apply -f ejemplo.yaml En caso de desear realizar ediciones intectivas en lugar del archivo local, se puede utilizar el comando kubectl edit para descargar la versión más reciente y lanza un editor. Después de guardar el archivo se subirá el archivo y se actualizará automáticamente.\nkubectl edit \u003cnombre-recurso\u003e \u003cnombre-obj\u003e El comando kubectl apply también guardará el historial de versiones de los archivos de configuración. Se pueden acceder a estos registros mediante las opciones edit-last-applied, set-last-applied, y view-last-applied.\nkubectl apply -f myobj.yaml view-last-applied Para eliminar un objeto, simplemente se necesita ejecutar:\nkubectl delete -f ejemplo.yaml Depuración kubectl también tiene una serie de comandos para depurar sus contenedores. Para ver los registros de un contenedor en ejecución, se ejecuta:\nkubectl logs \u003cnombre-pod\u003e Si existen varios contenedores en el pod, se puede elegir el contenedor que desea inspeccionar con el flag -c.\nDe forma predeterminada, kubectl logs enumera los registros y salidas actuales. Si, en cambio, se quiere transmitir continuamente los registros a la terminal, se puede agregar el flag -f (follow) en la línea de comandos.\nTambién se puede usar el comando exec para ejecutar un comando en un contenedor en ejecución:\nkubectl exec -it \u003cpod-name\u003e -- bash Esto proporcionará una consola interactiva dentro del contenedor en ejecución para realizar una depuración más detallada.\nO’Reilly, Kubernetes: Up and Running ↩︎ ↩︎ ↩︎\n",
    "description": "",
    "tags": [
      "teoría",
      "kubernetes",
      "devops"
    ],
    "title": "Comandos básicos de Kubernetes",
    "uri": "/blog/2020-12-21_basic_commands_kubernetes/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "devops",
    "uri": "/tags/devops/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "kubernetes",
    "uri": "/tags/kubernetes/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "kubernetes",
    "uri": "/categories/kubernetes/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "minikube",
    "uri": "/tags/minikube/"
  },
  {
    "content": "En esta entrada se realizará una descripción de los objetos básicos de Kubernetes. Algunos de los ejemplos de los objetos de Kubernetes son los Pods, ReplicaSets, Deployments, Namespaces, etc.\nObjetos básicos Según la documentación de Kubernetes los objetos de Kubernetes son entidades persistentes. Kubernetes usa estas entidades para representar el estado del clúster. Cada objeto de Kubernetes está representado por un recurso RESTful y existe en una ruta HTTP única. Específicamente, los objetos pueden describir 1:\nQué aplicaciones en contenedores se están ejecutando (y en qué nodos). Los recursos disponibles para esas aplicaciones. Las políticas de comportamiento de esas aplicaciones, como políticas de reinicio, actualizaciones y tolerancia a fallas. Casi todos los objetos de Kubernetes incluyen dos campos del objeto que lo configuran: el spec o especificación del estado deseado objeto y el status o estado real o actual del objeto. En la sección spec se declara la intención o estado deseado del objeto. El plano de control es quién se encarga de intentar hacer coincidir el estado real del objeto con el estado deseado.\nPara crear un objeto es necesario que la API de Kubernetes reciba la información del mismo en formato JSON. Aunque la mayoría de las veces se envía la información mediante kubectl en un archivo .yaml que será convertido a formato JSON. Un ejemplo de archivo .yaml es el siguiente 1:\napiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 Campos requeridos Se necesitan establecer los siguientes campos obligatorios para crear un objeto 1:\napiVersion: qué versión de la API de Kubernetes se está utilizando para crear el objeto. kind: qué tipo de objeto se quiere crear. metadata: datos que sirven para identificar de forma única el objeto, incluyendo un nombre, un UID y un namespace opcional. spec: el estado deseado para el objeto. Etiquetado (labels) Las etiquetas o labels son pares clave-valor adjuntos a los objetos de Kubernetes. Se utilizan para organizar y seleccionar subconjuntos de objetos, en función de unos requisitos preestablecidos. Muchos objetos pueden tener la misma etiqueta, por lo que no proporcionan unicidad a los objetos 2.\nPor ejemplo, para agregar la etiqueta color=verde a un Pod llamado planta, se puede ejecutar lo siguiente 3:\nkubectl label pods planta color=verde El comando anterior no sobreescribirá una etiqueta existente, por lo tanto, es necesario utilizar le flag --overwrite. O en caso de querer eliminar la etiqueta color, se hará con el comando a continuación:\nkubectl label pods bar color - Selectores de etiquetas (label selectors) Los controladores utilizan selectores de etiquetas para seleccionar un subconjunto de objetos. Kubernetes admite dos tipos de selectores 4:\nSelectores basados en la igualdad Permiten el filtrado de objetos en función de claves y valores de etiqueta. La coincidencia se consigue utilizando los operadores:\nSi es igual = o == (no existe diferencia entre los operadores) Si es distinto != Selectores basados en conjuntos Permiten el filtrado objetos en función de un conjunto de valores. Podemos usar operadores in, notin para valores de etiqueta, y el operador exists para claves de etiquetas.\nTipos de Objetos Pods Un pod es la unidad de programación más pequeña de Kubernetes. Es una colección lógica de uno o más contenedores que 2:\nEstán programados en el mismo host. Comparten el mismo network namespace, por lo tanto comparten una única dirección IP asignada al Pod. Tienen acceso para montar el mismo almacenamiento externo (volúmenes). Los pods tienen naturaleza efímera y no tienene la capacidad de autorreparación. Por eso se utilizan controladores para gestionar la replicación de Pods, tolerancia a fallos, autorreparación, etc. Algunos de estos controladores son Deployments, ReplicaSets, etc.\nReplicaSets Deployments Kubernetes Documentation, Understanding Kubernetes Objects ↩︎ ↩︎ ↩︎\nKubernetes Documentation, Labels and Selectors ↩︎ ↩︎\nO’Reilly, Kubernetes: Up and Running ↩︎\nKubernetes Documentation, Label selectors ↩︎\n",
    "description": "",
    "tags": [
      "teoría",
      "kubernetes",
      "devops"
    ],
    "title": "Objetos básicos de Kubernetes",
    "uri": "/blog/2020-12-21_basic_objects_kubernetes/"
  },
  {
    "content": "Instalación en local de Kubernetes Existen varias herramientas que se pueden utilizar para desplegar Kubernetes en uno o muchos clusters. Algunos de ellos serían:\nMinikube Kind Docker Desktop MicroK8s K3S Minikube es el método más fácil y preferido para crear una configuración de Kubernetes de forma local. Se utiliza para administrar un clúster de un solo nodo aunque ya existe una funcionalidad experimental que es compatible con los clústeres de múltiples nodos.\nMinikube El proyecto minikube es una implementación local de clusters de Kubernetes para Linux, mac0S y Windows. Su objetivo es ser la mejor herramienta para desarrollar localmente aplicaciones de Kubernetes 1.\nLos primeros pasos con minikube se pueden seguir en la documentación oficial y son los siguientes 2:\nRequisitos 2 CPUs o más 2GB de memoria RAM 20GB de espacio en disco Conexión a internet Manejador de contenedores o máquinas virtuales, como: Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, o VMWare. Instalación de minikube Para Linux hay tres opciones:\nPaquete binario: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube Paquete Debian: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb sudo dpkg -i minikube_latest_amd64.deb Paquete RPM: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm sudo rpm -ivh minikube-latest.x86_64.rpm Para empezar con minikube ejecutar:\nminikube start Para parar de forma segura minikube ejecutar:\nminikube stop Instalación de kubernetes Kubernetes puede instalarse localmente en máquinas virtuales o directamente en el sistema operativo. Existen herramientas como Ansible o kubeadm para automatizar la instalación.\nCon la herramienta CLI kubectl se pueden administrar, desplegar y configurar los recursos y las aplicaciones del cluster de Minikube, por lo tanto se instala con los siguientes comandos:\nsudo apt-get update \u0026\u0026 sudo apt-get install -y apt-transport-https gnupg2 curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo \"deb https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubectl Para los dellates de los comandos de kubectl se puede buscar en el libro de kubectl, en la documentación oficial de Kubernetes o en su repositorio github.\nUn paso muy habitual después de la instalación, es configurar y habilitar la autocompletado de comandos de kubectl:\nsudo apt install -y bash-completion source /usr/share/bash-completion/bash-completion source \u003c(kubectl completion bash) echo 'source \u003c(kubectl completion bash)' \u003e\u003e~/.bashrc Otros paquetes relevantes a instalar son los siguientes:\nkubeadm: sirve para administrar o automatizar la instalación kubelet: es un agente que se ejecuta en cada nodo y se comunica con los componentes del plano de control kubernetes-cni: permite configurar los elementos de red sudo apt-get install kubelet kubeadm kubernetes-cni GitHub, minikube ↩︎\nMinikube, Cómo empezar ↩︎\n",
    "description": "",
    "tags": [
      "minikube",
      "kubernetes",
      "devops"
    ],
    "title": "Primeros pasos con Minikube",
    "uri": "/blog/2020-10-29_minikube/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "teoría",
    "uri": "/tags/teor%C3%ADa/"
  },
  {
    "content": "En esta entrada se definirán los componentes de la arquitectura de Kubernetes. Las fuentes principales de la información a continuación son el curso de Introduction to Kubernetes de The Linux Foundation en edX, cuyos autores son Chris Pokorni y Neependra Khare, y la propia documentación de Kubernetes.\nComponentes de la arquitectura en Kubernetes Un clúster de Kubernetes consta de un conjunto de máquinas trabajadoras, llamadas nodos, que ejecutan aplicaciones en contenedores. Cada clúster tiene al menos un nodo trabajador. En un nivel muy alto de abstracción, Kubernetes tiene los siguientes componentes principales:\nUno o más nodos maestros (master nodes), en la parte del plano de control (control plane). Uno o más nodos trabajadores (worker nodes). Se puede ver en la siguiente figura que es la arquitectura de los componentes de un cluster de Kubernetes 1:\nEl nodo maestro proporciona un entorno de ejecución para el plano de control responsable de administrar el estado de un clúster de Kubernetes y es el cerebro detrás de todas las operaciones dentro del clúster. Los componentes del plano de control son agentes con roles muy distintos en la gestión del clúster. Para comunicarse con el clúster de Kubernetes, los usuarios envían solicitudes al plano de control a través de una herramienta de interfaz de línea de comandos (CLI), un panel de interfaz de usuario web o una interfaz de programación de aplicaciones (API) 2.\nEs importante mantener el plano de control funcionando a toda costa. La pérdida del plano de control puede generar tiempo de inactividad, provocando la interrupción del servicio a los clientes, con una posible pérdida de negocio. Para garantizar la tolerancia a fallos del plano de control, se pueden agregar réplicas del nodo maestro al clúster, configuradas en modo de alta disponibilidad. Si bien solo uno de los nodos maestros está dedicado a administrar activamente el clúster, los componentes del plano de control permanecen sincronizados en las réplicas del nodo maestro. Este tipo de configuración agrega resistencia al plano de control del clúster, en caso de que falle el nodo maestro que está activo 2.\nPara conservar el estado del clúster de Kubernetes, todos los datos de configuración del clúster se guardan en etcd. etcd es un almacén de valores clave distribuido que solo contiene datos relacionados con el estado del clúster, sin datos de carga de trabajo del cliente. etcd se puede configurar en el nodo maestro (topología apilada) o en su host dedicado (topología externa) para ayudar a reducir las posibilidades de pérdida del almacén de datos al desacoplarlo de los otros agentes del plano de control 2.\nCon la topología de etcd apilada, las réplicas del nodo maestro de alta disponibilidad también garantizan la resistencia del almacén de datos de etcd. Sin embargo, ese no es el caso de la topología externa etcd, donde los hosts etcd deben replicarse por separado para alta disponibilidad, una configuración que introduce la necesidad de hardware adicional.\nUn nodo maestro ejecuta los siguientes componentes del plano de control 1:\nkube-apiserver o servidor API kube-scheduler o planificador kube-controller-manager o manejador de controladores etcd o almacén de datos Mientras que un nodo trabajador tiene los siguientes componentes:\nContainer Runtime o entorno de ejecución del contenedor kubelet o agente de nodo kube-proxy o proxy Addons o complementos para DNS, interfaz de usuario, monitoreo y registro a nivel de clúster Nodo maestro kube-apiserver Todas las tareas administrativas están coordinadas por kube-apiserver, un componente central del plano de control que se ejecuta en el nodo maestro. El servidor API recibe las peticiones RESTful de usuarios, operadores y agentes externos, luego las valida y las procesa. Durante el procesamiento, el servidor API lee el estado actual del clúster de Kubernetes del almacén de datos etcd y, después de la ejecución de una llamada, el estado resultante del clúster de Kubernetes se guarda en el almacén de datos distribuido de clave-valor para debida su persistencia. El servidor API es el único componente del plano de control que se comunica con el almacén de datos etcd, tanto para leer como para guardar la información del estado del clúster de Kubernetes, actuando como una interfaz intermedia para cualquier otro agente del plano de control que pregunte sobre el estado del clúster.\nEl servidor API es altamente configurable y personalizable. Puede escalar horizontalmente, pero también admite la adición de servidores API secundarios personalizados, una configuración que transforma el servidor API principal en un proxy para todos los servidores API personalizados secundarios y enruta todas las llamadas RESTful entrantes a ellos en función de reglas definidas personalizadas 2.\nkube-scheduler La función del kube-scheduler o planificador es asignar nuevos objetos de carga de trabajo, como pods, a los nodos. Durante el proceso de planificación, las decisiones se toman según el estado actual del clúster de Kubernetes y los requisitos del nuevo objeto. El planificador obtiene del almacén de datos etcd, a través del servidor API, los datos de uso de recursos para cada nodo trabajador en el clúster. El planificador también recibe del servidor API los requisitos del nuevo objeto que forman parte de sus datos de configuración. Los requisitos pueden incluir restricciones que los usuarios y operadores establezcan, como programar el trabajo en un nodo etiquetado con disk == ssd como par clave/valor. El planificador también tiene en cuenta los requisitos de calidad de servicio (QoS), la localidad de los datos, la afinidad, la antiafinidad, localización de datos dependientes, la tolerancia, la topología del clúster, etc. Una vez que todos los datos del clúster están disponibles, el algoritmo de planificación filtra los nodos con predicados para aislar los posibles nodos candidatos que luego son puntuados con prioridades para seleccionar el nodo que satisface todos los requisitos para la nueva carga de trabajo. El resultado del proceso de decisión se comunica al servidor API, que luego delega la implementación de la carga de trabajo con otros agentes del plano de control.\nEl planificador es altamente configurable y personalizable mediante políticas de planificación, complementos y perfiles. También se admiten planificadores adicionales personalizados. Un planificador es extremadamente importante y complejo en un clúster de Kubernetes de varios nodos 2.\nkube-controller-manager Componente del plano de control que ejecuta los controladores para regular el estado del clúster de Kubernetes. Los controladores son bucles de vigilancia que se ejecutan continuamente y comparan el estado deseado del clúster (proporcionado por los datos de configuración de los objetos) con su estado actual (obtenido del almacén de datos etcd a través del servidor API). En caso de una discrepancia, se toman medidas correctivas en el clúster hasta que su estado actual coincida con el estado deseado. Ejecuta controladores responsables de actuar cuando los nodos dejan de estar disponibles, para garantizar que el número de pods sean los esperados, para crear endpoints, cuentas de servicio y tokens de acceso a la API 2. Lógicamente cada controlador es un proceso independiente, pero para reducir la complejidad, todos se compilan en un único binario y se ejecuta en un mismo proceso. Estos controladores incluyen 1:\nControlador de nodos: es el responsable de detectar y responder cuándo un nodo deja de funcionar Controlador de replicación: es el responsable de mantener el número correcto de pods para cada controlador de replicación del sistema Controlador de endpoints: construye el objeto Endpoints, es decir, hace una unión entre los Services y los Pods Controladores de tokens y cuentas de servicio: crean cuentas y tokens de acceso a la API por defecto para los nuevos Namespaces. etcd Almacén de datos persistente, consistente y distribuido de clave-valor utilizado para almacenar toda a la información del clúster de Kubernetes 1. Los nuevos datos se añaden al almacén de datos, nunca se reemplazan. Los datos obsoletos se comprimen periódicamente para minimizar el tamaño del almacén de datos.\nDe todos los componentes del plano de control, solo el servidor API puede comunicarse con el almacén de datos etcd.\nLa herramienta de administración CLI de etcd, etcdctl, proporciona la opción de realizar copias de seguridad, instantáneas y restauraciones. Son especialmente útiles para un clúster de Kubernetes de única instancia de etcd, común en entornos de desarrollo y aprendizaje. Sin embargo, en los entornos Stage y Production, es extremadamente importante replicar los almacenes de datos en modo alta disponibilidad.\nAlgunas herramientas de arranque del clúster de Kubernetes, como kubeadm, aprovisionan nodos maestros etcd apilados, donde el almacén de datos se ejecuta junto con los otros componentes del plano de control en el mismo nodo maestro y los comparte con ellos 2.\nPara el aislamiento del almacén de datos de los componentes del plano de control, el proceso de arranque se puede configurar para una topología etcd externa. El almacén de datos se despliega en un host dedicado separado del plano de control, reduciendo así las posibilidades de un fallo del etcd 2.\nLas topologías de etcd apilado y externa admiten configuraciones de alta disponibilidad. etcd se basa en protocolo de consenso Raft que permite que un conjunto de máquinas pueda sobrevivir al fallo de algunas de ellas, incluido a fallos de nodo maestro. En un momento dado, uno de los nodos del grupo será el maestro y el resto serán los seguidores 2.\netcd está escrito en el lenguaje de programación Go. En Kubernetes, además de almacenar el estado del clúster, etcd también se usa para almacenar detalles de configuración como subredes, ConfigMaps, Secrets, etc.\nNodo trabajador Un nodo trabajador proporciona un entorno de ejecución para las aplicaciones cliente. Aunque son microservicios en contenedores, estas aplicaciones están encapsuladas en pods, controlados por los agentes del plano de control del clúster que se ejecutan en el nodo maestro. Los pods se programan en los nodos trabajadores, donde encuentran los recursos informáticos, de memoria y de almacenamiento necesarios para ejecutarse, y las redes para comunicarse entre sí y con el mundo exterior. Un pod es la unidad de programación más pequeña de Kubernetes. Es una colección lógica de uno o más contenedores programados juntos, y la colección se puede iniciar, detener o reprogramar como una sola unidad de trabajo.\nAdemás, en un clúster de Kubernetes de varios trabajadores, el tráfico de red entre los usuarios del cliente y las aplicaciones en contenedores implementadas en Pods lo manejan directamente los nodos trabajadores y no se enruta a través del nodo maestro 2.\nContainer Runtime Aunque Kubernetes se describe como un “motor de orquestación de contenedores”, no tiene la capacidad de manejar contenedores directamente. Para administrar el ciclo de vida de un contenedor, Kubernetes requiere un entorno de ejecución del contendor en el nodo donde se programará un Pod y sus contenedores. Kubernetes admite muchos entornos de ejecución de contenedores 2:\nDocker: aunque es una plataforma de contenedores que usa containerd como entorno de ejecución de contenedor, es más popular usado con Kubernetes CRI-O: un entorno de ejecución de contenedor ligero para Kubernetes, también admite registros de imágenes de Docker containerd: un entorno de ejecución de contenedor simple y portátil que proporciona robustez frakti: un tiempo de ejecución de contenedor basado en hipervisor para Kubernetes kubelet El kubelet es un agente que se ejecuta en cada nodo y se comunica con los componentes del plano de control desde el nodo maestro. Recibe definiciones de pod, principalmente del servidor API, e interactúa con el entorno de ejecución del contenedor en el nodo para ejecutar contenedores asociados con el pod. También supervisa el estado y los recursos de los contenedores que ejecutan pods. El agente kubelet toma un conjunto de especificaciones de Pod, llamados PodSpecs, que han sido creados por Kubernetes y garantiza que los contenedores descritos en ellos estén funcionando y en buen estado.\nEl kubelet se conecta a los entornos de ejecución del contenedor a través de un complemento basado en el Container Runtime Interface (CRI). El CRI consta de protocolos de búferes, API de gRPC, bibliotecas y especificaciones y herramientas adicionales que se encuentran actualmente en desarrollo. Para conectarse a tiempos de ejecución de contenedores intercambiables, kubelet utiliza una aplicación de compensación que proporciona una capa de abstracción clara entre kubelet y el tiempo de ejecución del contenedor.\nObtenido de blog.kubernetes.io\nComo se muestra arriba, el kubelet que actúa como cliente grpc se conecta al shim CRI, que a su vez, actúa como servidor grpc para realizar operaciones en el contenedor y la imagen. El CRI implementa dos servicios: ImageService y RuntimeService. ImageService es responsable de todas las operaciones relacionadas con la imagen, mientras que RuntimeService es responsable de todas las operaciones relacionadas con el pod y el contenedor 2.\nkube-proxy El kube-proxy es el agente de red que se ejecuta en cada nodo responsable de las actualizaciones dinámicas y el mantenimiento de todas las reglas de red en el nodo. Extrae los detalles de la red de Pods y reenvía las solicitudes de conexión a los Pods.\nEl proxy kube es responsable del reenvío de transmisiones TCP, UDP y SCTP o el reenvío por turnos a través de un conjunto de backends de pod, e implementa reglas de reenvío definidas por los usuariosa través de objetos de API de servicio 2.\nAddons Los complementos son características y funcionalidades del clúster que aún no están disponibles en Kubernetes, por lo que se implementan a través de pods y servicios de terceros 2.\nDNS: el DNS del clúster es un servidor DNS necesario para asignar registros DNS a objetos y recursos de Kubernetes\nDashboard: una interfaz de usuario basada en web de propósito general para la administración de clústeres\nMonitorización: recopila métricas de contenedores a nivel de clúster y las guarda en un almacén de datos central\nRegistro: recopila registros de contenedores a nivel de clúster y los guarda en un almacén de registros central para su análisis.\nDesafíos de red Las aplicaciones basadas en microservicios desacoplados dependen en gran medida de las redes para imitar el acoplamiento estrecho que alguna vez estuvo disponible en la era monolítica. Las redes, en general, no son las más fáciles de entender e implementar. Kubernetes no es una excepción: como orquestador de microservicios en contenedores, debe abordar algunos desafíos de redes distintos 2:\nComunicación de contenedor a contenedor dentro de los pods Comunicación de pod a pod en el mismo nodo y en todos los nodos del clúster Comunicación Pod-to-Service dentro del mismo espacio de nombres y entre espacios de nombres de clústeres Comunicación externa al servicio para que los clientes accedan a aplicaciones en un clúster. De contenedor a contenedor dentro de los pods Al hacer uso de las funciones de virtualización del kernel del sistema operativo host subyacente, un entorno de ejecución de contenedor crea un espacio de red aislado para cada contenedor que inicia. En Linux, este espacio de red aislado que se denomina network namespace. Un network namespace se puede compartir entre contenedores o con el sistema operativo del host.\nCuando se inicia un pod, el Container Runtime inicializa un contenedor de pausa especial con el único propósito de crear un espacio de nombres de red para el pod. Todos los contenedores adicionales, creados a través de solicitudes de usuarios, que se ejecutan dentro del Pod compartirán el espacio de nombres de red del contenedor Pause para que todos puedan comunicarse entre sí a través de localhost.\nDe pod a pod a través de nodos En un clúster de Kubernetes, los pods se programan en los nodos de una manera casi impredecible. Independientemente de su nodo host, se espera que los pods puedan comunicarse con todos los demás pods del clúster, todo esto sin la implementación de la traducciones de direcciones de red (NAT). Este es un requisito fundamental de cualquier implementación de redes en Kubernetes.\nEl modelo de red de Kubernetes tiene como objetivo reducir la complejidad y trata a los Pods como VM en una red, donde cada VM está equipada con una interfaz de red, por lo que cada Pod recibe una dirección IP única. Este modelo se llama “IP por pod” y garantiza la comunicación de pod a pod, al igual que las máquinas virtuales pueden comunicarse entre sí en la misma red.\nSin embargo, no nos olvidemos de los contenedores. Comparten el espacio de nombres de la red del Pod y deben coordinar la asignación de puertos dentro del Pod tal como lo harían las aplicaciones en una VM, todo mientras pueden comunicarse entre sí en localhost, dentro del Pod. Sin embargo, los contenedores se integran con el modelo de red general de Kubernetes mediante el uso de Container Network Interface (CNI) compatible con los complementos CNI. CNI es un conjunto de una especificación y bibliotecas que permiten a los complementos configurar la red para contenedores. Si bien hay algunos complementos principales, la mayoría de los complementos CNI son soluciones de redes definidas por software (SDN) de terceros que implementan el modelo de redes de Kubernetes. Además de abordar el requisito fundamental del modelo de red, algunas soluciones de red ofrecen soporte para políticas de red. Flannel, Weave, Calico son solo algunas de las soluciones SDN disponibles para los clústeres de Kubernetes.\nDe Pod al mundo exterior Una aplicación implementada con éxito en contenedores que se ejecuta en pods dentro de un clúster de Kubernetes puede requerir accesibilidad desde el mundo exterior. Kubernetes permite la accesibilidad externa a través de Servicios, encapsulaciones complejas de definiciones de reglas de enrutamiento de red almacenadas en iptables en nodos de clúster e implementadas por agentes de kube-proxy. Al exponer los servicios al mundo externo con la ayuda de kube-proxy, las aplicaciones se vuelven accesibles desde fuera del clúster a través de una dirección IP virtual.\nDocumentation Kubernetes, Kubernetes Components ↩︎ ↩︎ ↩︎ ↩︎\nedX, Introduction to kubernetes - The Linux Foundation ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎\n",
    "description": "Teoría básica para empezar con kubernetes.",
    "tags": [
      "kubernetes",
      "devops"
    ],
    "title": "Componentes de la arquitectura de Kubernetes",
    "uri": "/blog/2020-10-28_componentes_kubernetes/"
  },
  {
    "content": "En esta entrada se definirán los conceptos básicos e introductorios de Kubernetes. Las fuentes principales de la información a continuación son el curso de Introduction to Kubernetes de The Linux Foundation en edX, cuyos autores son Chris Pokorni y Neependra Khare, y la propia documentación de Kubernetes.\n¿Qué es Kubernetes y por qué se utiliza? Kubernetes o “K8s” es una plataforma portable y extensible de código libre, bajo la licencia Apache 2.0, para administrar cargas de trabajo y servicios. Sirve para la automatización del despliegue, ajuste de escala y manejo de aplicaciones en contenedores​ que fue originalmente diseñado por Google y donado a la Cloud Native Computing Foundation (parte de la Linux Foundation). Soporta diferentes entornos para la ejecución de contenedores, incluido Docker 1.\nActualmente, se tiende a una ejecución de procesos en lo que se conoce como “nube”. Aunque, por otra parte, se precede de un modelo conocido como monolítico donde se tienen principios de arquitectura software obsoletos, con grandes componentes programados en lenguajes de programación antiguos y todo el sistema desplegado requiriendo un hardware caro y costoso de manejar.\nPor lo tanto, la tendencia actual es separar y simplificar cada componente software para convertirlos en componentes distribuidos, descritos por sus respectivas características específicas. De manera que se crean microservicios que se acomplan unos con otros y fáciles de reemplazar o reubicar. La arquitectura de microservicios está alineada con los principios de la arquitectura dirigida por eventos (EDA) y de la arquitectura orientada a servicios (SOA).\nCada microservicio se desarrolla en un lenguaje de programación moderno, seleccionado para ser el más adecuado para el tipo de servicio y su función. Esto ofrece una gran flexibilidad al combinar microservicios con hardware específico cuando sea necesario, lo que permite implementaciones en hardware básico de bajo costo. Aunque la naturaleza distribuida de los microservicios agrega complejidad a la arquitectura, uno de los mayores beneficios de los microservicios es la escalabilidad. Con la aplicación general volviéndose modular, cada microservicio se puede escalar individualmente, ya sea de forma manual o automatizada a través del autoescalado basado en la demanda. Además, prácticamente no hay tiempo de inactividad ni interrupción del servicio para los clientes porque las actualizaciones se implementan sin problemas, un servicio a la vez, en lugar de tener que volver a compilar, reconstruir y reiniciar una aplicación monolítica completa 2.\nResumiendo, estos microservicios se despliegan en contenedores y kubernetes es un orquestador de contenedores. Por lo tanto, para comprender qué es kubernetes, es necesario revisar los conceptos básicos sobre contendores y orquestadores de contenedores.\n¿Qué son los contenedores? Los contenedores son espacios virtuales a nivel del sistema operativo que agrupan el código de una aplicación con las bibliotecas y los archivos de configuración asociados, junto con las dependencias necesarias para que la aplicación se ejecute. Ofrecen escalabilidad y alto rendimiento a las aplicaciones en cualquier infraestructura que se elija. Son los más adecuados para ofrecer microservicios al proporcionar entornos virtuales portátiles y aislados para que las aplicaciones se ejecuten sin interferencias de otras aplicaciones en ejecución.\nBeneficios de usar contenedores Los beneficios de usar contenedores incluyen 3:\nÁgil creación y despliegue de aplicaciones: Mayor facilidad y eficiencia al crear imágenes de contenedor en vez de máquinas virtuales. Desarrollo, integración y despliegue continuo: Permite que la imagen de contenedor se construya y despliegue de forma frecuente y confiable, facilitando los rollbacks debido a que la imagen es inmutable. Separación de tareas entre Dev y Ops: Puedes crear imágenes de contenedor al momento de compilar y no al desplegar, desacoplando la aplicación de la infraestructura. Observabilidad: No solamente se presenta la información y métricas del sistema operativo, sino la salud de la aplicación y otras señales. Consistencia entre los entornos de desarrollo, pruebas y producción: La aplicación funciona igual en un laptop y en la nube. Portabilidad entre nubes y distribuciones: Funciona en Ubuntu, RHEL, CoreOS, tu datacenter físico, Google Kubernetes Engine y todo lo demás. Administración centrada en la aplicación: Eleva el nivel de abstracción del sistema operativo y el hardware virtualizado a la aplicación que funciona en un sistema con recursos lógicos. Microservicios distribuidos, elásticos, liberados y débilmente acoplados: Las aplicaciones se separan en piezas pequeñas e independientes que pueden ser desplegadas y administradas de forma dinámica, y no como una aplicación monolítica que opera en una sola máquina de gran capacidad. Aislamiento de recursos: Hace el rendimiento de la aplicación más predecible. Utilización de recursos: Permite mayor eficiencia y densidad. ¿Qué son los orquestadores de contenedores? En entornos de desarrollo, la ejecución de contenedores en un solo host para el desarrollo y la prueba de aplicaciones puede ser una opción. Sin embargo, al migrar a entornos de control de calidad (QA) y producción (Prod), ya no es una opción viable porque las aplicaciones y los servicios deben cumplir con requisitos específicos 2:\nTolerancia a fallos. Escalabilidad bajo demanda. Uso óptimo de recursos. Descubrimiento automático para descubrir y comunicarse automáticamente entre componentes. Accesibilidad desde el mundo exterior. Actualizaciones o parches de seguridad sin interrupciones sin tiempo de inactividad. Los orquestadores de contenedores son herramientas que agrupan sistemas para formar clústeres en los que la implementación y la administración de contenedores se automatizan a escala y cumplen los requisitos mencionados anteriormente.\nExisten varias soluciones de orquestadores de contenedores y algunos de los disponibles son:\nAmazon Elastic Container Service (ECS). Azure Container Instances. Azure Service Fabric. Kubernetes. Marathon. Nomad. Docker Swarm. Aunque sea viable mantener algún contenedor manualmente, los orquestadores facilitan mucho la administración a los operadores, principalmente cuando se trata de cientos o miles de contenedores. La mayoría de los orquestadores de contenedores pueden realizar las siguientes acciones 2:\nAgrupar hosts mientras se crea un clúster. Programar contenedores para que se ejecuten en hosts del clúster según la disponibilidad de recursos. Permitir que los contenedores de un clúster se comuniquen entre sí independientemente del host en el que estén implementados en el clúster. Vincular contenedores y recursos de almacenamiento. Agrupar conjuntos de contenedores similares y vincularlos a construcciones de equilibrio de carga para simplificar el acceso a las aplicaciones en contenedores, creando un nivel de abstracción entre los contenedores y el usuario. Gestionar y optimizar el uso de recursos. Permitir la implementación de políticas para proteger el acceso a las aplicaciones que se ejecutan dentro de los contenedores. Con todas estas características, configurables pero flexibles, los orquestadores de contenedores son una buena opción cuando se trata de administrar aplicaciones en contenedores a gran escala.\nCaracterísticas de Kubernetes Kubernetes ofrece un conjunto muy amplio de funciones para la orquestación de contenedores. Sus principales características son 2:\nEmpaquetado automático de contenedores: Kubernetes programa automáticamente los contenedores en función de las necesidades y limitaciones de los recursos, para maximizar la utilización sin sacrificar la disponibilidad.\nAutocuración: Kubernetes reemplaza y reprograma automáticamente los contenedores de los nodos fallidos. Elimina y reinicia los contenedores que no responden a las comprobaciones de estado, según las reglas o políticas existentes. También evita que el tráfico se enrute a contenedores que no responden.\nEscalabilidad horizontal: Con Kubernetes, las aplicaciones se escalan de forma manual o automática según la CPU o el uso de métricas personalizadas.\nDescubrimiento de servicios y equilibrio de carga: Los contenedores reciben sus propias direcciones IP de Kubernetes, mientras que este asigna un único nombre de sistema de nombres de dominio (DNS) a un conjunto de contenedores para ayudar a equilibrar la carga de las solicitudes en todos los contenedores del conjunto.\nImplementaciones y restauraciones automatizadas: Kubernetes implementa y restaura las actualizaciones de la aplicación y los cambios de configuración sin problemas, monitoreando constantemente el estado de la aplicación para evitar cualquier tiempo de inactividad.\nGestión de secretos y configuraciones: Kubernetes administra los datos confidenciales y los detalles de la configuración de una aplicación por separado de la imagen del contenedor, para evitar una reconstrucción de la imagen respectiva. Los secretos consisten en la información sensible o confidencial que se pasa a la aplicación sin revelar el contenido sensible a la configuración del código.\nOrquestación de almacenamiento: Kubernetes monta automáticamente soluciones de almacenamiento definido por software (SDS) en contenedores de almacenamiento local, proveedores de nube externos, almacenamiento distribuido o sistemas de almacenamiento en red.\nEjecución por lotes: Kubernetes admite la ejecución por lotes, trabajos de larga ejecución y reemplaza los contenedores fallidos.\nLa arquitectura de Kubernetes es modular e interconectable. No solo organiza aplicaciones de tipo microservicios como módulos desacoplados, sino que también su arquitectura sigue patrones de microservicios desacoplados. Las funcionalidades de Kubernetes se puede ampliar escribiendo recursos personalizados, operadores, API personalizadas, reglas de programación o extensiones.\nWikipedia, Kubernetes ↩︎\nedX, Introduction to kubernetes - The Linux Foundation. ↩︎ ↩︎ ↩︎ ↩︎\nDocumentación Kubernetes, ¿Qué es Kubernetes? ↩︎\n",
    "description": "Teoría básica para empezar con kubernetes.",
    "tags": [
      "kubernetes",
      "devops"
    ],
    "title": "Introducción a Kubernetes",
    "uri": "/blog/2020-10-27_introduccion_a_kubernetes/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "angular",
    "uri": "/tags/angular/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "multilenguaje",
    "uri": "/tags/multilenguaje/"
  },
  {
    "content": "En esta entrada se explicarán los pasos a seguir para añadir la funcionalidad de multilenguaje con i18n en un proyector de Angular 10/9/8. Para este tutorial es necesario tener un proyecto que esté creado previamente.\nAñadir ngx-translate en Angular 10/9/8 Se instalan los paquetes de ngx-translate con:\nnpm i @ngx-translate/core @ngx-translate/http-loader --save @ngx-translate/core incluye los servicios esenciales, la canalización y las directivas para convertir el contenido en varios idiomas.\n@ngx-translate/http-loader ayuda a obtener los archivos de traducción de un servidor web.\nSe añaden los módulos en el archivo app.module.ts:\nimport { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; ... @NgModule({ ... imports: [ ... TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: httpTranslateLoader, deps: [HttpClient] } }) ], ... }) export function httpTranslateLoader(http: HttpClient) { return new TranslateHttpLoader(http); } Configuración de los archivos traducidos Se abre la carpeta assets y se crea el directorio i18n. Dentro de ella se añadirán tantos ficheros \u003ccodigo_idioma_país\u003e.json como idiomas distintos se quieran traducir. Por ejemplo el fichero src/assets/es.json contendrá lo siguiente:\n{ \"HOME\":\"Inicio\", \"ABOUT\": \"Acerca de\", \"SING_IN\":\"Iniciar sesión\", \"LOG_OUT\": \"Cerrar sesión\" } Otro ejemplo puede ser el fichero en inglés src/assets/en.json:\n{ \"HOME\":\"Home\", \"ABOUT\": \"About\", \"SING_IN\":\"Sing in\", \"LOG_OUT\": \"Log out\" } Implementar las traducciones con TranslateService Importamos el servicio TranslateService en app.component.ts:\nimport { TranslateService } from '@ngx-translate/core'; Inyectamos el servicio TranslateService en el constructor para tener acceso al servicio:\nexport class AppComponent { constructor( public translate: TranslateService ) { translate.addLangs(['en', 'en']); translate.setDefaultLang('es'); } } Función elegir el idioma Mediante la función switchLang se elegirá el idioma que queramos. Para ello es necesario añadirla en el archivo TypeScript del componente donde queramos que aparezca:\nswitchLang(lang: string) { this.translate.use(lang); } Añadimos un desplegable para que se pueda elegir el idioma:\n\u003cspan class=\"form-inline\"\u003e \u003cselect class=\"form-control\" #selectedLang (change)=\"switchLang(selectedLang.value)\"\u003e \u003coption *ngFor=\"let language of translate.getLangs()\" [value]=\"language\" [selected]=\"language === translate.currentLang\"\u003e {{ language }} \u003c/option\u003e \u003c/select\u003e \u003c/span\u003e Configuración de las traducciones con TranslatePipe Por último, una vez definida la constante en los archivos de idiomas (src/ssets/\u003ccodigo_idioma_país\u003e.json), mediante la función pipe {{'HOME' | translate }} se traducirá la constante HOME al idioma elegido. Por ejemplo:\n\u003cnav class=\"navbar navbar-dark bg-primary\"\u003e \u003cdiv class=\"container\"\u003e \u003ca class=\"navbar-item\"\u003e {{'HOME' | translate }} \u003c/a\u003e \u003ca class=\"navbar-item\"\u003e {{'ABOUT' | translate }} \u003c/a\u003e \u003cspan class=\"form-inline\"\u003e \u003cselect class=\"form-control\" #selectedLang (change)=\"switchLang(selectedLang.value)\"\u003e \u003coption *ngFor=\"let language of translate.getLangs()\" [value]=\"language\" [selected]=\"language === translate.currentLang\"\u003e {{ language }} \u003c/option\u003e \u003c/select\u003e \u003c/span\u003e \u003c/div\u003e \u003c/nav\u003e Conclusión Finalmente, se ha implementado el multilenguage de la apliación Angular usando ngx-translate. Se ha analizado cómo configurar un entorno para traducir una aplicación Angular, cómo acceder a los métodos del servicio de traducción y cómo usar TranslatePipe.\nEnlaces consultados PositronX.io - Create Angular 10/9/8 MultiLingual Site with ngx-translate i18n Library\n",
    "description": "Tutorial de cómo añadir la funcionalidad de multilenguaje con i18n en un proyector de Angular",
    "tags": [
      "angular",
      "multilenguaje",
      "programación",
      "typescript"
    ],
    "title": "Multilenguaje en Angular 10/9/8 con la librería ngx-translate (i18n)",
    "uri": "/blog/2020-10-20_multilenguaje_angular/"
  },
  {
    "content": "En esta entrada se explicarán los pasos a seguir para añadir la funcionalidad de multilenguaje con i18n en un proyector de Angular 10/9/8. Para este tutorial es necesario tener un proyecto que esté creado previamente.\nAñadir ngx-translate en Angular 10/9/8 Se instalan los paquetes de ngx-translate con:\nnpm i @ngx-translate/core @ngx-translate/http-loader --save @ngx-translate/core incluye los servicios esenciales, la canalización y las directivas para convertir el contenido en varios idiomas.\n@ngx-translate/http-loader ayuda a obtener los archivos de traducción de un servidor web.\nSe añaden los módulos en el archivo app.module.ts:\nimport { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; ... @NgModule({ ... imports: [ ... TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: httpTranslateLoader, deps: [HttpClient] } }) ], ... }) export function httpTranslateLoader(http: HttpClient) { return new TranslateHttpLoader(http); } Configuración de los archivos traducidos Se abre la carpeta assets y se crea el directorio i18n. Dentro de ella se añadirán tantos ficheros \u003ccodigo_idioma_país\u003e.json como idiomas distintos se quieran traducir. Por ejemplo el fichero src/assets/es.json contendrá lo siguiente:\n{ \"HOME\":\"Inicio\", \"ABOUT\": \"Acerca de\", \"SING_IN\":\"Iniciar sesión\", \"LOG_OUT\": \"Cerrar sesión\" } Otro ejemplo puede ser el fichero en inglés src/assets/en.json:\n{ \"HOME\":\"Home\", \"ABOUT\": \"About\", \"SING_IN\":\"Sing in\", \"LOG_OUT\": \"Log out\" } Implementar las traducciones con TranslateService Importamos el servicio TranslateService en app.component.ts:\nimport { TranslateService } from '@ngx-translate/core'; Inyectamos el servicio TranslateService en el constructor para tener acceso al servicio:\nexport class AppComponent { constructor( public translate: TranslateService ) { translate.addLangs(['en', 'en']); translate.setDefaultLang('es'); } } Función elegir el idioma Mediante la función switchLang se elegirá el idioma que queramos. Para ello es necesario añadirla en el archivo TypeScript del componente donde queramos que aparezca:\nswitchLang(lang: string) { this.translate.use(lang); } Añadimos un desplegable para que se pueda elegir el idioma:\n\u003cspan class=\"form-inline\"\u003e \u003cselect class=\"form-control\" #selectedLang (change)=\"switchLang(selectedLang.value)\"\u003e \u003coption *ngFor=\"let language of translate.getLangs()\" [value]=\"language\" [selected]=\"language === translate.currentLang\"\u003e {{ language }} \u003c/option\u003e \u003c/select\u003e \u003c/span\u003e Configuración de las traducciones con TranslatePipe Por último, una vez definida la constante en los archivos de idiomas (src/ssets/\u003ccodigo_idioma_país\u003e.json), mediante la función pipe {{'HOME' | translate }} se traducirá la constante HOME al idioma elegido. Por ejemplo:\n\u003cnav class=\"navbar navbar-dark bg-primary\"\u003e \u003cdiv class=\"container\"\u003e \u003ca class=\"navbar-item\"\u003e {{'HOME' | translate }} \u003c/a\u003e \u003ca class=\"navbar-item\"\u003e {{'ABOUT' | translate }} \u003c/a\u003e \u003cspan class=\"form-inline\"\u003e \u003cselect class=\"form-control\" #selectedLang (change)=\"switchLang(selectedLang.value)\"\u003e \u003coption *ngFor=\"let language of translate.getLangs()\" [value]=\"language\" [selected]=\"language === translate.currentLang\"\u003e {{ language }} \u003c/option\u003e \u003c/select\u003e \u003c/span\u003e \u003c/div\u003e \u003c/nav\u003e Conclusión Finalmente, se ha implementado el multilenguage de la apliación Angular usando ngx-translate. Se ha analizado cómo configurar un entorno para traducir una aplicación Angular, cómo acceder a los métodos del servicio de traducción y cómo usar TranslatePipe.\nEnlaces consultados PositronX.io - Create Angular 10/9/8 MultiLingual Site with ngx-translate i18n Library\n",
    "description": "Tutorial de cómo añadir la funcionalidad de multilenguaje con i18n en un proyector de Angular",
    "tags": [
      "angular",
      "multilenguaje",
      "programación",
      "typescript"
    ],
    "title": "Multilenguaje en Angular 10/9/8 con la librería ngx-translate (i18n)",
    "uri": "/development/angular/multilenguaje/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "programación",
    "uri": "/categories/programaci%C3%B3n/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "typescript",
    "uri": "/tags/typescript/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "buenas prácticas",
    "uri": "/categories/buenas-pr%C3%A1cticas/"
  },
  {
    "content": "Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente. Su propósito es llevar registro de los cambios en los archivos y coordinar el trabajo que varias personas realizan sobre archivos compartido 1.\nPara empezar con Git es necesario tener claro que un proyecto se suele guardar en dos lugares: en un repositorio local y uno remoto. El local es la versión que se encuentra en el ordenador donde se realizan los cambios propios y en el remoto es la versión que se guarda en el servicio web de control de versiones que elijas. Lo habitual que se recomienda son los servicios web como GitLab o Gitea(en caso de querer autoalojarlo), mientras que el antiguo GitHub ha quedado renegado desde su compra por parte de Microsoft.\nConfigurar git Configuración global de git con un nombre de usuario o un correo electrónico:\ngit config --global user.name \"Nombre de Ejemplo\" git config --global user.email nombre@ejemplo.com Clonar un repositorio Si es un repositorio local:\ngit clone /ruta/del/repositorio En caso de querer utilizar un proyecto en un repositorio remoto:\ngit clone https://\u003cURL_repositorio_remoto\u003e Iniciar un repositorio Estando en el directorio en el que queremos iniciar el repositorio introducimos en el siguiente comando:\ngit init Crear un commit Primero se agregan los archivos modificados al index y se confirma el commit con un mensaje explicativo:\ngit add . git commit -m \"Mensaje explicativo de que se ha hecho\" Ver la lista de archivos que han cambiado o están en el index git status Crear una rama o cambiar a otra ya creada Si quieres crear una rama:\ngit checkout -b \u003cnombre_rama\u003e Para cambiar a una rama ya creada:\ngit checkout \u003cnombre_rama\u003e Conectar un repositorio remoto Primero, si quieres ver los repositorios ya conectados:\ngit remote -v Para añadir un nuevo repositorio remoto ya existente:\ngit remote add origin https://\u003cURL_repositorio_remoto\u003e Enviar los cambios desde una rama local al repositorio remoto git push origin \u003cnombre_rama\u003e Buscar los cambios realizados desde el repositorio remoto que no están en el repositorio local git fetch \u003corigin\u003e Fusionar o unir los cambios realizados en la rama “nombre_rama” con la rama actual git merge \u003cnombre_rama\u003e Fusionar los cambios realizados en el repositorio local con e remoto (unifica los comandos fetch y merge en un único comando) git pull Visualizar los conflictos presentes Si se quieren todos los conflictos:\ngit diff Si se quiere entre dos ramas:\ngit diff \u003crama_origen\u003e \u003crama_objetivo\u003e Visualizar todas las ramas del repositorio local y remoto git branch -a -v Borrar una rama git branch -d \u003cnombre_rama\u003e Borrar archivos del index y del directorio que está trabajando git rm \u003cnombre_archivo\u003e Visualizar la historia de commits de la rama donde te encuentre git log --graph Visualizar la historia de commits de todo (repositorio local y remoto) git log --graph --all Inspeccionar un repositorio Si se quiere inspccionar un repositorio local:\ngit show Si se trata de un repositorio remoto:\ngit remote show origin Wikipedia, Git ↩︎\n",
    "description": "Comandos básicos de Git",
    "tags": [
      "programación",
      "git"
    ],
    "title": "Comandos básicos de Git",
    "uri": "/development/git/git/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "git",
    "uri": "/tags/git/"
  },
  {
    "content": "Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente. Su propósito es llevar registro de los cambios en los archivos y coordinar el trabajo que varias personas realizan sobre archivos compartido 1.\nPara empezar con Git es necesario tener claro que un proyecto se suele guardar en dos lugares: en un repositorio local y uno remoto. El local es la versión que se encuentra en el ordenador donde se realizan los cambios propios y en el remoto es la versión que se guarda en el servicio web de control de versiones que elijas. Lo habitual que se recomienda son los servicios web como GitLab o Gitea(en caso de querer autoalojarlo), mientras que el antiguo GitHub ha quedado renegado desde su compra por parte de Microsoft.\nConfigurar git Configuración global de git con un nombre de usuario o un correo electrónico:\ngit config --global user.name \"Nombre de Ejemplo\" git config --global user.email nombre@ejemplo.com Clonar un repositorio Si es un repositorio local:\ngit clone /ruta/del/repositorio En caso de querer utilizar un proyecto en un repositorio remoto:\ngit clone https://\u003cURL_repositorio_remoto\u003e Iniciar un repositorio Estando en el directorio en el que queremos iniciar el repositorio introducimos en el siguiente comando:\ngit init Crear un commit Primero se agregan los archivos modificados al index y se confirma el commit con un mensaje explicativo:\ngit add . git commit -m \"Mensaje explicativo de que se ha hecho\" Ver la lista de archivos que han cambiado o están en el index git status Crear una rama o cambiar a otra ya creada Si quieres crear una rama:\ngit checkout -b \u003cnombre_rama\u003e Para cambiar a una rama ya creada:\ngit checkout \u003cnombre_rama\u003e Conectar un repositorio remoto Primero, si quieres ver los repositorios ya conectados:\ngit remote -v Para añadir un nuevo repositorio remoto ya existente:\ngit remote add origin https://\u003cURL_repositorio_remoto\u003e Enviar los cambios desde una rama local al repositorio remoto git push origin \u003cnombre_rama\u003e Buscar los cambios realizados desde el repositorio remoto que no están en el repositorio local git fetch \u003corigin\u003e Fusionar o unir los cambios realizados en la rama “nombre_rama” con la rama actual git merge \u003cnombre_rama\u003e Fusionar los cambios realizados en el repositorio local con e remoto (unifica los comandos fetch y merge en un único comando) git pull Visualizar los conflictos presentes Si se quieren todos los conflictos:\ngit diff Si se quiere entre dos ramas:\ngit diff \u003crama_origen\u003e \u003crama_objetivo\u003e Visualizar todas las ramas del repositorio local y remoto git branch -a -v Borrar una rama git branch -d \u003cnombre_rama\u003e Borrar archivos del index y del directorio que está trabajando git rm \u003cnombre_archivo\u003e Visualizar la historia de commits de la rama donde te encuentre git log --graph Visualizar la historia de commits de todo (repositorio local y remoto) git log --graph --all Inspeccionar un repositorio Si se quiere inspccionar un repositorio local:\ngit show Si se trata de un repositorio remoto:\ngit remote show origin Wikipedia, Git ↩︎\n",
    "description": "Comandos básicos de Git",
    "tags": [
      "programación",
      "git"
    ],
    "title": "Git",
    "uri": "/blog/2020-10-12_git/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "gitflow",
    "uri": "/tags/gitflow/"
  },
  {
    "content": "En esta entrada se definirá el flujo de trabajo aplicado a un repositorio git conocido comunmente como Gitflow. Para entender dicho flujo de trabajo es necesario entender previamente qué es y para qué sirve git. Después de tener una base fijada, es habitual que vaya sobre ruedas.\n¿Qué es git? Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente. Su propósito es llevar registro de los cambios en los archivos y coordinar el trabajo que varias personas realizan sobre archivos compartido 1.\nSi quieres aprender más sobre los comandos más usados de git, visita esta entrada.\nIntroducción a Gitflow Gitflow es un flujo de trabajo para ayudar el desarrollo continuo de software y la implementación de prácticas DevOps. Fue publicado por primera vez por Vincent Driessen en nvie en el 2010.\n¿Cómo funciona? Permite la paralelización del desarrollo asignando roles específicos a las diferentes ramas para preparar, mantener y publicar versiones del proyecto y para la reparación de errores sin que cunda el pánico.\nProgramas GUI de git Buscando programas con una interfaz gráfica para gestionar git de manera sencilla y sean de código abierto o de software libre, se encuentran los siguientes:\ngitg GitAhead git-cola Git Extensions Wikipedia, Git ↩︎\n",
    "description": "Gitflow",
    "tags": [
      "programación",
      "git",
      "gitflow"
    ],
    "title": "Gitflow",
    "uri": "/blog/2020-11-10_gitflow/"
  },
  {
    "content": "En esta entrada se definirá el flujo de trabajo aplicado a un repositorio git conocido comunmente como Gitflow. Para entender dicho flujo de trabajo es necesario entender previamente qué es y para qué sirve git. Después de tener una base fijada, es habitual que vaya sobre ruedas.\n¿Qué es git? Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente. Su propósito es llevar registro de los cambios en los archivos y coordinar el trabajo que varias personas realizan sobre archivos compartido 1.\nSi quieres aprender más sobre los comandos más usados de git, visita esta entrada.\nIntroducción a Gitflow Gitflow es un flujo de trabajo para ayudar el desarrollo continuo de software y la implementación de prácticas DevOps. Fue publicado por primera vez por Vincent Driessen en nvie en el 2010.\n¿Cómo funciona? Permite la paralelización del desarrollo asignando roles específicos a las diferentes ramas para preparar, mantener y publicar versiones del proyecto y para la reparación de errores sin que cunda el pánico.\nProgramas GUI de git Buscando programas con una interfaz gráfica para gestionar git de manera sencilla y sean de código abierto o de software libre, se encuentran los siguientes:\ngitg GitAhead git-cola Git Extensions Wikipedia, Git ↩︎\n",
    "description": "Gitflow",
    "tags": [
      "programación",
      "git",
      "gitflow"
    ],
    "title": "Gitflow",
    "uri": "/development/git/gitflow/"
  },
  {
    "content": "En esta publicación se detallará una comparación con las ventajas y desventajas de SQL y NoSQL. Para la elección de una base de datos que se ajuste a las necesidades de cada proyecto, es necesario conocer las diferencias entre los distintos modelos.\nSQL SQL (Structured Query Language) o lenguaje de consulta estructurada se utiliza en programación para administrar y recuperar información de sistemas de gestión de bases de datos relacionales. Se caracteriza por su manejo del álgebra y el cálculo relacional para efectuar consultas con el fin de operar con la información de bases de datos. 1\nSe pueden garantizar las características ACID (Atomicidad, Consistencia, Aislamiento y Durabilidad): 2\nAtomicidad: Si cuando una operación consiste en una serie de pasos, de los que o bien se ejecutan todos o ninguno, es decir, las transacciones son completas. Consistencia: (Integridad). Es la propiedad que asegura que sólo se empieza aquello que se puede acabar. Por lo tanto se ejecutan aquellas operaciones que no van a romper las reglas y directrices de Integridad de la base de datos. La propiedad de consistencia sostiene que cualquier transacción llevará a la base de datos desde un estado válido a otro también válido. “La Integridad de la Base de Datos nos permite asegurar que los datos son exactos y consistentes, es decir que estén siempre intactos, sean siempre los esperados y que de ninguna manera cambian ni se deformen. De esta manera podemos garantizar que la información que se presenta al usuario será siempre la misma.” Aislamiento: Esta propiedad asegura que una operación no puede afectar a otras. Esto asegura que la realización de dos transacciones sobre la misma información sean independientes y no generen ningún tipo de error. Esta propiedad define cómo y cuándo los cambios producidos por una operación se hacen visibles para las demás operaciones concurrentes. El aislamiento puede alcanzarse en distintos niveles, siendo el parámetro esencial a la hora de seleccionar SGBDs. Durabilidad: (Persistencia). Esta propiedad asegura que una vez realizada la operación, esta persistirá y no se podrá deshacer aunque falle el sistema y que de esta forma los datos sobrevivan de alguna manera. Por lo tanto, un resumen sobre las ventajas y desventajas podría ser el siguiente:\nVentajas Mayor eficiencia para extraer información relacionada. Estructuración y jerarquía de datos. Respeto de la integridad de los datos. Operaciones atómicas con cambios que afecta a múltiples entidades de la base de datos al mismo tiempo. Desventajas Escalabilidad vertical, se incrementa en hardware potente y caro. Necesidad de mayor procesamiento. No es flexible, añadir nuevos datos puede resultar la modificación de esquema o relleno de datos. Herramientas más asentadas y mayor documentación. NoSQL Los sistemas NoSQL se denominan a veces “no solo SQL” para subrayar el hecho de que también pueden soportar lenguajes de consulta de tipo SQL. Los datos almacenados no requieren estructuras fijas como tablas, normalmente no soportan operaciones JOIN, ni garantizan completamente ACID (atomicidad, consistencia, aislamiento y durabilidad) y habitualmente escalan bien horizontalmente. Las bases de datos NoSQL están altamente optimizadas para las operaciones recuperar y agregar, y normalmente no ofrecen mucho más que la funcionalidad de almacenar los registros (p.ej. almacenamiento clave-valor). La pérdida de flexibilidad en tiempo de ejecución, comparado con los sistemas SQL clásicos, se ve compensada por ganancias significativas en escalabilidad y rendimiento cuando se trata con ciertos modelos de datos.\n3\nPor último, un resumen con las ventajas y desventajas podría ser el siguiente:\nVentajas Flexibilidad al añadir nuevos datos. Carácter descentralizado, soporta estructuras distribuidas. Escalabilidad horizontal, se crece en número de máquinas en vez de hardware más potente. Ejecución en máquinas con pocos recursos. Desventajas No se permiten consultas complejas. Posibilidad de inconsistencia en los datos. Conclusiones Las bases de datos SQL y NoSQL tienen características distintas y conviene estudiar cual se adapta mejor a las necesidades de cada proyecto. Se recomienda evaluar las diferentes ventajas y desventajas de cada sistema de gestión de base de datos.\nWikipedia, SQL ↩︎\nWikipedia, ACID ↩︎\nWikipedia, NoSQL ↩︎\n",
    "description": "Descripción y comparación de los modelos relacionales y no relacionales de las bases de datos.",
    "tags": [
      "programación",
      "sql",
      "nosql",
      "bases de datos"
    ],
    "title": "Base de datos SQL o NoSQL",
    "uri": "/blog/2020-10-08_sql_o_nosql/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "bases de datos",
    "uri": "/tags/bases-de-datos/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "nosql",
    "uri": "/tags/nosql/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "sql",
    "uri": "/tags/sql/"
  },
  {
    "content": "Se llevará a cabo en un servidor LAMP (Linux, Apache, MySQL/MariaDB, PHP). La distribución GNU/Linux puede ser cualquiera Ubuntu, Trisquel, Manjaro, etc. Se ha realizado la configuración con Nextcloud 19.0.0\nConfiguración del cortafuegos Utilizando el cortafuegos sencillo ufw, permitiremos el tráfico SSH (puerto 22) y web (puerto 80):\nsudo apt install ufw sudo ufw allow 22 sudo ufw allow 80 Instalación de de Apache Instalación del servidor Apache:\nsudo apt install apache2 Instalación de php Instalación de php para poder servir el contenido dinámico:\nSi se está utilizando una distribución basada en debian, es necesario añadir un repositorio para acceder a la versión 7.3. Por defecto, se encuentra disponible la versión 7. sudo add-apt-repository ppa:ondrej/php sudo apt update Instalación de la versión 7.3 y de los módulos requeridos: sudo apt install php7.3 sudo apt install php7.3-ctype php7.3-curl php7.3-dom php7.3-gd php7.3-iconv php7.3-mbstring php7.3-posix php7.3-xmlreader php7.3-zip php7.3-bz2 php7.3-exif php7.3-intl Instalación del módulo para poder conectarse a la base de datos: sudo apt install php7.3-mysql Instalación de la base de datos sudo apt install mariadb-server Ejecución de un archivo de seguridad de MySql Este script se utiliza para utilizar el servidor MariaDB en producción:\nsudo mysql_secure_installation Como es la primera vez que se ejecuta, introducir un intro y configurar una nueva contraseña de root. Además, confirmar con Y las siguientes opciones:\nEliminar usuario anónimo Deshabilitar conectarse como root remotamente Eliminar base de datos de prueba Recargar tabla de priviligios Configuración de base de datos Entrar en el monitor de MariaDB:\nsudo mysql Creación de una nueva base de datos llamada nextcloud_db (aunque se puede nombrar de otra manera). Creación de un usuario llamado nc_admin@localhost con una contraseña segura (cambiar password por una de verdad). Para evitar errores se utiliza la regla GRANT ALL ON, se actualizan los privilegios, y se sale de la base de datos:\nCREATE DATABASE nextcloud_db; CREATE USER 'nc_admin'@'localhost' IDENTIFIED BY 'password' GRANT ALL ON nextcloud_db.* TO 'nc_admin'@'localhost'; flush privileges; exit; Descarga de Nextcloud Se descarga el archivo y se descomprime en la carpeta /var/www/:\nwget https://download.nextcloud.com/server/releases/nextcloud-19.0.0.zip unzip /home/ubuntu/nextcloud-19.0.0.zip -d /var/www/ Configuración de apache Se crea un archivo de configuración:\nsudo nano /etc/apache2/sites-available/nextcloud.conf Se copia y se pega en su interior la configuración de apache (sacada de la documentación oficial):\nAlias /nextcloud \"/var/www/nextcloud/\" \u003cDirectory /var/www/nextcloud/\u003e Require all granted AllowOverride All Options FollowSymLinks MultiViews \u003cIfModule mod_dav.c\u003e Dav off \u003c/IfModule\u003e \u003c/Directory\u003e Se activa la nueva configuración:\nsudo a2ensite nextcloud.conf systemctl reload apache2 Accediendo a http://IP_MÁQUINA/nextcloud se podrá visibilizar un error interno del servidor, esto se debe a la falta de permisos del usuario web en la carpeta nextcloud.\nSe añaden los siguientes permisos:\nEl usuario por defecto www-data es cualquier usuario que se conecte a través de la web. sudo chown -R www-data:www-data /var/www/nextcloud/ sudo chmod -R 755 /var/www/nextcloud/ Volvemos a acceder a http://IP_MÁQUINA/nextcloud y rellenamos lo siguiente:\nUnas credenciales para el usuario administrador Añadir el nombre del usuario de la base de datos: nc_admin Su respectiva contraseña definida anteriormente Nombre de la base de datos: nextcloud_db Terminamos la instalación.\nConfiguración adicional recomendable Cambiar el límite de memoria (memory_limit) php a 512M en el archivo siguiente: sudo nano /etc/php/7.3/apache2/php.ini systemctl reload apache2 Descargar módulos php recomendados: sudo apt install php7.3-imagick php7.3-bcmath php7.3-gmp Recargar el servicio apache2 para hacer efectivos los cambios:\nsystemctl reload apache2 Enlaces útiles Taller básico de NextCloud con Apache - Rafael Mateus (LibreLabUCM)\nComandos utilizados\nDocumentación oficial de Nextcloud\n",
    "description": "Configuración básica de tu propio servidor Nextcloud para comenzar a cacharrear.",
    "tags": [
      "herramientas",
      "nextcloud",
      "software libre",
      "soberanía tecnológica"
    ],
    "title": "Configuración de tu propio servidor Nextcloud",
    "uri": "/blog/2020-10-03_configuracion_basica_nextcloud/"
  },
  {
    "content": "Se llevará a cabo en un servidor LAMP (Linux, Apache, MySQL/MariaDB, PHP). La distribución GNU/Linux puede ser cualquiera Ubuntu, Trisquel, Manjaro, etc. Se ha realizado la configuración con Nextcloud 19.0.0\nConfiguración del cortafuegos Utilizando el cortafuegos sencillo ufw, permitiremos el tráfico SSH (puerto 22) y web (puerto 80):\nsudo apt install ufw sudo ufw allow 22 sudo ufw allow 80 Instalación de de Apache Instalación del servidor Apache:\nsudo apt install apache2 Instalación de php Instalación de php para poder servir el contenido dinámico:\nSi se está utilizando una distribución basada en debian, es necesario añadir un repositorio para acceder a la versión 7.3. Por defecto, se encuentra disponible la versión 7. sudo add-apt-repository ppa:ondrej/php sudo apt update Instalación de la versión 7.3 y de los módulos requeridos: sudo apt install php7.3 sudo apt install php7.3-ctype php7.3-curl php7.3-dom php7.3-gd php7.3-iconv php7.3-mbstring php7.3-posix php7.3-xmlreader php7.3-zip php7.3-bz2 php7.3-exif php7.3-intl Instalación del módulo para poder conectarse a la base de datos: sudo apt install php7.3-mysql Instalación de la base de datos sudo apt install mariadb-server Ejecución de un archivo de seguridad de MySql Este script se utiliza para utilizar el servidor MariaDB en producción:\nsudo mysql_secure_installation Como es la primera vez que se ejecuta, introducir un intro y configurar una nueva contraseña de root. Además, confirmar con Y las siguientes opciones:\nEliminar usuario anónimo Deshabilitar conectarse como root remotamente Eliminar base de datos de prueba Recargar tabla de priviligios Configuración de base de datos Entrar en el monitor de MariaDB:\nsudo mysql Creación de una nueva base de datos llamada nextcloud_db (aunque se puede nombrar de otra manera). Creación de un usuario llamado nc_admin@localhost con una contraseña segura (cambiar password por una de verdad). Para evitar errores se utiliza la regla GRANT ALL ON, se actualizan los privilegios, y se sale de la base de datos:\nCREATE DATABASE nextcloud_db; CREATE USER 'nc_admin'@'localhost' IDENTIFIED BY 'password' GRANT ALL ON nextcloud_db.* TO 'nc_admin'@'localhost'; flush privileges; exit; Descarga de Nextcloud Se descarga el archivo y se descomprime en la carpeta /var/www/:\nwget https://download.nextcloud.com/server/releases/nextcloud-19.0.0.zip unzip /home/ubuntu/nextcloud-19.0.0.zip -d /var/www/ Configuración de apache Se crea un archivo de configuración:\nsudo nano /etc/apache2/sites-available/nextcloud.conf Se copia y se pega en su interior la configuración de apache (sacada de la documentación oficial):\nAlias /nextcloud \"/var/www/nextcloud/\" \u003cDirectory /var/www/nextcloud/\u003e Require all granted AllowOverride All Options FollowSymLinks MultiViews \u003cIfModule mod_dav.c\u003e Dav off \u003c/IfModule\u003e \u003c/Directory\u003e Se activa la nueva configuración:\nsudo a2ensite nextcloud.conf systemctl reload apache2 Accediendo a http://IP_MÁQUINA/nextcloud se podrá visibilizar un error interno del servidor, esto se debe a la falta de permisos del usuario web en la carpeta nextcloud.\nSe añaden los siguientes permisos:\nEl usuario por defecto www-data es cualquier usuario que se conecte a través de la web. sudo chown -R www-data:www-data /var/www/nextcloud/ sudo chmod -R 755 /var/www/nextcloud/ Volvemos a acceder a http://IP_MÁQUINA/nextcloud y rellenamos lo siguiente:\nUnas credenciales para el usuario administrador Añadir el nombre del usuario de la base de datos: nc_admin Su respectiva contraseña definida anteriormente Nombre de la base de datos: nextcloud_db Terminamos la instalación.\nConfiguración adicional recomendable Cambiar el límite de memoria (memory_limit) php a 512M en el archivo siguiente: sudo nano /etc/php/7.3/apache2/php.ini systemctl reload apache2 Descargar módulos php recomendados: sudo apt install php7.3-imagick php7.3-bcmath php7.3-gmp Recargar el servicio apache2 para hacer efectivos los cambios:\nsystemctl reload apache2 Enlaces útiles Taller básico de NextCloud con Apache - Rafael Mateus (LibreLabUCM)\nComandos utilizados\nDocumentación oficial de Nextcloud\n",
    "description": "Configuración básica de tu propio servidor Nextcloud para comenzar a cacharrear.",
    "tags": [
      "herramientas",
      "nextcloud",
      "software libre",
      "soberanía tecnológica"
    ],
    "title": "Configuración de tu propio servidor Nextcloud",
    "uri": "/technological_sovereignty/sefl-hosted/nextcloud/configuracion-basica-nextcloud/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "soberanía tecnológica",
    "uri": "/tags/soberan%C3%ADa-tecnol%C3%B3gica/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "software libre",
    "uri": "/tags/software-libre/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "análisis de red",
    "uri": "/tags/an%C3%A1lisis-de-red/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "colección",
    "uri": "/tags/colecci%C3%B3n/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "colección",
    "uri": "/categories/colecci%C3%B3n/"
  },
  {
    "content": "En esta página están almacenadas herramientas de privacidad, hacking, administración de sistemas, análisis de red y programación segura. La intención es ir actualizando las herramientas y especificar un breve resumen de qué se encuentra en cada enlace.\nPrivacidad o software libre Prism break Switching.software Desgooglicemos internet Extensiones para el navegador uBlock Privacy redirect Anonimato Guía de anonimato en internet Correos temporales: Tempail Recibidores de SMS: sms24, oksms ó fake-sms Hacking Awesome hacking Awesome Hacking Resources Administración de sistemas Snowflake SSH Client es una navaja suiza para los administradores de sistemas Análisis de red Subdominios Comparativa de herramientas de enumeración de subdominios:\nAmass: más lenta pero encuentra más subdominios válidos Findomain: más rápida con buen número de subdominios encontrados Subfinder Sublist3r DNSRecon dnssearch Knock SubBrute Programación segura Revisión de código De pago: Check Marx VeraCode Fortify AppScan-IBM Kiuwan Revisión de dependencias: Dependency check Kiuwan Sonatype SourceClear BlackDuck Snyk Secretos hardcodeados (contraseñas en el código) Gitleaks Soberanía tecnológica Colección de herramientas para autoalojar CapRover Cloudron.io Sandstorm.io ",
    "description": "Colección de herramientas de privacidad, hacking, administración de sistemas, análisis de red y programación segura.",
    "tags": [
      "herramientas",
      "colección",
      "privacidad",
      "software libre",
      "hacking",
      "análisis de red",
      "programación segura"
    ],
    "title": "Colección de herramientas",
    "uri": "/blog/2020-09-30_coleccion_herramientas/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "hacking",
    "uri": "/tags/hacking/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "privacidad",
    "uri": "/tags/privacidad/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "programación segura",
    "uri": "/tags/programaci%C3%B3n-segura/"
  },
  {
    "content": "En esta entrada se definen los primeros pasos a seguir con una Raspberry Pi sin necesidad de una pantalla o un cable HDMI. Es una configuración rápida y básica para poder empezar a cacharrear con el terminal.\n1. Instalación del SO Usando el programa Raspberry Pi Imager se puede quemar la imagen de Ubuntu, RaspberryPiOS, LibreElec o que prefieras, en cualquier tarjeta micro SD. 1\n2. Conexión WiFi Si prefieres no utilizar el cable HDMI para la configuración de la red, únicamente con modificar el archivo network-config con la siguiente configuración:\nwifis: wlan0: dhcp4: true optional: true access-points: \"SSID\": password: \"contraseña\" El SSID es el nombre de la red WiFi y no hace falta comillas, mientras que para la contraseña si que se necesitan comillas.\n3. Primera conexión Lo más sencillo es conectarse a través de SSH. Para ello es necesario saber cuál es la dirección IP que se asigna automáticamente mediante DHCP a la Raspberry. Se puede conocer a través de la interfaz web del router o realizando un escaneo de red con nmap.\nLa conexión se realiza mediante el siguiente comando:\nssh ubuntu@IP_máquina El usuario y contraseña por defecto son ubuntu\n4. Seguridad SSH 1. Configuración de SSH mediante llaves La diferencia de conectarse por SSH a un dispositivo mediante una contraseña o un par de llaves RSA es que la contraseña la puede conocer cualquiera y las llaves son personales e intransferibles 2. Por eso para generar un par de claves público-privada será a través del siguiente comando:\nssh-keygen -t rsa Nos pedirá una contraseña para usar la clave SSH y se crearán dos claves en el diretorio .ssh en el home del usuario. La clave privada será id_rsa, la cuál no habrá que compartirla nunca, y la pública id_rsa.pub.\nEn el siguiente paso es necesario copiar la clave pública al archivo ~/.ssh/authorized_keys de la RaspberryPi. Para ello se utilizará el siguiente comando:\nssh-copy-id -i ubuntu@\u003cip de la raspberry\u003e Ahora nos pedirá la contraseña de nuestra clave SSH y se conectará a la RaspberryPi.\nLo último que haremos en este apartado será restringir el acceso remoto con contraseñas. De esa manera sólo podrán conectarse remotamente aquellas personas que hayan subido previamente su llave SSH pública a la Raspberry Pi. Lo que tendremos que hacer es editar el archivo de configuración sshd_config`. Ejecutamos el siguiente comando en nuestra Raspberry Pi:\nsudo nano /etc/ssh/sshd_config Y en la línea PasswordAuthentication poner no:\nPasswordAuthentication no Guardamos los cambios y reiniciamos el servicio con:\nsudo service ssh restart 2. Cambio del puerto de las conexiones SSH Una buena práctica de seguridad es cambiar el puerto por defecto para las conexiones SSH (el puerto 22), ya que si intentan atacarnos probablemente prueben a conectarse por ese puerto. De esta manera, cambiando el puerto se reducirá considerablemente el numero de intentos de conexión por parte de posibles atacantes. Pueden elegir un número desde el 1024 hasta el 65535 si quieren. Pero primero debemos revisar que no haya otro servicio utilizando ese mismo puerto. Escribimos en la terminal:\nnetstat -punta | grep LISTEN Una vez comprobado que el puerto que elegimos está libre deben modificar el archivo de configuración de SSH:\nsudo nano /etc/ssh/sshd_config Cambien la línea #Port 22 por, por ejemplo, Port 2251 u otro puerto que prefieran y que no esté ocupado. Es importante que borren la almohadilla/gato/numeral porque si no el sistema lo interpreta como un comentario.\nGuarden, salgan y reinicien el servicio para que se haga efectivo el cambio en la configuración:\nsudo service ssh restart Cuidado, si hay un error en el cambio de puerto puede que se queden fuera de la servidora y pierdan la conexión por SSH que tenían. Es mejor si están físicamente cerca de la servidora en este paso.\nA partir de ahora para conectarse a la Raspberry Pi via SSH deberán especificar el puerto, porque ya no será el puerto por defecto. Así que el comando que deberán escribir de ahora en más será:\nssh -p 2251 ubuntu@\u003cdirección ip\u003e Si se se les olvida el puerto que pusieron o no saben si está abierto, pueden hacer un escaneo de puertos desde otra computadora con nmap así:\nsudo nmap -p 1-65535 -T4 -A -v \u003cip-servidora\u003e Nota: apartado copiado y reproducido de La_bekka, Seguridad de SSH - Parte IV: Securicemos nuestra servidora web 2.\nInstalación de Ubuntu en la Raspberry - Atareao ↩︎\nLa_bekka, Accedamos remotamente a la Raspberry Pi usando SSH - Parte II: ¡Hola maquinita! ↩︎ ↩︎\n",
    "description": "Instalación del SO, conexión WiFi y ssh",
    "tags": [
      "raspberry pi"
    ],
    "title": "Primeros pasos con una Raspberry Pi",
    "uri": "/blog/2020-09-28_raspberrypi/"
  },
  {
    "content": "En esta página web encontrarás una recopilación de herramientas y publicaciones sobre Programación, DevOps, Soberanía Tecnológica, Privacidad y Ciberseguridad.\nSi te gustaría colaborar y editar o añadir más contenido, escríbeme al correo robinforgood@protonmail.com con tu propuesta. ¡Gracias!\n",
    "description": "Recopilación de herramientas y publicaciones sobre Programación, DevOps, Soberanía Tecnológica, Privacidad y Ciberseguridad",
    "tags": null,
    "title": "Acerca de ...",
    "uri": "/about/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "css",
    "uri": "/tags/css/"
  },
  {
    "content": "Este artículo ofrece una muestra de la sintaxis básica de Markdown que se puede utilizar en los archivos de contenido de Hugo, y también muestra si los elementos HTML básicos están decorados con CSS en un tema de Hugo.\nCabeceras Los siguientes elementos HTML \u003ch1\u003e — \u003ch6\u003e representan seis niveles de encabezados de sección. \u003ch1\u003e es el nivel de sección más alto mientras que \u003ch6\u003e es el más bajo.\nH1 H2 H3 H4 H5 H6 Párrafo Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.\nItatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.\nBloque El elemento bloque representa contenido que se cita de otra fuente, opcionalmente con una cita que debe estar dentro de un elemento footer o cite, y opcionalmente con cambios en línea como anotaciones y abreviaturas.\nBloque sin atribución Tiam, ad mint andaepu dandae nostion secatur sequo quae. Nota: puede usar el Markdown sintaxis dentro de una blockquote.\nBloque con atribución Don’t communicate by sharing memory, share memory by communicating. — Rob Pike1\nTablas Las tablas no forman parte de la especificación principal de Markdown, pero Hugo las admite de forma inmediata.\nName Age Bob 27 Alice 23 Markdown dentro de las tablas Italics Bold Code italics bold code Bloque de código Bloque de código con comilla invertida \u003c!doctype html\u003e \u003chtml lang=\"en\"\u003e \u003chead\u003e \u003cmeta charset=\"utf-8\"\u003e \u003ctitle\u003eEjemplo de documento HTML5\u003c/title\u003e \u003c/head\u003e \u003cbody\u003e \u003cp\u003eTest\u003c/p\u003e \u003c/body\u003e \u003c!-- this line is extraneous 2Error from server (Forbidden): deployments.apps is forbidden: User \"chiptest\" cannot create resource \"deployments\" in API group \"apps\" in the namespace \"default\" --\u003e \u003c/html\u003e Codigo en bloque con sangrado de cuatro espacios \u003c!doctype html\u003e \u003chtml lang=\"en\"\u003e \u003chead\u003e \u003cmeta charset=\"utf-8\"\u003e \u003ctitle\u003eEjemplo de documento HTML5\u003c/title\u003e \u003c/head\u003e \u003cbody\u003e \u003cp\u003eTest\u003c/p\u003e \u003c/body\u003e \u003c/html\u003e Bloque de código con resaltado interno de Hugo \u003c!doctype html\u003e \u003chtml lang=\"en\"\u003e \u003chead\u003e \u003cmeta charset=\"utf-8\"\u003e \u003ctitle\u003eEjemplo de documento HTML5\u003c/title\u003e \u003c/head\u003e \u003cbody\u003e \u003cp\u003eTest\u003c/p\u003e \u003c/body\u003e \u003c/html\u003e Tipo de lista Lista ordenada Primer item Segundo item Tercer item Lista no ordenada Un item Otro item Y otro item List anidada Fruta Manzana Naranja Plátano Lácteos Leche Queso Otros elementos — abbr, sub, sup, kbd, mark GIF es un formato de imagen de mapa de bits.\nH2O\nXn + Yn = Zn\nPresiona CTRL+ALT+Delete y termina la sesión.\nLa mayoría de las salamandras son nocturnos y cazan insectos, gusanos y otras criaturas pequeñas.\nThe above quote is excerpted from Rob Pike’s talk during Gopherfest, November 18, 2015. ↩︎\n",
    "description": "Artículo de ejemplo que muestra la sintaxis y el formato básicos de Markdown para elementos HTML.",
    "tags": [
      "markdown",
      "css",
      "html"
    ],
    "title": "Ejemplo de sintaxis de Markdown",
    "uri": "/blog/2020-09-26_markdown-syntax/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "html",
    "uri": "/tags/html/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "markdown",
    "uri": "/tags/markdown/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "sintaxis",
    "uri": "/categories/sintaxis/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "GNU/Linux",
    "uri": "/tags/gnu/linux/"
  },
  {
    "content": "",
    "description": "",
    "tags": null,
    "title": "GNU/Linux",
    "uri": "/categories/gnu/linux/"
  }
]
