[{"content":"🚀 Professional Journey Overview Infrastructure as Code | Cloud Native Solutions | Continuous Delivery\nWith 8+ years in DevOps engineering, I specialize in building scalable, resilient infrastructure and automating complex deployment pipelines. My expertise spans across multi-cloud environments, container orchestration, and implementing robust DevOps practices.\n💼 Featured Projects 🔥 Current Active Projects Project: Hetzner Cloud Microservices Platform Timeline: 2024 - Present\nType: Personal\nTechnologies: Ansible, Terraform, Hetzner Cloud, GitLab CI, Podman, Packer, Devbox tool, Task framework Categories: infrastructure, automation, cloud Tags: #infrastructure #automation #cloud #hetzner #devops\nInfrastructure Highlights:\nManaged +5 microservices 99.9% uptime SLA Automation for Host Pactching and container version updates by Podman Quadlet Provisioning and deployment by Ansible Playbook, Packer and Terraform Project: www.nakira.cc Timeline: 2025 - Present\nTechnologies: Ansible, Terraform, Hetzner Cloud, GitLab CI, NextJS, Frontend, AI Categories: web development, frontend, ai, automation Tags: #webdevelopment #frontend #ai #automation #nextjs\nArchitecture Overview:\nDesigned, developed and deployed a website by using Nextjs integrated with a full lifecycle devops methodology.\nFeatures:\n🛡️ Automated DORA/GDPR compliance auditing through AI-driven validation workflows 🔒 Focus on achieve Digital Sovereignty 📊 Improve deployment focus on development and release based on tagging versioning 🔄 Build the entire application by using container distroless images Key Achievements:\n✅ Improve deployment focus on development and release based on tagging versioning ✅ Build the entire application by using container distroless images ✅ Achieved zero-downtime deployments ✅ Reduced cloud costs by 35% through optimization deployment 🏆 Delivered Projects Project: Automation Mock-API for remote Developers Timeline: 2024\nTechnologies: Jenkins, AWS ECS, Go, Github Actions, Terraform Categories: automation, ci-cd, aws Tags: #automation #cicd #aws #jenkins #go\nImplementation for frontend testing purposes, by using air.\nResults Dashboard:\nMetric Before After Improvement Deployment Frequency Weekly Daily 7x Lead Time 2 days 1 hour 94% Failure Rate 30% 10% 87% Recovery Time 2 hours 15 minutes 88% Project: AWS RDS Migration \u0026amp; Rollback Timeline: 2023 - 2024\nTechnologies: AWS RDS Aurora, Blue-Green, SQL, Bash Categories: database, aws, migration Tags: #database #aws #migration #aurora #bluegreen\nAurora Version Upgrade via Blue/Green Deployment:\nApproach: Executed a zero-downtime major version upgrade using AWS Aurora\u0026rsquo;s Blue/reen Deployment.\nProcess: Created a synchronized \u0026ldquo;Green\u0026rdquo; environment on the new Aurora version. Thoroughly validated the new environment with application testing before switching production traffic.\nRollback: Maintained the original \u0026ldquo;Blue\u0026rdquo; environment on standby, enabling an immediate rollback via a single switchover action in case of post-migration issues, ensuring minimal business risk.\nTechnical Highlights:\n🎯 Executed zero-downtime upgrade via AWS Blue/Green Deployment. ⚡ Validated new version in isolated green environment before cutover. 📈 Enabled immediate rollback by maintaining original blue instance. 🔧 Automated sync and switchover via RDS console for reliability. I made a HowTo documentation for the organization and for myself\nRollback Aurora RDS 📂 Browse All Projects by Category By Technology Explore projects sorted by technology stack:\nAWS \u0026 Cloud Amazon Web Services, GCP, Azure, multi-cloud\nKubernetes EKS, GKE, container orchestration\nCI/CD GitLab, Jenkins, GitHub Actions\nDatabase Aurora, PostgreSQL, SQL Server\nMonitoring prometheus, Grafana, Stackdriver\nIaC Terraform, Terragrunt, Packer\nLinux Debian, Ubuntu, RHEL, Fedora\nContainers Docker, Podman, containerd\n🎯 Project Methodology DevOps Lifecycle Implementation The DevOps lifecycle is a continuous loop that enables teams to deliver software faster and more reliably.\nCore Principles:\nInfrastructure as Code - Everything versioned and automated Continuous Everything - Integration, delivery, deployment Monitoring-Driven Development - Data-informed decisions Security First - Shift-left security practices Collaboration - Breaking down silos between teams 📞 Let\u0026rsquo;s Collaborate Interested in discussing DevOps solutions or potential collaborations?\nSchedule a Call Gitlab Profile \u0026ldquo;Automation applied to an inefficient operation will magnify the inefficiency.\u0026rdquo; — Bill Gates\nLast Updated: October 2025\nActive Projects: 3\nTechnologies Mastered: 25+\n","permalink":"https://jose.castrillo.eu/page/py/","summary":"\u003ch2 id=\"-professional-journey-overview\"\u003e🚀 Professional Journey Overview\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eInfrastructure as Code | Cloud Native Solutions | Continuous Delivery\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWith \u003cstrong\u003e8+ years\u003c/strong\u003e in DevOps engineering, I specialize in building scalable, resilient infrastructure and automating complex deployment pipelines. My expertise spans across multi-cloud environments, container orchestration, and implementing robust DevOps practices.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"-featured-projects\"\u003e💼 Featured Projects\u003c/h2\u003e\n\u003ch3 id=\"-current-active-projects\"\u003e🔥 Current Active Projects\u003c/h3\u003e\n\u003ch4 id=\"project-hetzner-cloud-microservices-platform\"\u003e\u003cstrong\u003eProject: Hetzner Cloud Microservices Platform\u003c/strong\u003e\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eTimeline:\u003c/strong\u003e 2024 - Present\u003cbr\u003e\n\u003cstrong\u003eType:\u003c/strong\u003e Personal\u003cbr\u003e\n\u003cstrong\u003eTechnologies:\u003c/strong\u003e Ansible, Terraform, Hetzner Cloud, GitLab CI, Podman, Packer, Devbox tool, Task framework\n\u003cstrong\u003eCategories:\u003c/strong\u003e infrastructure, automation, cloud\n\u003cstrong\u003eTags:\u003c/strong\u003e #infrastructure #automation #cloud #hetzner #devops\u003c/p\u003e","title":"DevOps Projects"},{"content":"🚀 Career Timeline Each branch represents a role, and commits represent key skills or achievements acquired during that period.\nLegend Branch Color Role Period 🟢 career Main career timeline — 🔵 junior-dev@StartupX Junior Developer 2018–2020 🟠 backend-dev@MidCorp Backend Developer 2020–2022 Legend Branch Color Role Period 🟢 career Main career timeline — 🔵 junior-dev@StartupX Junior Developer 2018–2020 🟠 backend-dev@MidCorp Backend Developer 2020–2022 🟣 data-eng@AllianzTech Data Engineer 2022–2024 🟤 side-projects Side Projects Ongoing 🔴 sr-data-eng@SchwarzIT Sr. Data Engineer 2024–Now ","permalink":"https://jose.castrillo.eu/page/jose/","summary":"\u003ch2 id=\"-career-timeline\"\u003e🚀 Career Timeline\u003c/h2\u003e\n\u003cp\u003eEach \u003cstrong\u003ebranch\u003c/strong\u003e represents a role, and \u003cstrong\u003ecommits\u003c/strong\u003e represent key skills\nor achievements acquired during that period.\u003c/p\u003e\n\u003ch3 id=\"legend\"\u003eLegend\u003c/h3\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eBranch Color\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eRole\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003ePeriod\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🟢 \u003ccode\u003ecareer\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMain career timeline\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e—\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🔵 \u003ccode\u003ejunior-dev@StartupX\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eJunior Developer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2018–2020\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🟠 \u003ccode\u003ebackend-dev@MidCorp\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eBackend Developer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2020–2022\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"legend-1\"\u003eLegend\u003c/h3\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eBranch Color\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eRole\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003ePeriod\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🟢 \u003ccode\u003ecareer\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eMain career timeline\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e—\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🔵 \u003ccode\u003ejunior-dev@StartupX\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eJunior Developer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2018–2020\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🟠 \u003ccode\u003ebackend-dev@MidCorp\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eBackend Developer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2020–2022\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🟣 \u003ccode\u003edata-eng@AllianzTech\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eData Engineer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2022–2024\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🟤 \u003ccode\u003eside-projects\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSide Projects\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eOngoing\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e🔴 \u003ccode\u003esr-data-eng@SchwarzIT\u003c/code\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eSr. Data Engineer\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2024–Now\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e","title":"My Career Journey"},{"content":"Why Linux 🐧? the question isn\u0026rsquo;t why Linux ? the real question is why not ? did you try it?\nLinux is widely regarded as the best option for development, DevOps, hybrid cloud solutions, and even as a desktop for home and office environments due to its open-source nature, robust ecosystem, scalability, security, and cost-effectiveness. Its flexibility allows seamless integration across diverse platforms, from small IoT devices to large-scale cloud infrastructures, making it the backbone of modern technology stacks.\nKey Advantages Development \u0026amp; DevOps: Linux provides a rich ecosystem of tools (Git, Bash, Jenkins, Ansible, Puppet) that enhance productivity and automate workflows, making it ideal for software development and DevOps practices. Hybrid \u0026amp; Cloud Solutions: Over 90% of cloud workloads run on Linux, thanks to its stability, security, and support for containerization (Docker, Kubernetes) and orchestration tools. Desktop Use: Modern Linux desktop environments (XFCE, MATE, LXQt) are lightweight, fast, and suitable for both old and new hardware, offering a free and customizable alternative to Windows and macOS. Summary Linux’s dominance in development, DevOps, and cloud environments is rooted in its open-source philosophy, extensive tooling, and adaptability. Its security, scalability, and cost advantages make it the preferred choice for both enterprise and personal use in 2025.\nLet\u0026rsquo;s wait and measure the growth and adaptation in 2026 🐧\nSources DevOps in 2025: Why Linux, Golang, and AIOps Are the \u0026hellip;[8] Why Linux and DevOps Go Hand in Hand[1] The Pervasive Influence of Linux on Modern Software \u0026hellip;[2] Why learn and use Linux? - DevOps.dev[5] Best Linux Distributions for Cloud Servers in 2025[3] Linux + Cloud: The Ultimate Tech Combo for 2025[4] Top 7 Linux Desktops for Old PCs in 2025 – Fast \u0026amp; Free OS[6] 2025: Year of the Linux Desktop (for me at least)[7] ","permalink":"https://jose.castrillo.eu/post/linux-better-solution/","summary":"\u003cp\u003eWhy Linux 🐧? the question isn\u0026rsquo;t why Linux ? the real question is why not ? did you try it?\u003c/p\u003e\n\u003cp\u003eLinux is widely regarded as the best option for development, DevOps, hybrid cloud solutions, and even as a desktop for home and office environments due to its open-source nature, robust ecosystem, scalability, security, and cost-effectiveness. Its flexibility allows seamless integration across diverse platforms, from small IoT devices to large-scale cloud infrastructures, making it the backbone of modern technology stacks.\u003c/p\u003e","title":"Linux on Business"},{"content":"Cloud Development Operations - [currently] Jose Castrillo Title: Cloud Development Operations Public Cloud: AWS Started: Nov 2024 - Currently Company: Aubay Client: Allianz\nAs part of the DevOps team, I design, maintain, and automate AWS infrastructure with Terraform and Terragrunt, following Infrastructure as Code (IaC) principles. I drive automation, CI/CD adoption, and cloud cost/security optimization across environments.\nDocker AWS Linux❤️ GNU Bash Visual Studio Code Ansible Jenkins Terraform python Java Terragrunt Key Achievements:\nModernized AWS environment provisioning by leveraging Terragrunt, streamlining variable management across dev, staging, and production. Designed and implemented GitLab CI/CD pipelines, reducing manual deployments and accelerating release cycles. Delivered infrastructure automation solutions that improved stability, compliance, and cost-efficiency for multiple projects. Acted as a cloud advisor, enabling teams to adopt modern deployment practices and faster service delivery. Senior Cloud Solutions Engineer Title: Senior Cloud Solutions Engineer Public Cloud: AWS Started: Feb 2024 - Nov 2024 Company: Clorian\nModernized and optimized infrastructure through IaC and CI/CD pipelines, focusing on scalability, automation, and security improvements.\nDocker AWS Linux❤️ GNU Bash Visual Studio Code Ansible Jenkins Terraform python Java npm Spring-Boot JavaScript Key Achievements:\nRe-engineered infrastructure under Terraform, ensuring reproducibility and reducing provisioning time. Built and optimized CI/CD pipelines with GitHub Actions and Jenkins, achieving faster and more reliable deployments. Automated continuous delivery pipelines that improved software release velocity and reduced operational overhead. Provided cloud expertise to stakeholders, improving delivery standards and reducing time-to-market for services. Cloud Solutions Engineer Title: Cloud Solutions Engineer Public Cloud: AWS \u0026amp; Azure Started: Oct 2022 - Feb 2024 Company: Festo\nDevelop and maintain CI/CD pipelines for automating software delivery, testing, and deployment. Manage and automate cloud infrastructure to enhance efficiency and reduce costs, including monitoring, maintenance, governance, and troubleshooting. Collaborate with cross-functional teams to align cloud systems with business needs.\nDocker AWS Linux❤️ GNU Bash Visual Studio Code Ansible Kubernetes Grafana GitLab Terraform Azure python Java npm Spring-Boot JavaScript Key Achievements:\nEnhanced security posture and reduced risks by enforcing governance and compliance standards. Provisioned and automated cloud services across AWS and Azure, improving availability and scalability. Built GitLab CI/CD pipelines that cut manual deployment times and increased development productivity. Drove team collaboration and delivery efficiency using Jira, Confluence, and DevOps best practices. SRE Title: SRE T2 (level 2) Public Cloud: AWS Started: Apr 2021 - Oct 2022 Company: NTT\nSpecialized in reliability, scalability, and automation for large-scale cloud-native platforms.\nDocker AWS Prometheus Linux❤️ GNU Bash Visual Studio Code Ansible Kubernetes Grafana GitLab Terraform Key Achievements:\nManaged and scaled Amazon EKS clusters using IaC and GitOps, ensuring consistency and compliance across environments. Automated zero-downtime patching with Packer and Ansible, reducing maintenance windows while strengthening security. Streamlined infrastructure provisioning with Terraform, cutting manual intervention and errors. Ops Engineer Title: Ops Engineer Started: Feb 2021 - Apr 2021 · 3 mos Company: NTT\nMonitoring, detect and prevent incidents, execute standards patching scheduled under time windows for different customers, follows standards RB \u0026amp; SOPs in order to mitigate unresponsive customer services.\nLinux❤️ Windows in production, why? Docker GitHub Git icon GNU Bash Something called PowerShell Key Achievements:\nDelivered incident resolution and patch management across Linux and Windows environments. Improved monitoring efficiency through LogicMonitor and OP5, ensuring high service availability. Enhanced troubleshooting scripts for system diagnostics (network, DNS, memory), reducing time-to-resolution. FSE Title: FSE Started: Apr 2019 - Nov 2020 · 1 yr 8 mos Company: Excem Technology Client: Mossos d\u0026rsquo;Esquadra - Catalan Police Force\nMaintained 24/7 mission-critical infrastructure for national law enforcement data interception and analysis systems under ETSI protocols with multiple communication providers.\nLinux❤️ Windows in production, why? Yammer? ok fine. Red Hat MSQL Server PostgreSQL GNU Bash NetApp Notepad++ icon Fortinet Key Achievements:\nEnsured high availability for sensitive data systems under strict ETSI protocols. Administered mixed Linux/Windows environments, maintaining resilience and uptime. Conducted packet analysis (Wireshark) and managed databases (Sybase, Postgres, MSSQL) to support investigations. Led Tier 1 \u0026amp; 2 incident response, securing uninterrupted system operations. Cloud Solutions Engineer Title: Cloud Solutions Engineer Public Cloud: GCP Started: Nov 2018 - Mar 2019 · 5 mos Company: WebHelp\nMember of the Infrastructure Team, we manage the customer infrastructure on GCP; incident management on AMI, ssh connections (troubleshooting), configurations and good practices, explanation to clients for deployment in GCE and GKE.\nKubernetes Docker Google Cloud Salesforce Stack Overflow icon Prometheus Linux❤️ GNU Bash Atom Key Achievements:\nManaged GCP infrastructure, troubleshooting GKE clusters and optimizing workloads. Migrated projects across organizations, ensuring smooth transition and minimal downtime. Implemented Stackdriver monitoring for improved visibility and reliability. Enforced IAM role best practices, strengthening access management and compliance. Database Administrator Title: Database Administrator Started: Jan 2018 - Oct 2018 · 10 mos Company: Barcelona Judicial Academy\nConfiguration CISCO switches, (AP outputs), migrations and changes of queries in the DB SQL 2008, management of the AD-CD windows server, feeding internal wiki for maintenance and tasks.\nSomething called PowerShell MSQL Server .NET icon Cisco icon Windows in production, why? SQLite icon Fortinet Key Achievements:\nAdministered SQL Server databases, AD/DC 2008, and executed DDL queries for performance improvements. Reduced end-user provisioning time using Clonezilla automation. Performed Cisco switch maintenance and troubleshooting for high-availability environments. Technical Support Engineer Title: Technical Support Engineer Started: Apr 2016 - Dec 2017 · 1 yr 9 mos Company: Volotea\nSome of my duties were inventory of microcomputer equipments, devices installation and configuration for endusers MS Win and Linux devices installation of apps and permissions for staff from different departments.\nJira Windows in production, why? OpenVPN Something called PowerShell Notepad++ icon Citrix Key Achievements:\nSupported 300+ end-users with Windows and mobile device management. Maintained IT service documentation in Jira/Confluence, improving knowledge sharing. Implemented VPN access and security policies for remote staff. 📜 Certificates\n💻 Courses Further information on Linkedin\n","permalink":"https://jose.castrillo.eu/page/exp/","summary":"\u003ch1 id=\"1\" style=\"height: 0; width: 0; position: absolute; visibility: hidden;\"\u003eCloud Development Operations - [currently]\u003c/h1\u003e\n\n\n\n\n\n\u003clink href=\"https://fonts.googleapis.com/css?family=Inconsolata\" rel=\"stylesheet\" type=\"text/css\"\u003e\n\u003cdiv style=\"font-family:'Inconsolata';font-size:32px;font-style:normal;font-weight:lighter\"\u003e\nJose Castrillo\n\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eTitle:\u003c/strong\u003e \u003ca href=\"https://www.payscale.com/research/US/Job=Senior_Development_Operations_%28DevOps%29_Engineer/Salary\"\u003eCloud Development Operations\u003c/a\u003e \u003cbr\u003e\n\u003cstrong\u003ePublic Cloud:\u003c/strong\u003e \u003ca href=\"https://aws.amazon.com/\"\u003eAWS\u003c/a\u003e \u003cbr\u003e\n\u003cstrong\u003eStarted:\u003c/strong\u003e Nov 2024 - \u003cem\u003eCurrently\u003c/em\u003e \u003cbr\u003e\n\u003cstrong\u003eCompany:\u003c/strong\u003e \u003ca href=\"aubay.com\"\u003eAubay\u003c/a\u003e \u003cbr\u003e\n\u003cstrong\u003eClient:\u003c/strong\u003e \u003ca href=\"https://www.allianz.com/en.html\"\u003eAllianz\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAs part of the DevOps team, I design, maintain, and automate AWS infrastructure with Terraform and Terragrunt, following Infrastructure as Code (IaC) principles. I drive automation, CI/CD adoption, and cloud cost/security optimization across environments.\u003c/p\u003e\n\u003cp\u003e\n\u003csvg role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ctitle\u003eDocker\u003c/title\u003e\u003cpath d=\"M13.983 11.078h2.119a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.119a.185.185 0 00-.185.185v1.888c0 .102.083.185.185.185m-2.954-5.43h2.118a.186.186 0 00.186-.186V3.574a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m0 2.716h2.118a.187.187 0 00.186-.186V6.29a.186.186 0 00-.186-.185h-2.118a.185.185 0 00-.185.185v1.887c0 .102.082.185.185.186m-2.93 0h2.12a.186.186 0 00.184-.186V6.29a.185.185 0 00-.185-.185H8.1a.185.185 0 00-.185.185v1.887c0 .102.083.185.185.186m-2.964 0h2.119a.186.186 0 00.185-.186V6.29a.185.185 0 00-.185-.185H5.136a.186.186 0 00-.186.185v1.887c0 .102.084.185.186.186m5.893 2.715h2.118a.186.186 0 00.186-.185V9.006a.186.186 0 00-.186-.186h-2.118a.185.185 0 00-.185.185v1.888c0 .102.082.185.185.185m-2.93 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.083.185.185.185m-2.964 0h2.119a.185.185 0 00.185-.185V9.006a.185.185 0 00-.184-.186h-2.12a.186.186 0 00-.186.186v1.887c0 .102.084.185.186.185m-2.92 0h2.12a.185.185 0 00.184-.185V9.006a.185.185 0 00-.184-.186h-2.12a.185.185 0 00-.184.185v1.888c0 .102.082.185.185.185M23.763 9.89c-.065-.051-.672-.51-1.954-.51-.338.001-.676.03-1.01.087-.248-1.7-1.653-2.53-1.716-2.566l-.344-.199-.226.327c-.284.438-.49.922-.612 1.43-.23.97-.09 1.882.403 2.661-.595.332-1.55.413-1.744.42H.751a.751.751 0 00-.75.748 11.376 11.376 0 00.692 4.062c.545 1.428 1.355 2.48 2.41 3.124 1.18.723 3.1 1.137 5.275 1.137.983.003 1.963-.086 2.93-.266a12.248 12.248 0 003.823-1.389c.98-.567 1.86-1.288 2.61-2.136 1.252-1.418 1.998-2.997 2.553-4.4h.221c1.372 0 2.215-.549 2.68-1.009.309-.293.55-.65.707-1.046l.098-.288Z\"/\u003e\u003c/svg\u003e\n\n\n\n\u003csvg role=\"img\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" viewBox=\"0 0 24 24\"\u003e\u003ctitle\u003eAWS\u003c/title\u003e\u003cpath d=\"M6.763 10.036c0 .296.032.535.088.71.064.176.144.368.256.576.04.063.056.127.056.183 0 .08-.048.16-.152.24l-.503.335a.383.383 0 0 1-.208.072c-.08 0-.16-.04-.239-.112a2.47 2.47 0 0 1-.287-.375 6.18 6.18 0 0 1-.248-.471c-.622.734-1.405 1.101-2.347 1.101-.67 0-1.205-.191-1.596-.574-.391-.384-.59-.894-.59-1.533 0-.678.239-1.23.726-1.644.487-.415 1.133-.623 1.955-.623.272 0 .551.024.846.064.296.04.6.104.918.176v-.583c0-.607-.127-1.03-.375-1.277-.255-.248-.686-.367-1.3-.367-.28 0-.568.031-.863.103-.295.072-.583.16-.862.272a2.287 2.287 0 0 1-.28.104.488.488 0 0 1-.127.023c-.112 0-.168-.08-.168-.247v-.391c0-.128.016-.224.056-.28a.597.597 0 0 1 .224-.167c.279-.144.614-.264 1.005-.36a4.84 4.84 0 0 1 1.246-.151c.95 0 1.644.216 2.091.647.439.43.662 1.085.662 1.963v2.586zm-3.24 1.214c.263 0 .534-.048.822-.144.287-.096.543-.271.758-.51.128-.152.224-.32.272-.512.047-.191.08-.423.08-.694v-.335a6.66 6.66 0 0 0-.735-.136 6.02 6.02 0 0 0-.75-.048c-.535 0-.926.104-1.19.32-.263.215-.39.518-.39.917 0 .375.095.655.295.846.191.2.47.296.838.296zm6.41.862c-.144 0-.24-.024-.304-.08-.064-.048-.12-.16-.168-.311L7.586 5.55a1.398 1.398 0 0 1-.072-.32c0-.128.064-.2.191-.2h.783c.151 0 .255.025.31.08.065.048.113.16.16.312l1.342 5.284 1.245-5.284c.04-.16.088-.264.151-.312a.549.549 0 0 1 .32-.08h.638c.152 0 .256.025.32.08.063.048.12.16.151.312l1.261 5.348 1.381-5.348c.048-.16.104-.264.16-.312a.52.52 0 0 1 .311-.08h.743c.127 0 .2.065.2.2 0 .04-.009.08-.017.128a1.137 1.137 0 0 1-.056.2l-1.923 6.17c-.048.16-.104.263-.168.311a.51.51 0 0 1-.303.08h-.687c-.151 0-.255-.024-.32-.08-.063-.056-.119-.16-.15-.32l-1.238-5.148-1.23 5.14c-.04.16-.087.264-.15.32-.065.056-.177.08-.32.08zm10.256.215c-.415 0-.83-.048-1.229-.143-.399-.096-.71-.2-.918-.32-.128-.071-.215-.151-.247-.223a.563.563 0 0 1-.048-.224v-.407c0-.167.064-.247.183-.247.048 0 .096.008.144.024.048.016.12.048.2.08.271.12.566.215.878.279.319.064.63.096.95.096.502 0 .894-.088 1.165-.264a.86.86 0 0 0 .415-.758.777.777 0 0 0-.215-.559c-.144-.151-.416-.287-.807-.415l-1.157-.36c-.583-.183-1.014-.454-1.277-.813a1.902 1.902 0 0 1-.4-1.158c0-.335.073-.63.216-.886.144-.255.335-.479.575-.654.24-.184.51-.32.83-.415.32-.096.655-.136 1.006-.136.175 0 .359.008.535.032.183.024.35.056.518.088.16.04.312.08.455.127.144.048.256.096.336.144a.69.69 0 0 1 .24.2.43.43 0 0 1 .071.263v.375c0 .168-.064.256-.184.256a.83.83 0 0 1-.303-.096 3.652 3.652 0 0 0-1.532-.311c-.455 0-.815.071-1.062.223-.248.152-.375.383-.375.71 0 .224.08.416.24.567.159.152.454.304.877.44l1.134.358c.574.184.99.44 1.237.767.247.327.367.702.367 1.117 0 .343-.072.655-.207.926-.144.272-.336.511-.583.703-.248.2-.543.343-.886.447-.36.111-.734.167-1.142.167zM21.698 16.207c-2.626 1.94-6.442 2.969-9.722 2.969-4.598 0-8.74-1.7-11.87-4.526-.247-.223-.024-.527.272-.351 3.384 1.963 7.559 3.153 11.877 3.153 2.914 0 6.114-.607 9.06-1.852.439-.2.814.287.383.607zM22.792 14.961c-.336-.43-2.22-.207-3.074-.103-.255.032-.295-.192-.063-.36 1.5-1.053 3.967-.75 4.254-.399.287.36-.08 2.826-1.485 4.007-.215.184-.423.088-.327-.151.32-.79 1.03-2.57.695-2.994z\"/\u003e\u003c/svg\u003e\n\n\n\n\u003csvg role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ctitle\u003eLinux❤️\u003c/title\u003e\u003cpath d=\"M12.504 0c-.155 0-.315.008-.48.021-4.226.333-3.105 4.807-3.17 6.298-.076 1.092-.3 1.953-1.05 3.02-.885 1.051-2.127 2.75-2.716 4.521-.278.832-.41 1.684-.287 2.489a.424.424 0 00-.11.135c-.26.268-.45.6-.663.839-.199.199-.485.267-.797.4-.313.136-.658.269-.864.68-.09.189-.136.394-.132.602 0 .199.027.4.055.536.058.399.116.728.04.97-.249.68-.28 1.145-.106 1.484.174.334.535.47.94.601.81.2 1.91.135 2.774.6.926.466 1.866.67 2.616.47.526-.116.97-.464 1.208-.946.587-.003 1.23-.269 2.26-.334.699-.058 1.574.267 2.577.2.025.134.063.198.114.333l.003.003c.391.778 1.113 1.132 1.884 1.071.771-.06 1.592-.536 2.257-1.306.631-.765 1.683-1.084 2.378-1.503.348-.199.629-.469.649-.853.023-.4-.2-.811-.714-1.376v-.097l-.003-.003c-.17-.2-.25-.535-.338-.926-.085-.401-.182-.786-.492-1.046h-.003c-.059-.054-.123-.067-.188-.135a.357.357 0 00-.19-.064c.431-1.278.264-2.55-.173-3.694-.533-1.41-1.465-2.638-2.175-3.483-.796-1.005-1.576-1.957-1.56-3.368.026-2.152.236-6.133-3.544-6.139zm.529 3.405h.013c.213 0 .396.062.584.198.19.135.33.332.438.533.105.259.158.459.166.724 0-.02.006-.04.006-.06v.105a.086.086 0 01-.004-.021l-.004-.024a1.807 1.807 0 01-.15.706.953.953 0 01-.213.335.71.71 0 00-.088-.042c-.104-.045-.198-.064-.284-.133a1.312 1.312 0 00-.22-.066c.05-.06.146-.133.183-.198.053-.128.082-.264.088-.402v-.02a1.21 1.21 0 00-.061-.4c-.045-.134-.101-.2-.183-.333-.084-.066-.167-.132-.267-.132h-.016c-.093 0-.176.03-.262.132a.8.8 0 00-.205.334 1.18 1.18 0 00-.09.4v.019c.002.089.008.179.02.267-.193-.067-.438-.135-.607-.202a1.635 1.635 0 01-.018-.2v-.02a1.772 1.772 0 01.15-.768c.082-.22.232-.406.43-.533a.985.985 0 01.594-.2zm-2.962.059h.036c.142 0 .27.048.399.135.146.129.264.288.344.465.09.199.14.4.153.667v.004c.007.134.006.2-.002.266v.08c-.03.007-.056.018-.083.024-.152.055-.274.135-.393.2.012-.09.013-.18.003-.267v-.015c-.012-.133-.04-.2-.082-.333a.613.613 0 00-.166-.267.248.248 0 00-.183-.064h-.021c-.071.006-.13.04-.186.132a.552.552 0 00-.12.27.944.944 0 00-.023.33v.015c.012.135.037.2.08.334.046.134.098.2.166.268.01.009.02.018.034.024-.07.057-.117.07-.176.136a.304.304 0 01-.131.068 2.62 2.62 0 01-.275-.402 1.772 1.772 0 01-.155-.667 1.759 1.759 0 01.08-.668 1.43 1.43 0 01.283-.535c.128-.133.26-.2.418-.2zm1.37 1.706c.332 0 .733.065 1.216.399.293.2.523.269 1.052.468h.003c.255.136.405.266.478.399v-.131a.571.571 0 01.016.47c-.123.31-.516.643-1.063.842v.002c-.268.135-.501.333-.775.465-.276.135-.588.292-1.012.267a1.139 1.139 0 01-.448-.067 3.566 3.566 0 01-.322-.198c-.195-.135-.363-.332-.612-.465v-.005h-.005c-.4-.246-.616-.512-.686-.71-.07-.268-.005-.47.193-.6.224-.135.38-.271.483-.336.104-.074.143-.102.176-.131h.002v-.003c.169-.202.436-.47.839-.601.139-.036.294-.065.466-.065zm2.8 2.142c.358 1.417 1.196 3.475 1.735 4.473.286.534.855 1.659 1.102 3.024.156-.005.33.018.513.064.646-1.671-.546-3.467-1.089-3.966-.22-.2-.232-.335-.123-.335.59.534 1.365 1.572 1.646 2.757.13.535.16 1.104.021 1.67.067.028.135.06.205.067 1.032.534 1.413.938 1.23 1.537v-.043c-.06-.003-.12 0-.18 0h-.016c.151-.467-.182-.825-1.065-1.224-.915-.4-1.646-.336-1.77.465-.008.043-.013.066-.018.135-.068.023-.139.053-.209.064-.43.268-.662.669-.793 1.187-.13.533-.17 1.156-.205 1.869v.003c-.02.334-.17.838-.319 1.35-1.5 1.072-3.58 1.538-5.348.334a2.645 2.645 0 00-.402-.533 1.45 1.45 0 00-.275-.333c.182 0 .338-.03.465-.067a.615.615 0 00.314-.334c.108-.267 0-.697-.345-1.163-.345-.467-.931-.995-1.788-1.521-.63-.4-.986-.87-1.15-1.396-.165-.534-.143-1.085-.015-1.645.245-1.07.873-2.11 1.274-2.763.107-.065.037.135-.408.974-.396.751-1.14 2.497-.122 3.854a8.123 8.123 0 01.647-2.876c.564-1.278 1.743-3.504 1.836-5.268.048.036.217.135.289.202.218.133.38.333.59.465.21.201.477.335.876.335.039.003.075.006.11.006.412 0 .73-.134.997-.268.29-.134.52-.334.74-.4h.005c.467-.135.835-.402 1.044-.7zm2.185 8.958c.037.6.343 1.245.882 1.377.588.134 1.434-.333 1.791-.765l.211-.01c.315-.007.577.01.847.268l.003.003c.208.199.305.53.391.876.085.4.154.78.409 1.066.486.527.645.906.636 1.14l.003-.007v.018l-.003-.012c-.015.262-.185.396-.498.595-.63.401-1.746.712-2.457 1.57-.618.737-1.37 1.14-2.036 1.191-.664.053-1.237-.2-1.574-.898l-.005-.003c-.21-.4-.12-1.025.056-1.69.176-.668.428-1.344.463-1.897.037-.714.076-1.335.195-1.814.12-.465.308-.797.641-.984l.045-.022zm-10.814.049h.01c.053 0 .105.005.157.014.376.055.706.333 1.023.752l.91 1.664.003.003c.243.533.754 1.064 1.189 1.637.434.598.77 1.131.729 1.57v.006c-.057.744-.48 1.148-1.125 1.294-.645.135-1.52.002-2.395-.464-.968-.536-2.118-.469-2.857-.602-.369-.066-.61-.2-.723-.4-.11-.2-.113-.602.123-1.23v-.004l.002-.003c.117-.334.03-.752-.027-1.118-.055-.401-.083-.71.043-.94.16-.334.396-.4.69-.533.294-.135.64-.202.915-.47h.002v-.002c.256-.268.445-.601.668-.838.19-.201.38-.336.663-.336zm7.159-9.074c-.435.201-.945.535-1.488.535-.542 0-.97-.267-1.28-.466-.154-.134-.28-.268-.373-.335-.164-.134-.144-.333-.074-.333.109.016.129.134.199.2.096.066.215.2.36.333.292.2.68.467 1.167.467.485 0 1.053-.267 1.398-.466.195-.135.445-.334.648-.467.156-.136.149-.267.279-.267.128.016.034.134-.147.332a8.097 8.097 0 01-.69.468zm-1.082-1.583V5.64c-.006-.02.013-.042.029-.05.074-.043.18-.027.26.004.063 0 .16.067.15.135-.006.049-.085.066-.135.066-.055 0-.092-.043-.141-.068-.052-.018-.146-.008-.163-.065zm-.551 0c-.02.058-.113.049-.166.066-.047.025-.086.068-.14.068-.05 0-.13-.02-.136-.068-.01-.066.088-.133.15-.133.08-.031.184-.047.259-.005.019.009.036.03.03.05v.02h.003z\"/\u003e\u003c/svg\u003e\n\n\n\n\u003csvg role=\"img\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003ctitle\u003eGNU Bash\u003c/title\u003e\u003cpath d=\"M21.038,4.9l-7.577-4.498C13.009,0.134,12.505,0,12,0c-0.505,0-1.009,0.134-1.462,0.403L2.961,4.9 C2.057,5.437,1.5,6.429,1.5,7.503v8.995c0,1.073,0.557,2.066,1.462,2.603l7.577,4.497C10.991,23.866,11.495,24,12,24 c0.505,0,1.009-0.134,1.461-0.402l7.577-4.497c0.904-0.537,1.462-1.529,1.462-2.603V7.503C22.5,6.429,21.943,5.437,21.038,4.9z M15.17,18.946l0.013,0.646c0.001,0.078-0.05,0.167-0.111,0.198l-0.383,0.22c-0.061,0.031-0.111-0.007-0.112-0.085L14.57,19.29 c-0.328,0.136-0.66,0.169-0.872,0.084c-0.04-0.016-0.057-0.075-0.041-0.142l0.139-0.584c0.011-0.046,0.036-0.092,0.069-0.121 c0.012-0.011,0.024-0.02,0.036-0.026c0.022-0.011,0.043-0.014,0.062-0.006c0.229,0.077,0.521,0.041,0.802-0.101 c0.357-0.181,0.596-0.545,0.592-0.907c-0.003-0.328-0.181-0.465-0.613-0.468c-0.55,0.001-1.064-0.107-1.072-0.917 c-0.007-0.667,0.34-1.361,0.889-1.8l-0.007-0.652c-0.001-0.08,0.048-0.168,0.111-0.2l0.37-0.236 c0.061-0.031,0.111,0.007,0.112,0.087l0.006,0.653c0.273-0.109,0.511-0.138,0.726-0.088c0.047,0.012,0.067,0.076,0.048,0.151 l-0.144,0.578c-0.011,0.044-0.036,0.088-0.065,0.116c-0.012,0.012-0.025,0.021-0.038,0.028c-0.019,0.01-0.038,0.013-0.057,0.009 c-0.098-0.022-0.332-0.073-0.699,0.113c-0.385,0.195-0.52,0.53-0.517,0.778c0.003,0.297,0.155,0.387,0.681,0.396 c0.7,0.012,1.003,0.318,1.01,1.023C16.105,17.747,15.736,18.491,15.17,18.946z M19.143,17.859c0,0.06-0.008,0.116-0.058,0.145 l-1.916,1.164c-0.05,0.029-0.09,0.004-0.09-0.056v-0.494c0-0.06,0.037-0.093,0.087-0.122l1.887-1.129 c0.05-0.029,0.09-0.004,0.09,0.056V17.859z M20.459,6.797l-7.168,4.427c-0.894,0.523-1.553,1.109-1.553,2.187v8.833 c0,0.645,0.26,1.063,0.66,1.184c-0.131,0.023-0.264,0.039-0.398,0.039c-0.42,0-0.833-0.114-1.197-0.33L3.226,18.64 c-0.741-0.44-1.201-1.261-1.201-2.142V7.503c0-0.881,0.46-1.702,1.201-2.142l7.577-4.498c0.363-0.216,0.777-0.33,1.197-0.33 c0.419,0,0.833,0.114,1.197,0.33l7.577,4.498c0.624,0.371,1.046,1.013,1.164,1.732C21.686,6.557,21.12,6.411,20.459,6.797z\"/\u003e\u003c/svg\u003e\n\n\n\n\u003csvg role=\"img\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003ctitle\u003eVisual Studio Code\u003c/title\u003e\u003cpath d=\"M23.15 2.587L18.21.21a1.494 1.494 0 0 0-1.705.29l-9.46 8.63-4.12-3.128a.999.999 0 0 0-1.276.057L.327 7.261A1 1 0 0 0 .326 8.74L3.899 12 .326 15.26a1 1 0 0 0 .001 1.479L1.65 17.94a.999.999 0 0 0 1.276.057l4.12-3.128 9.46 8.63a1.492 1.492 0 0 0 1.704.29l4.942-2.377A1.5 1.5 0 0 0 24 20.06V3.939a1.5 1.5 0 0 0-.85-1.352zm-5.146 14.861L10.826 12l7.178-5.448v10.896z\"/\u003e\u003c/svg\u003e\n\n\n\n\u003csvg role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \u003e\u003ctitle\u003eAnsible\u003c/title\u003e\u003cpath d=\"M10.617 11.473l4.686 3.695-3.102-7.662zM12 0C5.371 0 0 5.371 0 12s5.371 12 12 12 12-5.371 12-12S18.629 0 12 0zm5.797 17.305c-.011.471-.403.842-.875.83-.236 0-.416-.09-.664-.293l-6.19-5-2.079 5.203H6.191L11.438 5.44c.124-.314.427-.52.764-.506.326-.014.63.189.742.506l4.774 11.494c.045.111.08.234.08.348-.001.009-.001.009-.001.023z\"/\u003e\u003c/svg\u003e\n\n\n\n\u003csvg role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ctitle\u003eJenkins\u003c/title\u003e\u003cpath d=\"M2.872 24h-.975a3.866 3.866 0 01-.07-.197c-.215-.666-.594-1.49-.692-2.154-.146-.984.78-1.039 1.374-1.465.915-.66 1.635-1.025 2.627-1.62.295-.179 1.182-.624 1.281-.829.201-.408-.345-.982-.49-1.3-.225-.507-.345-.937-.376-1.435-.824-.13-1.455-.627-1.844-1.185-.63-.925-1.066-2.635-.525-3.936.045-.103.254-.305.285-.463.06-.308-.105-.72-.12-1.048-.06-1.692.284-3.15 1.425-3.66.463-1.84 2.113-2.453 3.673-3.367.58-.342 1.224-.562 1.89-.807 2.372-.877 6.027-.712 7.994.783.836.633 2.176 1.97 2.656 2.939 1.262 2.555 1.17 6.825.287 9.934-.12.421-.29 1.032-.533 1.533-.168.35-.689 1.05-.625 1.36.064.314 1.19 1.17 1.432 1.395.434.422 1.26.975 1.324 1.5.07.557-.248 1.336-.41 1.875-.217.721-.436 1.441-.654 2.131H2.87zm11.104-3.54c-.545-.3-1.361-.622-2.065-.757-.87-.164-.78 1.188-.75 1.994.03.643.36 1.316.51 1.744.076.197.09.41.256.449.3.068 1.29-.326 1.575-.479.6-.328 1.064-.844 1.574-1.189.016-.17.016-.34.03-.508a2.648 2.648 0 00-1.095-.277c.314-.15.75-.15 1.035-.332l.016-.193c-.496-.03-.69-.254-1.021-.436zm7.454 2.935a17.78 17.78 0 00.465-1.752c.06-.287.215-.918.178-1.176-.059-.459-.684-.799-1.004-1.086-.584-.525-.95-.975-1.56-1.469-.249.375-.78.615-.983.914 1.447-.689 1.71 2.625 1.141 3.69.09.329.391.45.514.735l-.086.166h1.29c.013 0 .03 0 .044.014zm-6.634-.012c-.05-.074-.1-.135-.15-.209l-.301.195h.45zm2.77 0c.008-.209.018-.404.03-.598-.53.029-.825-.48-1.196-.527-.324-.045-.6.361-1.02.195-.095.105-.183.227-.284.316.154.18.295.375.424.584h.815c.014-.164.135-.285.3-.285.165 0 .284.121.284.27h.66zm2.116 0c-.314-.479-.947-.898-1.68-.555l-.03.541h1.71zm-8.51 0l-.104-.344c-.225-.72-.36-1.26-.405-1.68-.914-.436-1.875-.87-2.654-1.426-.15-.105-1.109-1.35-1.23-1.305-1.739.676-3.359 1.86-4.814 2.984.256.557.48 1.141.69 1.74h8.505zm8.265-2.113c-.029-.512-.164-1.56-.48-1.74-.66-.39-1.846.78-2.34.943.045.15.135.271.15.48.285-.074.645-.029.898.092-.299.03-.629.03-.824.164-.074.195.016.48-.029.764.69.197 1.5.303 2.385.332.164-.227.225-.645.211-1.082zm-4.08-.36c-.044.375.046.51.12.943 1.26.391 1.034-1.74-.135-.959zM8.76 19.5c-.45.457 1.27 1.082 1.814 1.115 0-.29.165-.564.135-.77-.65-.118-1.502-.042-1.945-.347zm5.565.215c0 .043-.061.03-.068.064.58.451 1.014.545 1.802.51.354-.262.67-.563 1.043-.807-.855.074-1.931.607-2.774.23zm3.42-17.726c-1.606-.906-4.35-1.591-6.076-.731-1.38.692-3.27 1.84-3.899 3.292.6 1.402-.166 2.686-.226 4.109-.018.757.36 1.42.391 2.242-.2.338-.825.38-1.26.356-.146-.729-.4-1.549-1.155-1.63-1.064-.116-1.845.764-1.89 1.683-.06 1.08.833 2.864 2.085 2.745.488-.046.608-.54 1.139-.54.285.57-.445.75-.523 1.154-.016.105.06.511.104.705.233.944.744 2.16 1.245 2.88.635.9 1.884 1.051 3.229 1.141.24-.525 1.125-.48 1.706-.346-.691-.27-1.336-.945-1.875-1.529-.615-.676-1.23-1.41-1.261-2.28 1.155 1.604 2.1 3 4.2 3.704 1.59.525 3.45-.254 4.664-1.109.51-.359.811-.93 1.17-1.439 1.35-1.936 1.98-4.71 1.846-7.394-.06-1.111-.06-2.221-.436-2.955-.389-.781-1.695-1.471-2.475-.781-.15-.764.63-1.23 1.545-.96-.66-.854-1.336-1.858-2.266-2.384zM13.58 14.896c.615 1.544 2.724 1.363 4.505 1.323-.084.194-.256.435-.465.515-.57.232-2.145.408-2.937-.012-.506-.27-.824-.873-1.102-1.227-.137-.172-.795-.608-.012-.609zm.164-.87c.893.464 2.52.517 3.731.48.066.267.066.593.068.913-1.55.08-3.386-.304-3.794-1.395h-.005zm6.675-.586c-.473.9-1.145 1.897-2.539 1.928-.023-.284-.045-.735 0-.904 1.064-.103 1.727-.646 2.543-1.017zm-.649-.667c-1.02.66-2.154 1.375-3.824 1.21-.351-.31-.485-1-.14-1.458.181.313.06.885.57.97.944.165 2.038-.579 2.73-.84.42-.713-.046-.976-.42-1.433-.782-.93-1.83-2.1-1.802-3.51.314-.224.346.346.391.45.404.96 1.424 2.175 2.174 3 .18.21.48.39.51.524.092.39-.254.854-.209 1.11zm-13.439-.675c-.314-.184-.393-.99-.768-1.01-.535-.03-.438 1.05-.436 1.68-.37-.33-.435-1.365-.164-1.89-.308-.15-.445.164-.618.284.22-1.59 2.34-.734 1.99.96zM4.713 5.995c-.685.756-.54 2.174-.459 3.188 1.244-.785 2.898.06 2.883 1.394.595-.016.223-.744.115-1.215-.353-1.528.592-3.187.041-4.59-1.064.084-1.939.52-2.578 1.215zm9.12 1.113c.307.562.404 1.148.84 1.57.195.19.574.424.387.95-.045.121-.365.391-.551.45-.674.195-2.254.03-1.721-.81.563.015 1.314.36 1.732-.045-.314-.524-.885-1.53-.674-2.13zm6.198-.013h.068c.33.668.6 1.375 1.004 1.965-.27.628-2.053 1.19-2.023.057.39-.17 1.05-.035 1.395-.25-.193-.556-.48-1.006-.434-1.771zm-6.927-1.617c-1.422-.33-2.131.592-2.56 1.553-.384-.094-.231-.615-.135-.883.255-.701 1.28-1.633 2.119-1.506.359.057.848.386.576.834zM9.642 1.593c-1.56.44-3.56 1.574-4.2 2.974.495-.07.84-.321 1.33-.351.186-.016.428.074.641.015.424-.104.78-1.065 1.102-1.41.31-.345.685-.496.94-.81.167-.09.409-.074.42-.33-.073-.075-.15-.135-.232-.105v.017z\"/\u003e\u003c/svg\u003e\n\n\n\u003csvg role=\"img\" viewBox=\"0 0 24 24\" height=\"32\" width=\"32\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\u003ctitle\u003eTerraform\u003c/title\u003e\u003cpath d=\"M8.283 4.265l7.433 3.776v7.551l-7.433-3.776V4.265zm8.248 3.776v7.551l7.436-3.776V4.265l-7.436 3.776zM.035.051v7.551l7.433 3.776V3.827L.035.051zm8.248 20.141l7.433 3.776V16.42l-7.433-3.776v7.548z\"/\u003e\u003c/svg\u003e\n\n\n\u003csvg role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\u003e\u003ctitle\u003epython\u003c/title\u003e\u003cpath d=\"M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z\"/\u003e\u003c/svg\u003e\n\n\n\u003csvg role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \u003e\u003ctitle\u003eJava\u003c/title\u003e\u003cpath d=\"M8.851 18.56s-.917.534.653.714c1.902.218 2.874.187 4.969-.211 0 0 .552.346 1.321.646-4.699 2.013-10.633-.118-6.943-1.149M8.276 15.933s-1.028.761.542.924c2.032.209 3.636.227 6.413-.308 0 0 .384.389.987.602-5.679 1.661-12.007.13-7.942-1.218M13.116 11.475c1.158 1.333-.304 2.533-.304 2.533s2.939-1.518 1.589-3.418c-1.261-1.772-2.228-2.652 3.007-5.688 0-.001-8.216 2.051-4.292 6.573M19.33 20.504s.679.559-.747.991c-2.712.822-11.288 1.069-13.669.033-.856-.373.75-.89 1.254-.998.527-.114.828-.093.828-.093-.953-.671-6.156 1.317-2.643 1.887 9.58 1.553 17.462-.7 14.977-1.82M9.292 13.21s-4.362 1.036-1.544 1.412c1.189.159 3.561.123 5.77-.062 1.806-.152 3.618-.477 3.618-.477s-.637.272-1.098.587c-4.429 1.165-12.986.623-10.522-.568 2.082-1.006 3.776-.892 3.776-.892M17.116 17.584c4.503-2.34 2.421-4.589.968-4.285-.355.074-.515.138-.515.138s.132-.207.385-.297c2.875-1.011 5.086 2.981-.928 4.562 0-.001.07-.062.09-.118M14.401 0s2.494 2.494-2.365 6.33c-3.896 3.077-.888 4.832-.001 6.836-2.274-2.053-3.943-3.858-2.824-5.539 1.644-2.469 6.197-3.665 5.19-7.627M9.734 23.924c4.322.277 10.959-.153 11.116-2.198 0 0-.302.775-3.572 1.391-3.688.694-8.239.613-10.937.168 0-.001.553.457 3.393.639\"/\u003e\u003c/svg\u003e\n\n\n\n\u003csvg role=\"img\" viewBox=\"0 0 6800 6800\" height=\"32\" width=\"32\" fill=\"currentColor\" stroke=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n\u003ctitle\u003eTerragrunt\u003c/title\u003e\n\u003cg transform=\"rotate(180, 3700, 3700)\"\u003e\n\u003cpath d=\"M3770 7309 c-1109 -77 -2105 -706 -2659 -1679 -307 -540 -461 -1202\n-422 -1815 7 -101 21 -239 31 -307 109 -710 434 -1353 937 -1854 1119 -1116\n2857 -1289 4176 -417 780 515 1304 1338 1447 2271 125 811 -70 1668 -534 2352\n-663 977 -1801 1531 -2976 1449z m404 -715 c75 -6 93 -10 113 -30 13 -13 23\n-34 23 -47 0 -19 15 -31 85 -67 225 -113 382 -355 412 -632 5 -49 9 -57 29\n-62 31 -8 58 -50 52 -81 -4 -20 5 -34 53 -75 33 -28 59 -56 59 -61 0 -5 -16\n-9 -36 -9 l-36 0 70 -74 c85 -92 183 -233 228 -330 45 -98 80 -237 105 -420\nl22 -151 67 -125 c169 -314 260 -557 260 -694 -1 -144 -71 -305 -181 -415 -65\n-65 -69 -71 -69 -115 0 -122 -67 -624 -89 -664 -5 -8 -19 5 -44 40 l-37 53 0\n-65 c0 -139 -44 -494 -69 -561 -6 -18 -8 -18 -41 6 -32 24 -35 24 -42 8 -4\n-10 -21 -107 -38 -217 -18 -109 -40 -218 -51 -242 -28 -66 -104 -137 -175\n-164 -144 -54 -315 10 -387 145 -11 22 -44 130 -73 240 -44 173 -54 200 -70\n199 -10 -1 -59 -9 -108 -18 -112 -20 -190 -20 -302 0 -49 9 -98 17 -108 18\n-17 1 -26 -23 -67 -184 -63 -241 -73 -265 -134 -326 -119 -119 -302 -125 -428\n-13 -73 64 -93 116 -127 344 -17 110 -34 208 -38 218 -7 16 -10 16 -42 -8 -25\n-19 -36 -22 -41 -13 -23 42 -68 404 -69 552 l0 80 -39 -53 c-22 -29 -41 -48\n-44 -44 -15 25 -64 363 -83 573 l-7 75 -79 59 c-234 173 -330 434 -249 676 48\n142 164 350 323 577 54 78 58 88 73 180 42 264 128 462 299 688 33 44 78 99\n100 123 l39 42 -42 0 c-22 0 -41 2 -41 5 0 8 65 65 115 100 39 28 41 33 29 50\n-18 24 -19 135 -1 158 6 10 24 21 40 25 24 6 31 19 65 118 51 149 107 241 206\n340 88 87 191 147 306 180 43 12 60 21 60 34 0 17 34 53 60 63 8 3 35 4 60 2\n25 -3 85 -7 134 -11z\"/\u003e\n\u003cpath d=\"M4250 5986 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21\n13z\"/\u003e\n\u003cpath d=\"M3759 5893 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z\"/\u003e\n\u003cpath d=\"M3705 5605 c18 -126 73 -217 164 -272 181 -108 405 -39 492 153 36\n79 38 105 3 44 -14 -25 -44 -64 -67 -87 -23 -24 -37 -43 -33 -43 5 0 3 -7 -4\n-15 -7 -8 -17 -15 -23 -15 -6 0 -2 7 9 15 28 21 13 18 -50 -11 -76 -35 -156\n-41 -231 -19 -33 9 -68 23 -79 31 -28 19 -41 18 -25 -3 13 -16 12 -17 -3 -4\n-10 7 -16 17 -13 21 2 3 -14 24 -36 46 -43 41 -73 92 -96 159 l-13 40 5 -40z\nm85 -160 c42 -48 42 -48 6 -15 -21 19 -42 44 -48 55 -6 11 -9 18 -6 15 2 -3\n24 -27 48 -55z m550 12 c0 -2 -15 -16 -32 -33 l-33 -29 29 33 c28 30 36 37 36\n29z m-410 -107 c8 -5 11 -10 5 -10 -5 0 -17 5 -25 10 -8 5 -10 10 -5 10 6 0\n17 -5 25 -10z m270 0 c-8 -5 -19 -10 -25 -10 -5 0 -3 5 5 10 8 5 20 10 25 10\n6 0 3 -5 -5 -10z\"/\u003e\n\u003cpath d=\"M3310 5586 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21\n13z\"/\u003e\n\u003cpath d=\"M4715 5430 c-66 -66 -117 -120 -115 -120 3 0 59 54 125 120 66 66\n117 120 115 120 -3 0 -59 -54 -125 -120z\"/\u003e\n\u003cpath d=\"M3430 5425 c13 -14 26 -25 28 -25 3 0 -5 11 -18 25 -13 14 -26 25\n-28 25 -3 0 5 -11 18 -25z\"/\u003e\n\u003cpath d=\"M3510 5345 c13 -14 26 -25 28 -25 3 0 -5 11 -18 25 -13 14 -26 25\n-28 25 -3 0 5 -11 18 -25z\"/\u003e\n\u003cpath d=\"M4569 5293 c-13 -16 -12 -17 4 -4 16 13 21 21 13 21 -2 0 -10 -8 -17\n-17z\"/\u003e\n\u003cpath d=\"M3404 4985 c-12 -8 -27 -28 -34 -45 -16 -39 1 -85 41 -105 40 -21 63\n-19 98 11 83 70 -17 201 -105 139z\"/\u003e\n\u003cpath d=\"M4607 4989 c-11 -6 -25 -27 -33 -45 -13 -31 -13 -39 1 -68 28 -59 85\n-71 134 -30 62 52 28 154 -51 154 -18 0 -41 -5 -51 -11z\"/\u003e\n\u003cpath d=\"M3348 4629 c-32 -18 -22 -56 25 -90 63 -46 222 -123 313 -152 268\n-85 564 -81 816 9 91 33 230 102 286 143 47 35 56 73 22 91 -17 9 -36 2 -117\n-44 -278 -159 -545 -207 -839 -151 -138 26 -322 102 -431 176 -46 32 -50 33\n-75 18z\"/\u003e\n\u003c/g\u003e\n\u003c/svg\u003e\n\u003c/p\u003e","title":""},{"content":" Jose Castrillo 📱 Phone: +xxxxxxxx ✉️ Email: jose@castrillo.addy.io 🌍 Location: Barcelona, Spain. Title: Cloud Development Operations Public Cloud: AWS Started: Nov 2024 - Currently Company: Aubay\nAs part of the DevOps team, I specialize in designing, maintaining, and automating AWS infrastructure using Terraform and Terragrunt, following Infrastructure as Code (IaC) principles. I support project teams by implementing infrastructure changes, deploying new environments, and ensuring stability, security, cost-efficiency, and compliance. Additionally, I contribute to the design and implementation of GitLab CI/CD pipelines tailored to project requirements, fostering collaboration and continuous improvement across cloud deployments.\nDocker AWS Linux❤️ GNU Bash Visual Studio Code Ansible Jenkins Terraform python Java Terragrunt Duties:\nProvide cloud expertise to the organization to update how deploy and provide new services. Manage different AWS environments by using Terragrunt to define configurations and manage variables for different stages (development, staging, production). Implement CI/CD in project (Gitlab Runners). Design and develop a continuous deployment pipeline. Title: Senior Cloud Solutions Engineer Public Cloud: AWS Started: Feb 2024 - Nov 2024 Company: Clorian\nAs a DevOps engineer, I modernize and optimize infrastructure using Terraform, streamline delivery and deployment with CI/CD pipelines on GitHub and Jenkins, and enhance scalability, reliability, and security. I focus on automation and continuous improvement to drive efficiency and agility, enabling teams to deliver high-quality software quickly.\nDocker AWS Linux❤️ GNU Bash Visual Studio Code Ansible Jenkins Terraform python Java npm Spring-Boot JavaScript Duties:\nProvide cloud expertise to the organization to update how deploy and provide new services. Re-write infrastructure under IaaC principles by using Terraform. Implement CI/CD in project (Github Actions). Design and develop a continuous deployment pipeline. Title: Cloud Solutions Engineer Public Cloud: AWS \u0026amp; Azure Started: Oct 2022 - Feb 2024 Company: Festo\nDevelop and maintain CI/CD pipelines for automating software delivery, testing, and deployment. Manage and automate cloud infrastructure to enhance efficiency and reduce costs, including monitoring, maintenance, governance, and troubleshooting. Collaborate with cross-functional teams to align cloud systems with business needs.\nDocker AWS Linux❤️ GNU Bash Visual Studio Code Ansible Kubernetes Grafana GitLab Terraform Azure python Java npm Spring-Boot JavaScript Duties:\nEnhance data security, manage risk, and enable the smooth operation of cloud systems. Provide cloud expertise to other teams within the organization, including developers, architects, and business teams. Provisioning new cloud services and make them ready for network operation. Implement CI/CD in projects (GitLabCI). Ensure team collaboration using Jira, Confluence and other tools. Design and develop a continuous deployment pipeline. Title: SRE T2 (level 2) Public Cloud: AWS Started: Apr 2021 - Oct 2022 Company: NTT\nResponsibility for system maintenance, incident management, automation, and monitoring.\nDocker AWS Prometheus Linux❤️ GNU Bash Visual Studio Code Ansible Kubernetes Grafana GitLab Terraform Duties:\nMaintenance patching with customizing managed node groups. Detect and correct configuration drift by Terraform. Member of the administrator EKS team responsible of objects, recources and RBAC. Gitops practice to version control IaC. Provisioning new cloud services and make them ready for network operation. Feed infrastructure with new resource developed on Terraform. Manage images by Packer in order to scheduling patching. Title: Ops Engineer Started: Feb 2021 - Apr 2021 · 3 mos Company: NTT\nMonitoring, detect and prevent incidents, execute standards patching scheduled under time windows for different customers, follows standards RB \u0026amp; SOPs in order to mitigate unresponsive customer services, edit and create new sessions at Bitbucket for GNU/Linux and Windows instances for the organization.\nLinux❤️ Windows in production, why? Docker GitHub Git icon GNU Bash Something called PowerShell Duties:\nAddressing complex issue to higher teams. First tier to diagnostic and troubleshooting issues. Basics cleaner and maintenance scripts for Windows and GNU/Linux hosts. Patching and scheduled changes for Windows and GNU/Linux hosts. Operator at monitoring tools LogicMonitor and OP5. Tier 0 \u0026amp; 1 incidents. Title: FSE Started: Apr 2019 - Nov 2020 · 1 yr 8 mos Company: Excem Technology\nInterception, analysis, retention and data collection from different telecommunication providers under ETSI protocol, whether open or closer breach communications, keeping services up and running for 24/7 service.\nLinux❤️ Windows in production, why? Yammer? ok fine. Red Hat MSQL Server PostgreSQL GNU Bash NetApp Notepad++ icon Fortinet Duties:\nScrapping framework control and flow analysis. Logs automation scripts by Python. Services running in Linux(RH,Ubuntu) \u0026amp; Windows 2003/2008/2012. Administrator of DB RH6 Sysbase. Testing of radio frequency antenna under private systems (omni/directional). Package analysis by Wireshark. Queries DML DLL (Postgres \u0026amp; MSQL). ETSI communications system. Tier 1 \u0026amp; 2 incidents. Title: Cloud Solutions Engineer Public Cloud: GCP Started: Nov 2018 - Mar 2019 · 5 mos Company: WebHelp\nAs a member of the Infrastructure Team, we manage the customer infrastructure on GCP; incident management on AMI, ssh connections (troubleshooting), configurations and good practices, explanation to clients for deployment in GCE and GKE, IAM management, project migrations inside and outside organization, issues tracking, QA protocols, troubleshooting cluster kubernetes, Stackdriver monitor installation, monitoring and permissions.\nKubernetes Docker Google Cloud Salesforce Stack Overflow icon Prometheus Linux❤️ GNU Bash Atom Duties:\nTroubleshooting and issues analysis in GKE. Upgrading pods, push/pull images, Stackdriver integration in GKE. HD and RAM expansion, VM error query in GCE deployment. Migration of projects outside and inside organizations. Best practices of SSH auth within instances (GCE). User account management in IAM roles in GCP. Basic troubleshooting in Linux systems (Debian,RH7,Centos7,Alpine). Title: Database Administrator Started: Jan 2018 - Oct 2018 · 10 mos Company: Barcelona Judicial Academy\nConfiguration CISCO switches, (AP outputs), migrations and changes of queries in the DB SQL 2008, management of the AD-CD windows server, feeding internal wiki for maintenance and tasks, management of OS clone for end users.\nSomething called PowerShell MSQL Server .NET icon Cisco icon Windows in production, why? SQLite icon Fortinet Duties:\nManagement of MSQL and AD 2008, backups, DDL queries. Troubleshooting webapp developed in .NET with MSQL. Cisco switches maintenance. Administrator Microsoft DC/AD. System deployment (Clonezilla). Title: Technical Support Engineer Started: Apr 2016 - Dec 2017 · 1 yr 9 mos Company: Volotea\nSome of my duties were inventory of microcomputer equipments, devices installation and configuration for endusers (windows 7-10), installation of apps and permissions for staff from different departments, configuration of mobile phones (android-iphone), maintenance documentation wiki, case management by Jira, preventive maintenance of S/H, remote connections, installation permits VPN clients.\nJira Windows in production, why? OpenVPN Something called PowerShell Notepad++ icon Citrix 📜 Certificates\n💻 Courses Further information on Linkedin\n","permalink":"https://jose.castrillo.eu/allianztech/devops/","summary":"\u003clink href=\"https://fonts.googleapis.com/css?family=Inconsolata\" rel=\"stylesheet\" type=\"text/css\"\u003e\n\u003cdiv style=\"font-family:'Inconsolata';font-size:32px;font-style:normal;font-weight:lighter\"\u003e\nJose Castrillo\n\u003c/div\u003e\n\n\n\n\n\n\n\u003clink href=\"https://fonts.googleapis.com/css?family=Arial\" rel=\"stylesheet\" type=\"text/css\"\u003e\n\u003cdiv style=\"font-family:'Arial';font-size:14px;font-style:normal;font-weight:normal\"\u003e\n📱 Phone: +xxxxxxxx\n\u003c/div\u003e\n\n\n\n\n\n\n\u003clink href=\"https://fonts.googleapis.com/css?family=Arial\" rel=\"stylesheet\" type=\"text/css\"\u003e\n\u003cdiv style=\"font-family:'Arial';font-size:14px;font-style:normal;font-weight:normal\"\u003e\n✉️ Email: \u003ca href=\"mailto:jose@castrillo.addy.io\"\u003ejose@castrillo.addy.io\u003c/a\u003e\n\u003c/div\u003e\n\n\n\n\n\n\n\u003clink href=\"https://fonts.googleapis.com/css?family=Arial\" rel=\"stylesheet\" type=\"text/css\"\u003e\n\u003cdiv style=\"font-family:'Arial';font-size:14px;font-style:normal;font-weight:normal\"\u003e\n🌍 Location: Barcelona, Spain.\n\u003c/div\u003e\n\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTitle:\u003c/strong\u003e \u003ca href=\"https://www.payscale.com/research/US/Job=Senior_Development_Operations_%28DevOps%29_Engineer/Salary\"\u003eCloud Development Operations\u003c/a\u003e \u003cbr\u003e\n\u003cstrong\u003ePublic Cloud:\u003c/strong\u003e \u003ca href=\"https://aws.amazon.com/\"\u003eAWS\u003c/a\u003e \u003cbr\u003e\n\u003cstrong\u003eStarted:\u003c/strong\u003e Nov 2024 - \u003cem\u003eCurrently\u003c/em\u003e \u003cbr\u003e\n\u003cstrong\u003eCompany:\u003c/strong\u003e \u003ca href=\"aubay.com\"\u003eAubay\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAs part of the DevOps team, I specialize in designing, maintaining, and automating AWS infrastructure using Terraform and Terragrunt, following Infrastructure as Code (IaC) principles. I support project teams by implementing infrastructure changes, deploying new environments, and ensuring stability, security, cost-efficiency, and compliance. Additionally, I contribute to the design and implementation of GitLab CI/CD pipelines tailored to project requirements, fostering collaboration and continuous improvement across cloud deployments.\u003c/p\u003e","title":"Curriculum for Allianz Technology"},{"content":" Oh My Bash is a powerful framework for managing your Bash configuration. By default, it offers various themes to personalize your terminal. But what if you want your terminal to dynamically change its theme based on the environment or directory you\u0026rsquo;re working in? This post will guide you through a script that achieves just that.\nThe Script: Dynamic Theme Switching The following script dynamically updates the Oh My Bash theme based on your current environment and directory. Here\u0026rsquo;s the code:\nthemes_function() { local new_theme=\u0026#34;\u0026#34; case \u0026#34;$env:$PWD\u0026#34; in devbox:*) new_theme=\u0026#34;devbox\u0026#34; ;; *:/home/jose/gitlab/personal/*|*:/home/jose/gitlab/personal) new_theme=\u0026#34;jose\u0026#34; ;; *:/home/jose/gitlab/customer/*|*:/home/jose/gitlab/customer) new_theme=\u0026#34;customer\u0026#34; ;; *) new_theme=\u0026#34;bakkex\u0026#34; # Default theme ;; esac # Only change the theme if it\u0026#39;s different from the current theme if [[ \u0026#34;$new_theme\u0026#34; != \u0026#34;$CURRENT_OSH_THEME\u0026#34; ]]; then CURRENT_OSH_THEME=\u0026#34;$new_theme\u0026#34; export OSH_THEME=\u0026#34;$CURRENT_OSH_THEME\u0026#34; source \u0026#34;$OSH\u0026#34;/oh-my-bash.sh fi } # Add the function to PROMPT_COMMAND PROMPT_COMMAND=\u0026#34;themes_function; $PROMPT_COMMAND\u0026#34; How It Works Environment and Directory Matching:\nThe script uses a case statement to match combinations of the environment variable env and the current working directory (PWD). Depending on the match, it assigns a specific theme to the new_theme variable. Theme Switching:\nIf the selected theme is different from the current theme (CURRENT_OSH_THEME), the script updates the theme by: Setting the CURRENT_OSH_THEME and OSH_THEME variables. Re-sourcing the Oh My Bash script (oh-my-bash.sh) to apply the new theme. Automatic Execution:\nThe themes_function is added to the PROMPT_COMMAND variable, ensuring it runs every time the terminal prompt is displayed. Customizing the Script Environment Variable env: Ensure the env variable reflects your actual terminal environment. If it\u0026rsquo;s not set, you can modify the script to use another variable or remove it entirely.\nTheme Names: Replace devbox, jose, allianz, and bakkex with your preferred Oh My Bash themes. Make sure these themes are installed and available in your setup.\nDirectory Paths: Update the paths in the case statement to match the directories relevant to your workflow.\nApplying the Script Add the script to your .bashrc or .bash_profile file:\nnano ~/.bashrc Save the file and reload your shell configuration:\nsource ~/.bashrc Test the script by navigating to different directories and observing the theme changes.\nConclusion With this script, you can add a dynamic and context-aware touch to your terminal setup. Oh My Bash\u0026rsquo;s flexibility combined with Bash scripting allows for powerful customizations tailored to your needs. Happy coding!\n","permalink":"https://jose.castrillo.eu/post/ohmybash-git/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/ps1-terminal.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eOh My Bash is a powerful framework for managing your Bash configuration. By default, it offers various themes to personalize your terminal. But what if you want your terminal to dynamically change its theme based on the environment or directory you\u0026rsquo;re working in? This post will guide you through a script that achieves just that.\u003c/p\u003e\n\u003ch2 id=\"the-script-dynamic-theme-switching\"\u003eThe Script: Dynamic Theme Switching\u003c/h2\u003e\n\u003cp\u003eThe following script dynamically updates the Oh My Bash theme based on your current environment and directory. Here\u0026rsquo;s the code:\u003c/p\u003e","title":"🎨 Customize Your Terminal Shell with Oh My Bash"},{"content":" Using Oh-My-Bash with Jetify Devbox: A Step-by-Step Guide If you\u0026rsquo;re a developer working with Jetify Devbox, you might have noticed that its shell environment doesn\u0026rsquo;t always play nicely with Oh-My-Bash. By following these steps, you can customize and personalize your themes and PS1 prompt to create a more enjoyable and productive shell experience.\nStep 1: Install Oh-My-Bash First, you need to install Oh-My-Bash. You can do this by running the following command in your terminal:\nsh -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)\u0026#34; Step 2: Configure Your Shell Next, insert the following script into your ~/.bashrc file to set your preferred theme. You can replace \u0026quot;bakke\u0026quot; with any theme you like:\nif [ -z \u0026#34;$OSH_THEME\u0026#34; ]; then OSH_THEME=\u0026#34;bakke\u0026#34; # choose the theme you like source ~/.bashrc fi Step 3: Update Your Devbox Configuration Now, from your Devbox project, open the devbox.json file and add the shell initialization hook to ensure your theme and configurations are applied when you start a Devbox shell:\n{ \u0026#34;$schema\u0026#34;: \u0026#34;https://raw.githubusercontent.com/jetify-com/devbox/0.12.0/.schema/devbox.schema.json\u0026#34;, \u0026#34;packages\u0026#34;: [\u0026#34;wails@latest\u0026#34;], \u0026#34;shell\u0026#34;: { \u0026#34;init_hook\u0026#34;: [ \u0026#34;echo \u0026#39;Welcome to devbox!\u0026#39; \u0026gt; /dev/null\u0026#34;, \u0026#34;OSH_THEME=purity\u0026#34;, \u0026#34;source ~/.bashrc\u0026#34; ], \u0026#34;scripts\u0026#34;: { \u0026#34;test\u0026#34;: [\u0026#34;echo \\\u0026#34;Error: no test specified\\\u0026#34; \u0026amp;\u0026amp; exit 1\u0026#34;] } } } In this example, the OSH_THEME is set to \u0026quot;purity\u0026quot;, but you can choose any other theme you prefer.\nStep 4: Personalize Your PS1 Prompt To customize your PS1 prompt, edit the theme\u0026rsquo;s theme.sh file. For instance, if you are using the purity theme, the file path would be ~/.oh-my-bash/themes/purity/purity.theme.sh.\nOpen the file and edit the PS1 variable with your desired style. Here\u0026rsquo;s an example:\nPS1=\u0026#34;\\n📦${_omb_prompt_bold_purple} Devbox: ${_omb_prompt_navy}\\w $(scm_prompt_info)\\n${ret_status} \u0026#34; Save your changes after editing.\nStep 5: Apply Your Changes Finally, load your changes by sourcing your ~/.bashrc file:\nsource ~/.bashrc Result After completing these steps, your shell should look something like this when you enter a Devbox shell:\nfedora: ~/gitlab/coco |main ✓| → devbox shell Starting a devbox shell... 📦 Devbox: ~/gitlab/coco ( main ✓ ) ❯ exit exit fedora: ~/gitlab/coco |main ✓| → With these configurations, you can enjoy a customized and productive shell environment within Jetify Devbox using Oh-My-Bash. Happy coding!\n","permalink":"https://jose.castrillo.eu/post/bash-terminal-devbox/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/sw-sandbox.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003ch1 id=\"using-oh-my-bash-with-jetify-devbox-a-step-by-step-guide\"\u003eUsing Oh-My-Bash with Jetify Devbox: A Step-by-Step Guide\u003c/h1\u003e\n\u003cp\u003eIf you\u0026rsquo;re a developer working with Jetify Devbox, you might have noticed that its shell environment doesn\u0026rsquo;t always play nicely with Oh-My-Bash. By following these steps, you can customize and personalize your themes and PS1 prompt to create a more enjoyable and productive shell experience.\u003c/p\u003e\n\u003ch2 id=\"step-1-install-oh-my-bash\"\u003eStep 1: Install Oh-My-Bash\u003c/h2\u003e\n\u003cp\u003eFirst, you need to install Oh-My-Bash. You can do this by running the following command in your terminal:\u003c/p\u003e","title":"👨‍💻 Tunning your Devbox shell"},{"content":" I\u0026rsquo;ve been thinking to upgrade my Nextcloud service also switching to another alternative rather than docker, hence I used podman and buildah in my solution.\nFrom the rockylinux.org I found a nice post where it describes how to build and provisioning by using buildah and podman, it works pretty good and I added a tool in order to run it faster, called taskfile.\nRequirements:\nPodman Buildah Taskfile Install taskfile Clone my project From the project you can see the task defined: version: \u0026#34;3\u0026#34; tasks: up-db: dir: \u0026#34;db/mariadb\u0026#34; preconditions: - test -f db-init.sh cmds: - bash db-init.sh create-app: dir: \u0026#34;app\u0026#34; preconditions: - test -f run.sh cmds: - mkdir nc nc/nextcloud nc/apps nc/config nc/data - task: up-db - bash run.sh build_base: dir: \u0026#34;db/base\u0026#34; preconditions: - test -f build.sh cmds: - bash build.sh build_tools: dir: \u0026#34;db/db-tools\u0026#34; preconditions: - test -f build.sh cmds: - bash build.sh build_maria: dir: \u0026#34;db/mariadb\u0026#34; preconditions: - test -f build.sh cmds: - bash build.sh build_db: cmds: - task: build_base - task: build_tools - task: build_maria up-app: cmds: - podman container start nextcloud Main task to build and run nextcloud:\ntask build_db # build the DB container task create-app # run both DB and nextcloud application ","permalink":"https://jose.castrillo.eu/post/nextcloud-buildah/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/nextcloud-buildah.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been thinking to upgrade my Nextcloud service also switching to another alternative rather than docker, hence I used podman and buildah in my solution.\u003c/p\u003e\n\u003cp\u003eFrom the rockylinux.org I found a nice \u003ca href=\"https://docs.rockylinux.org/guides/containers/podman-nextcloud/\"\u003epost\u003c/a\u003e where it describes how to build and provisioning by using buildah and podman, it works pretty good and I added a tool in order to run it faster, called \u003ca href=\"https://taskfile.dev/installation/\"\u003etaskfile\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRequirements:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePodman\u003c/li\u003e\n\u003cli\u003eBuildah\u003c/li\u003e\n\u003cli\u003eTaskfile\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003eInstall \u003ca href=\"https://taskfile.dev/installation/\"\u003etaskfile\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eClone my \u003ca href=\"https://gitlab.com/castrillo/jupiter\"\u003eproject\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFrom the project you can see the task defined:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;3\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eup-db\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;db/mariadb\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epreconditions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -f db-init.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ebash db-init.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ecreate-app\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;app\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epreconditions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -f run.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003emkdir nc nc/nextcloud nc/apps nc/config nc/data\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eup-db\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ebash run.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild_base\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;db/base\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epreconditions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -f build.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ebash build.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild_tools\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;db/db-tools\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epreconditions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -f build.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ebash build.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild_maria\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edir\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;db/mariadb\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epreconditions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003etest -f build.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003ebash build.sh\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ebuild_db\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild_base\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild_tools\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"nt\"\u003etask\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ebuild_maria\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eup-app\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecmds\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003epodman container start nextcloud\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMain task to build and run nextcloud:\u003c/p\u003e","title":"Automation a Nextcloud as a Podman Container"},{"content":"In this guide, we\u0026rsquo;ll walk through how to create CORS (Cross-Origin Resource Sharing) and a health check endpoint in a Golang application using the Chi router.\nSetting Up Chi and CORS Middleware We\u0026rsquo;ll use the go-chi/chi and go-chi/cors packages to handle routing and CORS in our application.\nStep 1: Import Required Packages First, make sure to import the necessary packages:\nimport ( \u0026#34;fmt\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;log\u0026#34; \u0026#34;github.com/go-chi/chi\u0026#34; \u0026#34;github.com/go-chi/chi/middleware\u0026#34; \u0026#34;github.com/go-chi/cors\u0026#34; AdminMiddleware \u0026#34;github.com/project/api/middleware\u0026#34; \u0026#34;github.com/project/api/services\u0026#34; \u0026#34;gorm.io/gorm\u0026#34; ) Step 2: Define the CORS AllowOriginFunc We\u0026rsquo;ll define a function to specify the allowed origins for CORS. This function also logs disallowed origins:\nfunc AllowOriginFunc(r *http.Request, origin string) bool { allowedOrigins := []string{\u0026#34;http://localhost\u0026#34;, \u0026#34;https://admin-micro-qa.clorian.com\u0026#34;} for _, o := range allowedOrigins { if origin == o { return true } } // Get the client\u0026#39;s IP address clientIP := r.RemoteAddr // Print the log in red color red := \u0026#34;\\033[31m\u0026#34; reset := \u0026#34;\\033[0m\u0026#34; log.Printf(\u0026#34;%sDisallowed origin: %s, Client IP: %s%s\u0026#34;, red, origin, clientIP, reset) return false } In this function:\nallowedOrigins: This slice contains the origins that are permitted to access the resources. Loop through allowed origins: The function checks if the request origin is in the list of allowed origins. Logging disallowed origins: If the origin is not allowed, the function logs this event using log.Printf. Explanation of log.Printf log.Printf is a function from the Go log package that formats according to a format specifier and writes to the standard logger.\nIn this code:\nred and reset are ANSI escape codes for coloring the output in the terminal. \\033[31m sets the text color to red, and \\033[0m resets it to the default color. log.Printf prints a formatted string that includes the disallowed origin and the client\u0026rsquo;s IP address in red color to emphasize that it is a disallowed request. The formatted string includes placeholders (%s) which are replaced by the specified variables (origin and clientIP). Step 3: Initialize the Router Now we initialize the router, configure middleware, and set up CORS:\nfunc Init(db *gorm.DB) *chi.Mux { r := chi.NewRouter() r.Use(middleware.Logger) sm := services.NewServiceManager(db) r.Use(cors.Handler(cors.Options{ AllowOriginFunc: AllowOriginFunc, AllowedMethods: []string{\u0026#34;GET\u0026#34;, \u0026#34;POST\u0026#34;, \u0026#34;PUT\u0026#34;, \u0026#34;DELETE\u0026#34;, \u0026#34;OPTIONS\u0026#34;}, AllowedHeaders: []string{\u0026#34;Accept\u0026#34;, \u0026#34;Authorization\u0026#34;, \u0026#34;Content-Type\u0026#34;, \u0026#34;X-CSRF-Token\u0026#34;}, ExposedHeaders: []string{\u0026#34;Link\u0026#34;}, AllowCredentials: true, MaxAge: 300, })) r.HandleFunc(\u0026#34;/health\u0026#34;, func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, \u0026#34;Hello, Go!\u0026#34;) }) return r } Setting Up the Health Check Endpoint The health check endpoint is a simple route that responds with a message indicating the service is running:\nr.HandleFunc(\u0026#34;/health\u0026#34;, func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, \u0026#34;Hello, Go!\u0026#34;) }) Putting It All Together Here\u0026rsquo;s the complete code:\nimport ( \u0026#34;fmt\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;log\u0026#34; \u0026#34;github.com/go-chi/chi\u0026#34; \u0026#34;github.com/go-chi/chi/middleware\u0026#34; \u0026#34;github.com/go-chi/cors\u0026#34; AdminMiddleware \u0026#34;github.com/project/api/middleware\u0026#34; \u0026#34;github.com/project/api/services\u0026#34; \u0026#34;gorm.io/gorm\u0026#34; ) func AllowOriginFunc(r *http.Request, origin string) bool { allowedOrigins := []string{\u0026#34;http://localhost\u0026#34;, \u0026#34;https://admin-micro-qa.clorian.com\u0026#34;} for _, o := range allowedOrigins { if origin == o { return true } } clientIP := r.RemoteAddr red := \u0026#34;\\033[31m\u0026#34; reset := \u0026#34;\\033[0m\u0026#34; log.Printf(\u0026#34;%sDisallowed origin: %s, Client IP: %s%s\u0026#34;, red, origin, clientIP, reset) return false } func Init(db *gorm.DB) *chi.Mux { r := chi.NewRouter() r.Use(middleware.Logger) sm := services.NewServiceManager(db) r.Use(cors.Handler(cors.Options{ AllowOriginFunc: AllowOriginFunc, AllowedMethods: []string{\u0026#34;GET\u0026#34;, \u0026#34;POST\u0026#34;, \u0026#34;PUT\u0026#34;, \u0026#34;DELETE\u0026#34;, \u0026#34;OPTIONS\u0026#34;}, AllowedHeaders: []string{\u0026#34;Accept\u0026#34;, \u0026#34;Authorization\u0026#34;, \u0026#34;Content-Type\u0026#34;, \u0026#34;X-CSRF-Token\u0026#34;}, ExposedHeaders: []string{\u0026#34;Link\u0026#34;}, AllowCredentials: true, MaxAge: 300, })) r.HandleFunc(\u0026#34;/health\u0026#34;, func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, \u0026#34;Hello, Go!\u0026#34;) }) return r } This setup ensures your Go application can handle cross-origin requests securely and provides a health check endpoint to monitor the application\u0026rsquo;s status.\n","permalink":"https://jose.castrillo.eu/post/go-cors-chi/","summary":"\u003cp\u003eIn this guide, we\u0026rsquo;ll walk through how to create CORS (Cross-Origin Resource Sharing) and a health check endpoint in a Golang application using the Chi router.\u003c/p\u003e\n\u003ch3 id=\"setting-up-chi-and-cors-middleware\"\u003eSetting Up Chi and CORS Middleware\u003c/h3\u003e\n\u003cp\u003eWe\u0026rsquo;ll use the \u003ccode\u003ego-chi/chi\u003c/code\u003e and \u003ccode\u003ego-chi/cors\u003c/code\u003e packages to handle routing and CORS in our application.\u003c/p\u003e\n\u003ch4 id=\"step-1-import-required-packages\"\u003eStep 1: Import Required Packages\u003c/h4\u003e\n\u003cp\u003eFirst, make sure to import the necessary packages:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;log\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/go-chi/chi\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/go-chi/chi/middleware\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/go-chi/cors\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eAdminMiddleware\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/project/api/middleware\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/project/api/services\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/gorm\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"step-2-define-the-cors-alloworiginfunc\"\u003eStep 2: Define the CORS AllowOriginFunc\u003c/h4\u003e\n\u003cp\u003eWe\u0026rsquo;ll define a function to specify the allowed origins for CORS. This function also logs disallowed origins:\u003c/p\u003e","title":"Goland CORS, logs and healtcheck"},{"content":"Working on different platform either to update, patch, etc need to be notificate for those people that consume that services, it shouldn\u0026rsquo;t change if that service it\u0026rsquo;s internal, you must notificate your teams about it.\nWhen you\u0026rsquo;re into your maintenance window you can use a faster way to broadcast everyone you\u0026rsquo;re working on it; I use this simple solution when I was working into a Jenkins migration, hence I stop the jenkins service and instead of 500 html error I developed a simple html text exposing it by a nginx container by the root path.\nrequirement:\nPodman/Docker GNU/Linux OS. NOTE: I created all the files into jenkins folder by using jenkins user\nsudo usermod -s /bin/bash jenkins usermod -aG docker jenkins create the following script: #!/bin/bash CONTAINER=$(docker container ls -a --format \u0026#34;{{.Names}}\u0026#34; | grep -o nginx-page) RUNNING=$(docker ps --format \u0026#34;{{.Names}}\u0026#34; | grep -o nginx-page) if [ \u0026#34;$CONTAINER\u0026#34; == \u0026#34;nginx-page\u0026#34; ]; then if [ \u0026#34;$RUNNING\u0026#34; == \u0026#34;nginx-page\u0026#34; ]; then docker stop nginx-page echo \u0026#34;Stopped nginx-page container\u0026#34; else docker start nginx-page echo \u0026#34;Started nginx-page container\u0026#34; fi elif [ -z \u0026#34;$CONTAINER\u0026#34; ]; then docker run --name nginx-page -v /var/lib/jenkins/html:/usr/share/nginx/html -d -p 8080:80 nginx:alpine echo \u0026#34;Container created and running\u0026#34; fi create your html file: \u0026lt;!doctype html\u0026gt; \u0026lt;title\u0026gt;Site Maintenance\u0026lt;/title\u0026gt; \u0026lt;style\u0026gt; body { text-align: center; padding: 150px; } h1 { font-size: 50px; } body { font: 20px Helvetica, sans-serif; color: #333; } article { display: block; text-align: left; width: 650px; margin: 0 auto; } a { color: #dc8100; text-decoration: none; } a:hover { color: #333; text-decoration: none; } \u0026lt;/style\u0026gt; \u0026lt;article\u0026gt; \u0026lt;svg here you can paste the content of your .svg \u0026lt;/svg\u0026gt; \u0026lt;h1\u0026gt;We\u0026amp;rsquo;ll be back soon!\u0026lt;/h1\u0026gt; \u0026lt;div\u0026gt; \u0026lt;p\u0026gt;Sorry for the inconvenience but we\u0026amp;rsquo;re performing some maintenance at the moment. If you need to you can always \u0026lt;a href=\u0026#34;mailto:email@email.com\u0026#34;\u0026gt;contact us\u0026lt;/a\u0026gt;, otherwise we\u0026amp;rsquo;ll be back online shortly!\u0026lt;/p\u0026gt; \u0026lt;p\u0026gt;\u0026amp;mdash; Devops Team\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/article\u0026gt; run the above script use either podman/docker container manager chmod +x script.sh ./script.sh The script works like a switch, it will start or stop the container any time you issue it. Hope this can be useful.\n","permalink":"https://jose.castrillo.eu/post/maintenance-page/","summary":"\u003cp\u003eWorking on different platform either to update, patch, etc need to be notificate for those people that consume that services, it shouldn\u0026rsquo;t change if that service it\u0026rsquo;s internal, you must notificate your teams about it.\u003c/p\u003e\n\u003cp\u003eWhen you\u0026rsquo;re into your maintenance window you can use a faster way to broadcast everyone you\u0026rsquo;re working on it; I use this simple solution when I was working into a Jenkins migration, hence I stop the jenkins service and instead of 500 html error I developed a simple html text exposing it by a nginx container by the root path.\u003c/p\u003e","title":"Faster and simple maintenance page"},{"content":"📣 Actualizado 02/2024 Continuando con mi post anterior explico como realizar una conexion directa con tu propio router, en mi caso tengo un router gl.inet; puedes usar otro router que disponga la configuración de VLAN.\nDependiendo de tu proveedor de servicio, necesitamos ir a la siguiente pagina y busca tu VLAN, Leer con atencion las notas dejadas en la pagina!. En mi caso tengo Orange aunque a en mi zona llega por NEBA.\nEl cable de ethernet del ONT de tu proveedor lo conectas en la entrada de WAN del router.\nIngresa al dashboard generalmente es la IP 192.168.1.1 o con la IP que le has asignado, sino puedes buscar en el manual del fabricante. En el caso de usar router gl.inet, nos vamos a configuraciones avanzadas en el modo luci \u0026ldquo;advanced settings\u0026rdquo;.\nDentro de Luci nos vamos a Network - Interfaces - Devices y creamos un nuevo \u0026ldquo;device\u0026rdquo;.\ndevice type - VLAN 802.1q base device - eth0 VLAN id - VLAN MAC Addr - La MAC del router del proveedor. Guardar, despues va a crear una nueva interfaz eth0.xx(numero de tu vlan) En Interfaces encontraras la nueva interfaz eth0.xx, abre en Edit y cambia el Protocolo a DHCP client.\nReinicia el router, y ya deberias tener acceso a internet.\nNOTA: Para usuarios gl.inet los pasos descritos se realizo por que anteriormente no tenia el nuevo upgrade de OpenWrt, ahora con la nueva versión podríamos abrir la conexión de forma mas sencilla desde el dashboard principal como se muestra en la imagen a continuación.\n⚠️ Si usas la configuracion desde el dashboard recuerda cambiar el MAC del router en Network - MAC Adress por el mismo del router de tu proveedor.\nEspero que sirva la explicación para que puedan disfrutar de un internet libre, seguro y rapido.\nInformacion encontrada gracias a los siguientes sitios muy utiles:\nhttps://www.frikidelto.com/tutorial/como-conseguir-el-usuario-y-contrasena-pppoe-para-instalar-un-router-neutro/ https://forocoches.com/foro/showthread.php?t=8105464\u0026page=3 https://bandaancha.eu/foros/sacar-clave-gpon-idont-ploam-password-1742394 https://bandaancha.eu/foros/vlan-prioridad-operadora-internet-voz-tv-1742983 https://forum.gl-inet.com/t/connecting-my-router-to-my-ont-isp/26389/4 ","permalink":"https://jose.castrillo.eu/post/router-spain-vlan/","summary":"\u003ch3 id=\"-actualizado-022024\"\u003e📣 Actualizado 02/2024\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/router1.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eContinuando con mi post \u003ca href=\"https://www.linkedin.com/pulse/neutralidad-de-la-red-y-tu-derecho-usar-router-en-espa%2525C3%2525B1a-castrillo-q1yyf%3FtrackingId=MoVK%252FVSBS6i9hYlPBP0ptg%253D%253D/?trackingId=MoVK%2FVSBS6i9hYlPBP0ptg%3D%3D\"\u003eanterior\u003c/a\u003e explico como realizar una conexion directa con tu propio router, en mi caso tengo un router \u003ca href=\"https://www.gl-inet.com\"\u003egl.inet\u003c/a\u003e; puedes usar otro router que disponga la configuración de VLAN.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eDependiendo de tu proveedor de servicio, necesitamos ir a la siguiente \u003ca href=\"https://wiki.bandaancha.st/Identificadores_VLAN_operadores_FTTH\"\u003epagina\u003c/a\u003e y busca tu VLAN, \u003cem\u003eLeer con atencion las notas dejadas en la pagina\u003c/em\u003e!. En mi caso tengo Orange aunque a en mi zona llega por \u003ca href=\"https://wiki.bandaancha.st/Nuevo_servicio_Ethernet_de_Banda_Ancha\"\u003eNEBA\u003c/a\u003e.\u003c/p\u003e","title":"Como configurar un router neutro"},{"content":"When you join a new project, company, customer, etc. (you\u0026rsquo;re still in the onboarding phase 😅), meanwhile you may find that you need to make a few changes to get your team\u0026rsquo;s production pipelines up and running. In this case, you can call an API trigger from one project to another (this is just a example).\nI\u0026rsquo;ve been in the situation described above before, and it was how I discovered this amazing feature in GitLab.\nLet\u0026rsquo;s identify our projects:\n* Project Caller: This will be the project that calls the trigger API. * Project Triggering: This is the project where the remote pipeline is located. From the Triggering Project, you need to activate the triggering token. To do this, go to \u0026ldquo;CI/CD Settings - Pipeline Trigger Tokens.\u0026rdquo;\nThen, use the generated token and add it as a variable in the \u0026ldquo;CI/CD Settings\u0026rdquo; of your Project Caller.\nNow, you can activate the trigger from the Project Caller to the Project Triggering. You can use the following example as a pipeline. Please remember, since we\u0026rsquo;re assuming that we\u0026rsquo;re working within the production pipeline, you need to add this at the end of the pipeline.\nbuilder_PB_trigger: before_script: - apt-get update - apt-get install -y curl script: - \u0026#39;curl -X POST --fail -F token=\u0026#34;$MY_TRIGGER_TOKEN\u0026#34; -F ref=\u0026#34;master\u0026#34; --form \u0026#34;variables[STAGE]=testing-abc\u0026#34; https://gitlab.com.company/api/v4/projects/xxxx/trigger/pipeline\u0026#39; only: - develop when: manual allow_failure: true On my case my runner needs the curl command, lines explanation below:\n* \u0026quot;token\u0026quot; use the name of your variable added. * \u0026quot;ref\u0026quot; the branch referenced where the pipeline it will run on Project Triggering. * \u0026quot;variables\u0026quot; on this part the best part it's we can bypass variables from/to. So on this example I'm passing the $STAGE variable to Project Triggering. * \u0026quot;only\u0026quot; it's a condition I set in order to run this jobs just on \u0026quot;develop\u0026quot; branch, from Project Caller. * \u0026quot;when\u0026quot; I set this job as manual by design in order to run it just when the developer want it and not consume time it isn't part of the main pipeline. * \u0026quot;allow_failure\u0026quot; it will be set as true because as we're working into production pipeline so our new lines(job) it wont be interfering with the main pipeline, so we can allow any failure from our job. Finally we can test the grabbing the variable by a echo ${STAGE} content.\n","permalink":"https://jose.castrillo.eu/post/pipeline-part1/","summary":"\u003cp\u003eWhen you join a new project, company, customer, etc. (you\u0026rsquo;re still in the onboarding phase 😅), meanwhile you may find that you need to make a few changes to get your team\u0026rsquo;s production pipelines up and running. In this case, you can call an API trigger from one project to another (this is just a example).\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been in the situation described above before, and it was how I discovered this amazing feature in GitLab.\u003c/p\u003e","title":"Trigger pipelines by using the API"},{"content":"Hey everyone! 👋 I hope you\u0026rsquo;re all having a fantastic summer time! 🌞\nI wanted to drop a quick note to let you know that I\u0026rsquo;m currently working on something special for all my fellow developers/operations and GitLab enthusiasts out there. 🤓✨\nIn the upcoming posts, I\u0026rsquo;ll be sharing a treasure trove of valuable tips and tricks related to GitLab pipelines! based in my experiences 🏗️ Whether you\u0026rsquo;re a seasoned pro or just getting started with GitLab CI/CD, there\u0026rsquo;s bound to be something for everyone.\nExpect to learn about:\n1️⃣ Best practices for structuring your GitLab CI/CD pipelines. 2️⃣ Advanced configuration options to supercharge your pipelines. 3️⃣ Integrating with other tools and services to streamline your workflow. 4️⃣ Debugging techniques and common pitfalls to avoid. 5️⃣ Optimizing performance and reducing build times. Make sure to stay tuned and keep an eye on my profile for the upcoming posts. I promise you won\u0026rsquo;t want to miss it! 🕵️‍♂️🔍\nIf you have any specific topics or questions you\u0026rsquo;d like me to cover in the post, feel free to drop them in the comments by email or Mastodon. Your feedback is essential, and I want to make sure this guide addresses your needs!\nUntil then, happy coding, and see you all in the next post! 🤗👩‍💻👨‍💻\n","permalink":"https://jose.castrillo.eu/post/pipeline-gitlab-guide/","summary":"\u003cp\u003eHey everyone! 👋 I hope you\u0026rsquo;re all having a fantastic summer time! 🌞\u003c/p\u003e\n\u003cp\u003eI wanted to drop a quick note to let you know that I\u0026rsquo;m currently working on something special for all my fellow developers/operations and GitLab enthusiasts out there. 🤓✨\u003c/p\u003e\n\u003cp\u003eIn the upcoming posts, I\u0026rsquo;ll be sharing a treasure trove of valuable tips and tricks related to GitLab pipelines! based in my experiences 🏗️ Whether you\u0026rsquo;re a seasoned pro or just getting started with GitLab CI/CD, there\u0026rsquo;s bound to be something for everyone.\u003c/p\u003e","title":"Mastering GitLab CI/CD, Unleashing the Power of Pipelines"},{"content":"For those who have been facing the \u0026ldquo;Maintenance mode active\u0026rdquo; after applied a nextcloud upgrade by switching container image version, due a major versioning issue.\nEven when you issue the occ upgrade into continer you gets hit by something like below:\nwww-data@87401bdd2fa8:~/html$ php /var/www/html/occ upgrade Nextcloud or one of the apps require upgrade - only a limited number of commands are available You may use your browser or the occ upgrade command to do the upgrade Setting log level to debug Exception: Updates between multiple major versions and downgrades are unsupported. Update failed Maintenance mode is kept active Resetting log level Keep a eye on this part: Updates between multiple major versions and downgrades are unsupported. as I was running 25 version I can no jump for above 27, if that\u0026rsquo;s our case, we can edit the file app/config/config.php edit the version of your nextcloud like below:\n... \u0026#39;version\u0026#39; =\u0026gt; \u0026#39;27.0.0.8\u0026#39;, ... From the example above I changed 25 to 27.\nThen I downloaded the latest image and restarted my docker-compose\ndocker pull nextcloud:27.0.0-apache docker-compose down docker-compose up -d --force-recreate Hope it can be useful\n","permalink":"https://jose.castrillo.eu/post/nextcloud-upgrade/","summary":"\u003cp\u003eFor those who have been facing the \u0026ldquo;Maintenance mode active\u0026rdquo; after applied a nextcloud upgrade by switching container image version, due a \u003cem\u003emajor versioning issue\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eEven when you issue the occ upgrade into continer you gets hit by something like below:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewww-data@87401bdd2fa8:~/html$ php /var/www/html/occ upgrade\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNextcloud or one of the apps require upgrade - only a limited number of commands are available\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYou may use your browser or the occ upgrade \u003cspan class=\"nb\"\u003ecommand\u003c/span\u003e to \u003cspan class=\"k\"\u003edo\u003c/span\u003e the upgrade\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSetting log level to debug\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eException: Updates between multiple major versions and downgrades are unsupported.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUpdate failed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMaintenance mode is kept active\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eResetting log level\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eKeep a eye on this part: \u003cem\u003eUpdates between multiple major versions and downgrades are unsupported.\u003c/em\u003e as I was running 25 version I can no jump for above 27, if that\u0026rsquo;s our case, we can edit the file \u003cstrong\u003eapp/config/config.php\u003c/strong\u003e edit the version of your nextcloud like below:\u003c/p\u003e","title":"Upgrading major version Nextcloud"},{"content":" When starting a Python 3 project in Linux, it\u0026rsquo;s essential to follow best practices to ensure a clean and isolated development environment. One of the recommended approaches is to utilize virtual environments. Virtual environments allow you to create an isolated environment for each project, preventing conflicts between different packages and dependencies. In this guide, we\u0026rsquo;ll walk you through the steps to set up and activate a virtual environment for your Python 3 project.\nStep 1: Install python3-venv First, make sure you have the python3-venv package installed on your Linux system. This package provides the necessary tools to create and manage virtual environments. Open a terminal and run the following command:\nNote: venv (for Python 3) and virtualenv (for Python 2)\nsudo apt-get install python3-venv Step 2: Create a New Virtual Environment Navigate to the directory where you want to create your project and virtual environment. Once there, run the following command to create a new virtual environment named myenv:\npython3 -m venv myenv Step 3: Activate the Virtual Environment To start working within the virtual environment, you need to activate it. Use the following command to activate the myenv environment:\nsource myenv/bin/activate Once activated, you\u0026rsquo;ll notice that your command prompt changes to reflect the name of the active environment (myenv in this case). From now on, any Python packages you install or scripts you run will be isolated within this environment.\nStep 4: Install Project Dependencies With the virtual environment active, you can now install the necessary Python packages for your project. It\u0026rsquo;s recommended to use a requirements file to manage your dependencies. Create a file called requirements.txt in your project directory and add the required packages with their versions, each on a separate line. For example:\nnumpy==1.20.3 pandas==1.3.0 To install these dependencies, run the following command:\npip install -r requirements.txt Now that your virtual environment is set up and dependencies are installed, you\u0026rsquo;re ready to start developing your Python 3 project!\nHow to deactivate the Virtual Environment Once you\u0026rsquo;re done working on your project, it\u0026rsquo;s good practice to deactivate the virtual environment. To do this, simply run the following command:\ndeactivate Further info go to official page here\n","permalink":"https://jose.castrillo.eu/post/python3-environment/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/python-env.jpg\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eWhen starting a Python 3 project in Linux, it\u0026rsquo;s essential to follow best practices to ensure a clean and isolated development environment. One of the recommended approaches is to utilize virtual environments. Virtual environments allow you to create an isolated environment for each project, preventing conflicts between different packages and dependencies. In this guide, we\u0026rsquo;ll walk you through the steps to set up and activate a virtual environment for your Python 3 project.\u003c/p\u003e","title":"Python \u0026 Virtual Environments"},{"content":" Merging two CSV files using Pandas in Python 3 on Linux is a quick and easy process that can save you a lot of time and effort, however in my case I used other script to extract specific tag values from a CSV file, converts them into a JSON object, and writes them to a new CSV file, in that way I provided a workaround for those tags wanted.\nThe following code extracts the content from the specified column(tags) and stores it in a new DataFrame, then it writes the new DataFrame to a CSV file named tags.csv.\n#!/bin/python3 import csv import json import os import pandas as pd # VARIABLES columna = 1 # columna de tags tags = [\u0026#39;Accounting\u0026#39;, \u0026#39;Contact\u0026#39;, \u0026#39;Name\u0026#39;, \u0026#39;costCenter\u0026#39;, \u0026#39;Entity\u0026#39;] rowcount = 0 filename=\u0026#34;tags.csv\u0026#34; # name of the new csv file path=os.getcwd() # read the CSV file into a pandas DataFrame df = pd.read_csv(path+\u0026#34;/demo.csv\u0026#34;) # extract the whole content from the \u0026#34;column_name\u0026#34; column column_content = df[\u0026#39;Tags\u0026#39;] df = pd.DataFrame(column_content) df.to_csv(\u0026#39;tags.csv\u0026#39;) # Open the CSV file and create a reader object with open(\u0026#39;tags.csv\u0026#39;, \u0026#39;r\u0026#39;) as f: reader = csv.reader(f) # Extract the desired column and store it in a list column = [] for row in reader: column.append(row[columna]) #iterating through the whole file for row in open(\u0026#34;tags.csv\u0026#34;): rowcount+= 1 # more and less 62209 rows with open(\u0026#39;file1.csv\u0026#39;, mode=\u0026#39;w\u0026#39;, newline=\u0026#39;\u0026#39;) as file: writer = csv.writer(file) # writing headers writer.writerow(tags) for i in range(1,rowcount): row = column[i] # print(row) # debug jaxon = \u0026#34;{\u0026#34; + row + \u0026#34;}\u0026#34; # print(\u0026#34; \u0026#34;) # debug # Parse the content string as a JSON object json_content = json.loads(jaxon) n = 0 account = [] for x in tags: try: value = json_content[tags[n]] n = n+1 except (KeyError,IndexError,TypeError): value = \u0026#34;-\u0026#34; n = n+1 account.append(value) # print(value) # print(\u0026#34;\u0026#34;) # print(account) writer.writerow(account) # delete .csv os.remove(filename) # read from file1 df = pd.read_csv(\u0026#39;file1.csv\u0026#39;) df.index.name = \u0026#39;index\u0026#39; # write + index from file1 to file2 df.to_csv(\u0026#39;file1.csv\u0026#39;) The following script reads the .csv file named demo.csv using Pandas, sets the index name of the DataFrame, and writes the DataFrame to a new .csv file named file2.csv.\n#!/bin/python3 import os import pandas as pd # pandas parameters: pd.options.display.max_columns = None pd.options.display.max_rows = None path=os.getcwd() # read the CSV file into a pandas DataFrame df = pd.read_csv(path+\u0026#34;/demo.csv\u0026#34;) # write + index from file1 to file2 df.index.name = \u0026#39;index\u0026#39; df.to_csv(\u0026#39;file2.csv\u0026#39;) And finally the next script merges two CSV files named file2.csv and file1.csv, and writes the merged DataFrame to a new .csv file named merged_file.csv, also I deleted the original .csv files to avoid confusion and redundancy.\n#!/bin/python3 import os import pandas as pd # Load the two CSV files into dataframes df1 = pd.read_csv(\u0026#34;file2.csv\u0026#34;) df2 = pd.read_csv(\u0026#34;file1.csv\u0026#34;) # Merge the dataframes based on the shared column merged_df = pd.merge(df1, df2, on=\u0026#34;index\u0026#34;) # Write the merged dataframe to a new CSV file merged_df.to_csv(\u0026#34;merged_file.csv\u0026#34;, index=False) # delete .csv os.remove(\u0026#34;file2.csv\u0026#34;) os.remove(\u0026#34;file1.csv\u0026#34;) You can use a main.py to call the modules:\n#!/bin/python3 from modules import builder_f1, control_f2, merge Hope the above solution it can be useful.\n","permalink":"https://jose.castrillo.eu/post/python-panda-invoices/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/pandas.gif\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eMerging two CSV files using Pandas in Python 3 on Linux is a quick and easy process that can save you a lot of time and effort, however in my case I used other script to extract specific tag values from a CSV file, converts them into a JSON object, and writes them to a new CSV file, in that way I provided a workaround for those tags wanted.\u003c/p\u003e","title":"Fixing tags on Azure invoices"},{"content":"Java provides a Native Memory Tracking feature that enables you to monitor the memory usage of your Java application. This feature is particularly useful for identifying memory leaks and optimizing the memory usage of your application. In this post, we will discuss how to activate Native Memory Tracking for a Java jar application in Linux.\nStep 1: Check Java Version First, you need to check the version of Java installed on your system using the following command:\njava --version If your Java version is 8u92 or later, you can use Native Memory Tracking. If not, you need to upgrade your Java version\nStep 2: Start the Java Application with Native Memory Tracking To start your Java application with Native Memory Tracking, you need to add the following JVM option when you start the application:\n-XX:NativeMemoryTracking=summary This option enables Native Memory Tracking and specifies that only a summary report is generated. You can also specify \u0026ldquo;detail\u0026rdquo; instead of \u0026ldquo;summary\u0026rdquo; to generate a detailed report.\nFor example, if you want to start your Java jar application named \u0026ldquo;myapp.jar\u0026rdquo; with Native Memory Tracking, you can use the following command:\njava -XX:NativeMemoryTracking=summary -jar myapp.jar Step 3: View the Native Memory Tracking Report After you start your Java application with Native Memory Tracking, you can view the report by using the following command:\njcmd \u0026lt;pid\u0026gt; VM.native_memory summary NOTE: you can find your java PID by using ps command or jps eg:\n[user@server usr]# jps 19664 Jps 14921 apps.jar Further information related how to read the summary over here\n","permalink":"https://jose.castrillo.eu/post/java-mem-linux/","summary":"\u003cp\u003eJava provides a \u003cem\u003eNative Memory Tracking\u003c/em\u003e feature that enables you to monitor the memory usage of your Java application. This feature is particularly useful for identifying memory leaks and optimizing the memory usage of your application. In this post, we will discuss how to activate Native Memory Tracking for a Java jar application in Linux.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eStep 1:\u003c/strong\u003e Check Java Version\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFirst, you need to check the version of Java installed on your system using the following command:\u003c/p\u003e","title":"Java Native Memory Tracking in GNU/linux"},{"content":"On this post I will give you an example of how to clone a repo into your pipeline and use it for other jobs.\nAs you can read from Gitlab official documentation artifact can output an archive of files/directories. I set the following example:\nartifacts: paths: - \u0026lt;project_name\u0026gt; exclude: - \u0026lt;project_name\u0026gt;/.git/**/* expire_in: 60 seconds We need to call the artifacts by using \u0026ldquo;artifacts\u0026rdquo; keyboard in the pipeline, in this example paths keyboard which files/directories add into artifacts.\nexclude prevents files from being added to an artifacts. In our example as we\u0026rsquo;re cloning a repo we will need to avoid the .git directory in order to avoid conflict thus\nexclude: - \u0026lt;project_name\u0026gt;/.git/**/* expire_in: 60 seconds above I added \u0026lt;project_name\u0026gt; folder and excluded \u0026ldquo;.git/**/*\u0026rdquo; all .git folder and subfolders.\nand expire_in this keyboard determines how long gitlab will keep this job artifact, as I just want to use it ones by each pipeline, I set it just to keep it 60s.\nThen if you need to use this artifact in another job you need to add a dependencies as below:\nbuilding: stage: building dependencies: - \u0026#34;clone\u0026#34; I finally below you can see a full pipeline example:\nstages: - clone clone: stage: clone before_script: - apt-get -qq update - apt-get -qq install -y git script: - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.\u0026lt;company\u0026gt;/path/\u0026lt;project_name\u0026gt;.git artifacts: paths: - \u0026lt;project_name\u0026gt; exclude: - \u0026lt;project_name\u0026gt;/.git/**/* expire_in: 60 seconds ","permalink":"https://jose.castrillo.eu/post/clone-pipeline-gitlab/","summary":"\u003cp\u003eOn this post I will give you an example of how to clone a repo into your pipeline and use it for other jobs.\u003c/p\u003e\n\u003cp\u003eAs you can read from Gitlab official \u003ca href=\"https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html\"\u003edocumentation\u003c/a\u003e artifact can output an archive of files/directories. I set the following example:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  artifacts:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    paths:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - \u0026lt;project_name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    exclude:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - \u0026lt;project_name\u0026gt;/.git/**/*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    expire_in: \u003cspan class=\"m\"\u003e60\u003c/span\u003e seconds\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWe need to call the \u003cem\u003eartifacts\u003c/em\u003e by using \u0026ldquo;artifacts\u0026rdquo; keyboard in the pipeline, in this example \u003cem\u003epaths\u003c/em\u003e keyboard which files/directories add into artifacts.\u003c/p\u003e","title":"Cloining a repo and setting up as artifact"},{"content":"The following post is example of how to activate and use Trigger pipeline by API the official documentation over here as it mentioned is can be use \u0026ldquo;to trigger a pipeline for a specific branch or tag\u0026rdquo;; for our example I use it to activate a pipeline into specific branch.\nSteps:\nrepoA will be the main one where the pipeline trigger it will be activate\nFrom repoA go to Settings-CI/CD-Pipeline triggers Click on \u0026ldquo;add trigger\u0026rdquo; copy your token From repoB that will be our caller of the repoA pipeline create a variable where you can paste the token. Finally into your pipeline on repoB you can add something like below: The best part is that you can reference to specific branch ref=\u0026quot;\u0026lt;branch_name\u0026gt;\u0026quot;.\ntrigger: # Trigger to \u0026lt;project\u0026gt; project ID: \u0026lt;\u0026gt; before_script: - apt-get update - apt-get install -y curl script: - \u0026#39;curl -X POST --fail -F token=\u0026#34;$MY_TRIGGER_TOKEN\u0026#34; -F ref=\u0026#34;\u0026lt;branch_name\u0026gt;\u0026#34; https://gitlab.\u0026lt;company\u0026gt;/api/v4/projects/\u0026lt;id\u0026gt;/trigger/pipeline\u0026#39; NOTE: from my gitlab server my runners are ubuntu 16.\nhope the above example can be useful.\n","permalink":"https://jose.castrillo.eu/post/trigger-pipeline-gitlab/","summary":"\u003cp\u003eThe following post is example of how to activate and use Trigger pipeline by API the official documentation over \u003ca href=\"https://docs.gitlab.com/ee/ci/triggers/\"\u003ehere\u003c/a\u003e as it mentioned is can be use \u003cem\u003e\u0026ldquo;to trigger a pipeline for a specific branch or tag\u0026rdquo;\u003c/em\u003e; for our example I use it to activate a pipeline into specific branch.\u003c/p\u003e\n\u003cp\u003eSteps:\u003c/p\u003e\n\u003cp\u003e\u003cem\u003erepoA will be the main one where the pipeline trigger it will be activate\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFrom \u003cstrong\u003erepoA\u003c/strong\u003e go to Settings-CI/CD-Pipeline triggers\u003c/li\u003e\n\u003cli\u003eClick on \u003cem\u003e\u0026ldquo;add trigger\u0026rdquo;\u003c/em\u003e copy your token\u003c/li\u003e\n\u003cli\u003eFrom \u003cstrong\u003erepoB\u003c/strong\u003e that will be our caller of the \u003cstrong\u003erepoA\u003c/strong\u003e pipeline create a variable where you can paste the token.\u003c/li\u003e\n\u003cli\u003eFinally into your pipeline on \u003cstrong\u003erepoB\u003c/strong\u003e you can add something like below:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe best part is that you can reference to specific branch \u003cstrong\u003eref=\u0026quot;\u0026lt;branch_name\u0026gt;\u0026quot;\u003c/strong\u003e.\u003c/p\u003e","title":"Trigger pipelines in Gitlab"},{"content":"On this entry we will cover how to create an new image in Hetzner Public Cloud by using Packer, as result we willl get a snapshot and then we can generate this new instance by using the snapshot created.\nTools used so far:\nAnsible Packer hcl2_upgrade I did not create a repo yet because it will be the first part of a personal project I\u0026rsquo;m working on, hence I will provide a couple of templates below.\nYou have to use your token generated from your hetzner cloud and set it up as variable.\nAt the end you will get something like below:\n→ tree . ├── image.json ├── image.json.pkr.hcl ├── README.md └── setup.yml 0 directories, 4 files image.json: { \u0026#34;builders\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;hcloud\u0026#34;, \u0026#34;token\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;image\u0026#34;: \u0026#34;ubuntu-18.04\u0026#34;, \u0026#34;location\u0026#34;: \u0026#34;nbg1\u0026#34;, \u0026#34;server_type\u0026#34;: \u0026#34;cx11\u0026#34;, \u0026#34;communicator\u0026#34;: \u0026#34;ssh\u0026#34;, \u0026#34;ssh_username\u0026#34;: \u0026#34;root\u0026#34; } ], \u0026#34;provisioners\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;shell\u0026#34;, \u0026#34;inline\u0026#34;: [\u0026#34;echo foo\u0026#34;] } ] } image.json.pkr.hcl (you have to set the token envariable on your terminal) $ export PKR_VAR_hcloud_token= variable hcloud_token { description = \u0026#34;Hetzner token\u0026#34; sensitive = true # Requires terraform \u0026gt;= 0.14 type = string } source \u0026#34;hcloud\u0026#34; \u0026#34;autogenerated_1\u0026#34; { communicator = \u0026#34;ssh\u0026#34; image = \u0026#34;ubuntu-18.04\u0026#34; location = \u0026#34;nbg1\u0026#34; server_type = \u0026#34;cx11\u0026#34; ssh_username = \u0026#34;root\u0026#34; token = var.hcloud_token } build { sources = [\u0026#34;source.hcloud.autogenerated_1\u0026#34;] provisioner \u0026#34;shell\u0026#34; { inline = [ \u0026#34;apt update \u0026amp;\u0026amp; apt -y upgrade\u0026#34;, \u0026#34;apt -y install python3\u0026#34;, \u0026#34;apt -y install ansible\u0026#34;, \u0026#34;apt -y install debian-keyring\u0026#34;, \u0026#34;apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138\u0026#34;, \u0026#34;apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9\u0026#34;, \u0026#34;apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 605C66F00D6C9793\u0026#34;, \u0026#34;apt-get clean\u0026#34; ] } provisioner \u0026#34;ansible\u0026#34; { use_proxy = false playbook_file = \u0026#34;./setup.yml\u0026#34; } } setup.yml (as example) # maintainer: Jose Castrillo # project: Ubuntu Hetzner - name: \u0026#39;provision image\u0026#39; hosts: default become: yes tasks: # adding new repo to install podman - apt_repository: repo: deb http://ftp.es.debian.org/debian bullseye main state: present # # basic packages # - name: basis packages ansible.builtin.apt: state: latest lock_timeout: 300 name: - lvm2 - unzip - vim - uidmap - git - buildah - podman # - ossec-hids-agent commands sorted:\n$ export PKR_VAR_hcloud_token= \u0026lt;your_token\u0026gt; $ packer hcl2_upgrade -with-annotations image.json # edit your image.json.pkr.hcl $ vim image.json.pkr.hcl $ packer validate image.json.pkr.hcl $ packer build image.json.pkr.hcl Official link\nPacker JSON to HCL\n","permalink":"https://jose.castrillo.eu/post/hetzner-image-snapshot/","summary":"\u003cp\u003eOn this entry we will cover how to create an new image in Hetzner Public Cloud by using Packer, as result we willl get a snapshot and then we can generate this new instance by using the snapshot created.\u003c/p\u003e\n\u003cp\u003eTools used so far:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAnsible\u003c/li\u003e\n\u003cli\u003ePacker\u003c/li\u003e\n\u003cli\u003ehcl2_upgrade\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI did not create a repo yet because it will be the first part of a personal project I\u0026rsquo;m  working on, hence I will provide a couple of templates below.\u003c/p\u003e","title":"Creating snapshot image in Hetzner with packer"},{"content":"This is a piece of cake for most of you that are working on tf, I will drop this snippet code where you can create a S3 bucket with an unique name; as you know those requirements should fit in order to create the S3, hence we can use random_string, also we can use random_id, on this case I used random_string.\nmain.tf\nresource \u0026#34;random_string\u0026#34; \u0026#34;randomz\u0026#34; { length = 8 lower = true special = false upper = false } Above is a resource block where its block label is random_string I defined the block body in that way in order to fit the S3\u0026rsquo;s requirements.\nThen you can call this resource to your S3 block label as below:\nresource \u0026#34;aws_s3_bucket\u0026#34; \u0026#34;my_s3_1\u0026#34; { bucket = \u0026#34;my-bucket-${random_string.randomz.id}\u0026#34; tags = { Name = \u0026#34;my bucket\u0026#34; Terraform = \u0026#34;true\u0026#34; } } resource \u0026#34;aws_s3_bucket_acl\u0026#34; \u0026#34;my_s3_1_acl\u0026#34; { bucket = aws_s3_bucket.my_s3_1.id acl = \u0026#34;private\u0026#34; } it\u0026rsquo;s pretty simple, hope it can be useful for you.\n","permalink":"https://jose.castrillo.eu/post/random-provider-tf/","summary":"\u003cp\u003eThis is a piece of cake for most of you that are working on tf, I will drop this snippet code where you can create a S3 bucket with an unique name; as you know those \u003ca href=\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html\"\u003erequirements\u003c/a\u003e should fit in order to create the S3, hence we can use \u003ca href=\"https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string\"\u003erandom_string\u003c/a\u003e, also we can use random_id, on this case I used random_string.\u003c/p\u003e\n\u003cp\u003emain.tf\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-hcl\" data-lang=\"hcl\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eresource\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;random_string\u0026#34; \u0026#34;randomz\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  length\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  lower\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kt\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  special\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kt\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003e  upper\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kt\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAbove is a \u003cstrong\u003eresource block\u003c/strong\u003e where its block label is \u003cstrong\u003erandom_string\u003c/strong\u003e I defined the block body in that way in order to fit the S3\u0026rsquo;s \u003ca href=\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html\"\u003erequirements\u003c/a\u003e.\u003c/p\u003e","title":"S3 by using random provider on Terraform"},{"content":" For those who has a Gl.inet router featured with Adguard on it, you should being facing a issue at Adguard when it activated at first time, from clients list the only client listed is \u0026ldquo;localhost\u0026rdquo;, the reason it\u0026rsquo;s due dnsmasq is runing on port 53 in the other hand adguard by default on port 3053, in order to solve it you have to switch them. This entry is a forward post by the workaround explained by chao-chao from gl-inet-forum I did it and it\u0026rsquo;s working from my side, below is a little summary of the steps I did:\n⚠️ NOTE: Remember backup your Router configuration ⚠️ The following command has to be run as root\nconnect by ssh to your Gl-inet router. change the dnsmasq port. (by defaut is running on port 53) You can check the service dnsmasq running by using netstat command, example below:\nnetstat -naulp | grep -i dns Add the port:\n#echo \u0026#34;port=5300\u0026#34; \u0026gt;\u0026gt; /etc/dnsmasq.conf change the adguard port to 53 vi /etc/AdGuardHome/config.yaml find the following entry, and change it from \u0026ldquo;port: xxxx\u0026rdquo; to \u0026ldquo;port: 53\u0026rdquo; eg:\n--- dns: bind_hosts: - 0.0.0.0 port: 53 --- Then restart your Router. Remember you can rollback these change either by edit the files describe above or by restore it by using backup file, hope it can be useful for you.\nThen we can disable dnsmasq service, command below:\nHelp:\nSyntax: /etc/init.d/dnsmasq [command] Available commands: start Start the service stop Stop the service restart Restart the service reload Reload configuration files (or restart if service does not implement reload) enable Enable service autostart disable Disable service autostart enabled Check if service is started on boot running Check if service is running status Service status trace Start with syscall trace /etc/init.d/dnsmasq stop /etc/init.d/dnsmasq disable ","permalink":"https://jose.castrillo.eu/post/router-glinet-adguard/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/adguard.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eFor those who has a Gl.inet router featured with Adguard on it, you should being facing a issue at Adguard when it activated at first time, from clients list the only client listed is \u0026ldquo;localhost\u0026rdquo;, the reason it\u0026rsquo;s due \u003ca href=\"https://linux.die.net/man/8/dnsmasq\"\u003ednsmasq\u003c/a\u003e is runing on port 53 in the other hand adguard by default on port 3053, in order to solve it you have to switch them. This entry is a forward post by the workaround explained by \u003cstrong\u003echao-chao\u003c/strong\u003e from \u003ca href=\"https://forum.gl-inet.com/t/gl-mv1000-with-adguard-all-clients-show-as-localhost/13664/13\"\u003egl-inet-forum\u003c/a\u003e I did it and it\u0026rsquo;s working from my side, below is a little summary of the steps I did:\u003c/p\u003e","title":"How to switch 3053 to 53 on Gl.inet"},{"content":"In any case you still having a device that works with smb v1.0 you can use the following way in order to mount it on your Fedora host:\nPath: /etc/NetworkManager/dispatcher.d/smb-setup.sh\n#!/bin/sh -e # Script to dispatch NetworkManager events # more over: https://stackoverflow.com/questions/16848021/linux-networkmanagers-etc-networkmanager-dispatcher-d-test-script-does-not # Runs ifupdown scripts when NetworkManager fiddles with interfaces. # See NetworkManager(8) for further documentation of the dispatcher events. INF=\u0026#34;$1\u0026#34; # your current interface name such as eth0, wlp4s0 and so on STA=\u0026#34;$2\u0026#34; # status such as UP or DOWN # Send message to /var/log/messages logger -s \u0026#34;$0 called for interface named $INF with $STA ...\u0026#34; if [ \u0026#34;$INF\u0026#34; == \u0026#34;eno1\u0026#34; ] then mount -t cifs -o vers=1.0,username=admin,password=Tr3x_1986,uid=1000,gid=1000,forceuid,forcegid //10.34.1.1/1fea-6abb /home/jose/homedisk fi more info:\nhttps://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-Using_NetworkManager_with_Network_Scripts#bh-Running_Dispatcher_Scripts https://www.cyberciti.biz/faq/centos-7-run-script-when-network-interface-is-up-network-manager/ ","permalink":"https://jose.castrillo.eu/post/smb-fedora-v1/","summary":"\u003cp\u003eIn any case you still having a device that works with smb v1.0 you can use the following way in order to mount it on your Fedora host:\u003c/p\u003e\n\u003cp\u003ePath: /etc/NetworkManager/dispatcher.d/smb-setup.sh\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#!/bin/sh -e\n# Script to dispatch NetworkManager events\n# more over: https://stackoverflow.com/questions/16848021/linux-networkmanagers-etc-networkmanager-dispatcher-d-test-script-does-not\n# Runs ifupdown scripts when NetworkManager fiddles with interfaces.\n# See NetworkManager(8) for further documentation of the dispatcher events.\n\nINF=\u0026#34;$1\u0026#34; # your current interface name such as eth0, wlp4s0 and so on\nSTA=\u0026#34;$2\u0026#34; # status such as UP or DOWN\n\n# Send message to /var/log/messages\nlogger -s \u0026#34;$0 called for interface named $INF with $STA ...\u0026#34;\n\nif [ \u0026#34;$INF\u0026#34; == \u0026#34;eno1\u0026#34; ]\nthen\nmount -t cifs -o vers=1.0,username=admin,password=Tr3x_1986,uid=1000,gid=1000,forceuid,forcegid //10.34.1.1/1fea-6abb /home/jose/homedisk\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003emore info:\u003c/p\u003e","title":"setup auto mount smb v1.0"},{"content":"It has been a while since my last post, I was busy these last couples of weeks; meanwhile I\u0026rsquo;ve learned how to implement a csi interface on eks (aws k8s) and it\u0026rsquo;s pretty interesting on AWS by EKS service, thus I though it can be useful this content into a post.\nRequirements:\nYou will need your eks already running. I\u0026rsquo;ll point each tools, techs, etc I used on this procedure:\nCloud: AWS Service: EKS tool: Kustomize cmd_tool: eksctl cmd_api: kubectl IaC: Terraform Repo: Gitlab A summary of the steps we will follow:\n1 create .json policy. - Terraform 2 create irsa file entry. - Terraform 3 bind and create SA - eksctl 4 create the csi objects - from repo kustomize Terraform 1 create .json policy. You can find the policy right here and paste it onto your Terraform folder.\n2 create irsa file entry. Add the following file to your Terraform folder.\nmodule \u0026#34;irsa-aws-efs-csi-controller\u0026#34; { source = \u0026#34;terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc\u0026#34; version = \u0026#34;~\u0026gt; 4\u0026#34; create_role = true role_name = \u0026#34;aws-efs-csi-controller\u0026#34; provider_url = replace(module.eks.cluster_oidc_issuer_url, \u0026#34;https://\u0026#34;, \u0026#34;\u0026#34;) role_policy_arns = [aws_iam_policy.aws-efs-csi-controller.arn] oidc_fully_qualified_subjects = [\u0026#34;system:serviceaccount:kube-system:aws-efs-csi-controller\u0026#34;] } resource \u0026#34;aws_iam_policy\u0026#34; \u0026#34;aws-efs-csi-controller\u0026#34; { name_prefix = \u0026#34;aws-efs-csi-controller\u0026#34; description = \u0026#34;EKS aws-efs-csi-controller policy for cluster ${module.eks.cluster_id}\u0026#34; policy = file(\u0026#34;aws-efs-csi-controller-policy.json\u0026#34;) path = \u0026#34;/\u0026#34; } 3 create SA and bind role on eksctl create iamserviceaccount \\ --cluster=\u0026lt;cluster-name\u0026gt; \\ --region \u0026lt;your-region\u0026gt; \\ --namespace=kube-system \\ --name=efs-csi-controller-sa \\ --override-existing-serviceaccounts \\ # delete if you don\u0026#39;t need it --attach-policy-arn=\u0026lt;arn-policy\u0026gt; \\ # your arn policy created by TF --approve 4 create csi objects. Using your credentials to access the eks cluster by kubectl, create a folder and copy and paste the following kustomize yaml file.\nnote: below as you can see there I use a \u0026ldquo;images\u0026rdquo; entry as patching method where it will parse each image and replaces them by \u0026ldquo;newName\u0026rdquo; value, there are storaged on ECR if do you want just pull these image from amazon official site (not recommended on PRO) you can delete the \u0026ldquo;images\u0026rdquo;; thus you can chose a) or b).\na) Kustomize file (patching method): apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: kube-system resources: - git@gitlab.com/castrillo/k8s-olimpo images: - name: amazon/aws-efs-csi-driver:v1.3.4 newName: \u0026lt;\u0026gt;/path/aws-efs-csi-driver - name: public.ecr.aws/eks-distro/kubernetes-csi/csi-provisioner:v3.1.0 newName: \u0026lt;\u0026gt;/path/csi-provisioner - name: public.ecr.aws/eks-distro/kubernetes-csi/livenessprobe:v2.5.0 newName: \u0026lt;\u0026gt;/path/livenessprobe - name: public.ecr.aws/eks-distro/kubernetes-csi/node-driver-registrar:v2.5.0 newName: \u0026lt;\u0026gt;/path/csi-node-driver-registrar b) Kustomize file (no patching method): apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: kube-system resources: - git@gitlab.com/castrillo/k8s-olimpo Check out the diff plan and apply:\nkustomize build . | kubectl diff -f - kustomize build . | kubectl apply -f - At the end you will see something like:\n$ kubectl get all -l app.kubernetes.io/name=aws-efs-csi-driver -n kube-system NAME READY STATUS RESTARTS AGE pod/efs-csi-controller-589f98dc58-4qbrw 3/3 Running 0 6m26s pod/efs-csi-controller-589f98dc58-mcbsg 3/3 Running 0 6m26s pod/efs-csi-node-2njd7 3/3 Running 0 18m pod/efs-csi-node-4cvjb 3/3 Running 0 18m pod/efs-csi-node-9j874 3/3 Running 0 18m pod/efs-csi-node-9pkjw 3/3 Running 0 18m pod/efs-csi-node-bjm2b 3/3 Running 0 18m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/efs-csi-node 22 22 22 22 22 beta.kubernetes.io/os=linux 18m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/efs-csi-controller 2/2 2 2 18m NAME DESIRED CURRENT READY AGE replicaset.apps/efs-csi-controller-589f98dc58 2 2 2 18m On this part we have everything done, if do you need test the driver go through the examples shown from official repo eg multiple_pods\nofficial docu\n","permalink":"https://jose.castrillo.eu/post/efs-csi-eks-tf/","summary":"\u003cp\u003eIt has been a while since my last post, I was busy these last couples of weeks; meanwhile I\u0026rsquo;ve learned how to implement a csi interface on eks (aws k8s) and it\u0026rsquo;s pretty interesting on AWS by EKS service, thus I though it can be useful this content into a post.\u003c/p\u003e\n\u003cp\u003eRequirements:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eYou will need your eks already running.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI\u0026rsquo;ll point each tools, techs, etc I used on this procedure:\u003c/p\u003e","title":"csi interface for eks by terraform"},{"content":"Ansible FAILED! =\u0026gt; {\u0026#34;msg\u0026#34;: \u0026#34;Missing sudo password\u0026#34;} I have a couple of ansible-playbook, from one of my endpoint device started to prompt missing sudo password due there is needed a sudoers access, thus this is one of the solutions.\nlogin by ssh to the device, where ansible can\u0026rsquo;t login. go to /etc/sudoers.d/ create a new entry eg: \u0026ldquo;023_user-nopass\u0026rdquo; add the following line \u0026ldquo;user ALL=(ALL) NOPASSWD: ALL\u0026rdquo; into the file \u0026ldquo;023_user-nopass\u0026rdquo; change the permission by using: sudo chmod 440 023_user-nopass NOTE: please change value for your normal user access -not the root one-\nThen run again your ansible-playbook.\n","permalink":"https://jose.castrillo.eu/post/ansible-missing-sudo/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eAnsible FAILED! =\u0026gt; {\u0026#34;msg\u0026#34;: \u0026#34;Missing sudo password\u0026#34;}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eI have a couple of ansible-playbook, from one of my endpoint device started to prompt \u003cem\u003emissing sudo password\u003c/em\u003e due there is needed a sudoers access, thus this is one of the solutions.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003elogin by ssh to the device, where ansible can\u0026rsquo;t login.\u003c/li\u003e\n\u003cli\u003ego to /etc/sudoers.d/\u003c/li\u003e\n\u003cli\u003ecreate a new entry eg: \u0026ldquo;023_user-nopass\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eadd the following line \u0026ldquo;user ALL=(ALL) NOPASSWD: ALL\u0026rdquo; into the file \u0026ldquo;023_user-nopass\u0026rdquo;\u003c/li\u003e\n\u003cli\u003echange the permission by using:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo chmod 440 023_user-nopass\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNOTE: please change \u003cuser\u003e value for your normal user access -not the root one-\u003c/p\u003e","title":"Ansible missing sudo"},{"content":"This\u0026rsquo;s my Hello World on Solidity:\n// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.6 \u0026lt; 0.9.0; contract TaskContract { uint nextId; struct Task { uint id; string name; string description; } Task[] tasks; function createTask (string memory _name, string memory _description) public { tasks.push(Task(nextId, _name, _description)); nextId++; } function findIndex(uint _id) internal view returns (uint) { for (uint i=0;i \u0026lt; tasks.length; i++){ if (tasks[i].id == _id){ return i; } } revert(\u0026#39;Task not found\u0026#39;); } function readTask(uint _id) public view returns (uint, string memory, string memory) { // _id ---\u0026gt; variable local uint index = findIndex(_id); return (tasks[index].id, tasks[index].name, tasks[index].description); } function updateTask(uint _id, string memory _name, string memory _description) public { uint index = findIndex(_id); tasks[index].name = _name; tasks[index].description = _description; } function deleteTask(uint _id) public{ uint index =findIndex(_id); delete tasks[index]; } } Tutorial followed: Solidity SCRUD\n","permalink":"https://jose.castrillo.eu/post/blockchaing-solidity-hello/","summary":"\u003cp\u003eThis\u0026rsquo;s my Hello World on Solidity:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-solidity\" data-lang=\"solidity\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// SPDX-License-Identifier: GPL-3.0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epragma solidity\u003c/span\u003e \u003cspan class=\"o\"\u003e^\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e9\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003econtract\u003c/span\u003e \u003cspan class=\"nc\"\u003eTaskContract\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003enextId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003estruct\u003c/span\u003e \u003cspan class=\"nc\"\u003eTask\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"nb\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003ecreateTask\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"k\"\u003ememory\u003c/span\u003e \u003cspan class=\"n\"\u003e_name\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"k\"\u003ememory\u003c/span\u003e \u003cspan class=\"n\"\u003e_description\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enextId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_name\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_description\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003enextId\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003efindIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003einternal\u003c/span\u003e \u003cspan class=\"k\"\u003eview\u003c/span\u003e \u003cspan class=\"k\"\u003ereturns\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003erevert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#39;Task not found\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003ereadTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003eview\u003c/span\u003e \u003cspan class=\"k\"\u003ereturns\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"k\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"k\"\u003ememory\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// _id ---\u0026gt; variable local\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efindIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nb\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003eupdateTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"k\"\u003ememory\u003c/span\u003e \u003cspan class=\"n\"\u003e_name\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"k\"\u003ememory\u003c/span\u003e \u003cspan class=\"n\"\u003e_description\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003epublic\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efindIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nb\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003e_name\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003edescription\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003e_description\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nf\"\u003edeleteTask\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003euint\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003efindIndex\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_id\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003edelete\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTutorial followed: \u003ca href=\"https://youtube.076.ne.jp/watch?v=JP-dzoDmJFw\"\u003eSolidity SCRUD\u003c/a\u003e\u003c/p\u003e","title":"HelloWorld Solidity"},{"content":" Part I - I\u0026rsquo;m learning Gitlab Runner and how them works on CI implementation.\nGitLab Runner is an application that works with GitLab CI to run jobs in a pipeline, they are written in GO\nSummary the task I will do:\nInstall Gitlab-runner as container(podman). Runner registration. Enter the GitLab instance URL registration token. runner description. tags. Select an executor. Create a gitlab-ci.yml Install runner:\nCreate the Volume: podman volume create gitlab-runner-config Pull and start the container by register command, then we will prompt the data need for register the runner into the project.\npodman run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:alpine register Example (I select shell executor):\n02:34:24 jose@fedora .gitlab-runner → podman run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:alpine register Runtime platform arch=amd64 os=linux pid=2 revision=8925d9a0 version=14.1.0 Running in system-mode. Enter the GitLab instance URL (for example, https://gitlab.com/): https://gitlab.com/ Enter the registration token: «your runner token» Enter a description for the runner: [70d0a9e9edc9]: podman Enter tags for the runner (comma-separated): «» Registering runner... succeeded runner=BdvMUJxJ Enter an executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker-ssh, docker, parallels, shell, virtualbox, custom: shell Runner registered successfully. Feel free to start it, but if it\u0026#39;s running already the config should be automatically reloaded! Here you can frin the token from your project .\ntesting the Gitlab-runner works:\npodman run --rm -t -i gitlab/gitlab-runner --help For testing purpose we can run the container as below:\npodman run --name gitlab-runner -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:alpine Create a gitlab-ci.yml we will use the runner on shell executor mode in order to run a shell script.\ngitlab-ci.yml file: stages: - test ScriptBuild: stage: test script: - bash script.sh bash file: #!/bin/bash echo \u0026#34;starting script\u0026#34; cat text.txt | wc -l note: you must create both files into root folder of your project\nremember: \u0026ldquo;you should install GitLab Runner on a machine that’s separate from the one that hosts the GitLab instance for security and performance reasons\u0026rdquo;\nFurther info: https://docs.gitlab.com/runner/ Best practices: https://docs.gitlab.com/runner/best_practice/index.html\n","permalink":"https://jose.castrillo.eu/post/gitlab-runner1/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/runner_logo.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003ch2 id=\"part-i--\"\u003ePart I -\u003c/h2\u003e\n\u003cp\u003eI\u0026rsquo;m learning Gitlab Runner and how them works on CI implementation.\u003c/p\u003e\n\u003cp\u003eGitLab Runner is an application that works with GitLab CI to run jobs in a pipeline, they are written in \u003ca href=\"https://golang.org/\"\u003eGO\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eSummary the task I will do:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eInstall Gitlab-runner as container(podman).\u003c/li\u003e\n\u003cli\u003eRunner registration.\n\u003cul\u003e\n\u003cli\u003eEnter the GitLab instance URL\u003c/li\u003e\n\u003cli\u003eregistration token.\u003c/li\u003e\n\u003cli\u003erunner description.\u003c/li\u003e\n\u003cli\u003etags.\u003c/li\u003e\n\u003cli\u003eSelect an \u003ca href=\"https://docs.gitlab.com/runner/executors/\"\u003eexecutor\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eCreate a gitlab-ci.yml\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eInstall runner:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCreate the Volume:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epodman volume create gitlab-runner-config\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePull and start the container by \u003cstrong\u003eregister\u003c/strong\u003e command, then we will prompt the data need for register the runner into the project.\u003c/p\u003e","title":"How setup a Gitlab Runner (CI)"},{"content":" On this new entry I will share a briefly installation step by step by using Toolbox at Fedora 34 to use the hcloud-cli. Due we do not have an official package on fedora git-repo yet, hence we can create this container.\nPre-requirement: Visit Hetzner Cloud Console at https://console.hetzner.cloud, select your project, and create a new API Token.\nLet\u0026rsquo;s start:\n1- Create a file named Dockerfile.debian with the following contents(the following image is made to use a script to named and set a token_key):\nFROM docker.io/library/debian:bullseye LABEL maintainer=\u0026#34;jose castrillo\u0026#34; LABEL com.github.containers.toolbox=\u0026#34;true\u0026#34; \\ com.github.debarshiray.toolbox=\u0026#34;true\u0026#34; ARG TOKEN ENV HCLOUD_TOKEN=$TOKEN RUN apt-get update \u0026amp;\u0026amp; \\ apt-get -y install sudo libcap2-bin \u0026amp;\u0026amp; \\ apt-get -y install curl \u0026amp;\u0026amp; \\ apt-get -y install git #RUN curl -LJO \u0026#34;https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb\u0026#34; #RUN dpkg -i gitlab-runner_amd64.deb RUN sed -i -e \u0026#39;s/ ALL$/ NOPASSWD:ALL/\u0026#39; /etc/sudoers \u0026amp;\u0026amp; \\ touch /etc/localtime \u0026amp;\u0026amp; \\ echo VARIANT_ID=container \u0026gt;\u0026gt; /etc/os-release \u0026amp;\u0026amp; \\ echo \u0026#34;deb http://deb.debian.org/debian bullseye main\u0026#34; \u0026gt;\u0026gt; /etc/apt/sources.list \u0026amp;\u0026amp; \\ apt-get -y install hcloud-cli \u0026amp;\u0026amp; \\ apt-get autoremove #testing variable TOKEN #RUN curl -H \u0026#34;Authorization: Bearer $TOKEN\u0026#34; https://api.hetzner.cloud/v1/servers #Configure hcloud using environment variables #ARG TOKEN #ENV PATH $HCLOUD_TOKEN:$TOKEN #RUN export HCLOUD_TOKEN=$TOKEN CMD /bin/bash 2- Build the image:\n$ podman build -t debian-toolbox -f Dockerfile.debian 3- Create the toolbox container:\ntoolbox create -i localhost/debian-toolbox:latest The output you should received it\u0026rsquo;s the following:\nCreated container: debian-toolbox-latest Enter with: toolbox enter debian-toolbox-latest 4- Finally run the container by:\ntoolbox enter -c debian-toolbox-latest Setup Hcloud-cli by your API-key\nTest your API response by: curl -H \u0026#34;Authorization: Bearer API-token\u0026#34; https://api.hetzner.cloud/v1/servers Replace the API-token from the above command.\nConfigure the hcloud program to use your token:\nhcloud context create project-name Then It will prompt the Token entry, where you have to fill it.\nToken: Context project-name created and activated Hope we can get soon this package on Fedora official repositories, meanwhile this is a good and faster way to do it.\nI did a script where it manages to create and build an image where you have to provide:\nImage name. Hetzner Token. To clone the project here\nOfficial documentation:\nAPI doc: https://docs.hetzner.cloud/ Hetzner community: https://community.hetzner.com/tutorials/howto-hcloud-cli\n","permalink":"https://jose.castrillo.eu/post/hetzner-cli-toolbox/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/hetzner-blog.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eOn this new entry I will share a briefly installation step by step by using Toolbox at Fedora 34 to use the hcloud-cli. Due we do not have an official package on fedora \u003ca href=\"https://github.com/hetznercloud/cli\"\u003egit-repo\u003c/a\u003e yet, hence we can create this container.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePre-requirement:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVisit Hetzner Cloud Console at \u003ca href=\"https://console.hetzner.cloud\"\u003ehttps://console.hetzner.cloud\u003c/a\u003e, select your project, and create a new API Token.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s start:\u003c/p\u003e\n\u003cp\u003e1- Create a file named \u003cem\u003eDockerfile.debian\u003c/em\u003e with the following contents(the following image is made to use a script to named and set a token_key):\u003c/p\u003e","title":"Install Hetzner-CLi on Fedora by Toolbox"},{"content":"RAID RAID is a technology that is used to increase the performance and/or reliability of data storage. The abbreviation stands for Redundant Array of Inexpensive Disks. A RAID system consists of two or more drives working in parallel. These disks can be hard discs, but there is a trend to also use the technology for SSD (solid state drives). There are different RAID levels, each optimized for a specific situation. These are not standardized by an industry group or standardization committee.\nStriping - RAID 0 In a RAID 0 system data are split up into blocks that get written across all the drives in the array. By using multiple disks (at least 2) at the same time, this offers superior I/O performance. This performance can be enhanced further by using multiple controllers, ideally one controller per disk. Mirroring - RAID 1 Data are stored twice by writing them to both the data drive (or set of data drives) and a mirror drive (or set of drives). If a drive fails, the controller uses either the data drive or the mirror drive for data recovery and continues operation. RAID 5 This level is based on block-level striping with parity. The parity information is striped across each drive, allowing the array to function even if one drive were to fail. The array\u0026rsquo;s architecture allows read and write operations to span multiple drives. This results in performance that is usually better than that of a single drive, but not as high as that of a RAID 0 array. RAID 5 requires at least three disks, but it is often recommended to use at least five disks for performance reasons.\nRAID 6 RAID 6 is like RAID 5, but the parity data are written to two drives. That means it requires at least 4 drives and can withstand 2 drives dying simultaneously. The chances that two drives break down at exactly the same moment are of course very small. However, if a drive in a RAID 5 systems dies and is replaced by a new drive, it takes hours or even more than a day to rebuild the swapped drive. If another drive dies during that time, you still lose all of your data. With RAID 6, the RAID array will even survive that second failure.\nRAID 10 (RAID 1+0): Combining RAID 1 and RAID 0, this level is often referred to as RAID 10, which offers higher performance than RAID 1, but at a much higher cost. In RAID 1+0, the data is mirrored and the mirrors are striped. These levels do exist but are not that common (RAID 3 is essentially like RAID 5 but with the parity data always written to the same drive). This is just a simple introduction to RAID-systems.\n","permalink":"https://jose.castrillo.eu/post/raid-disk/","summary":"\u003ch1 id=\"raid\"\u003eRAID\u003c/h1\u003e\n\u003cp\u003eRAID is a technology that is used to increase the performance and/or reliability of data storage. The abbreviation stands for Redundant Array of Inexpensive Disks. A RAID system consists of two or more drives working in parallel. These disks can be hard discs, but there is a trend to also use the technology for SSD (solid state drives). There are different RAID levels, each optimized for a specific situation. These are not standardized by an industry group or standardization committee.\u003c/p\u003e","title":"Redundant Array of Inexpensive Disks"},{"content":"I created this post as aim to collaborate with the project and help those how are bought a Gigaset GS290 to test this great /e/ OS degoogle fork, and have been failed by using easy installer, but first I will let clearly that these steps are the steps I followed in order to set up the /e/ OS in my Gigaset.\nRequirement-system:\nGNU/Linux OS (in my case Fedora).** ADB \u0026amp; Fastboot library latest.** /e/OS build** boot.img** recovery.img** Basic knowledge in terminal \u0026amp; command line. Sudo Requirement-smartphone:\nAndroid 10 already running in Gigaset Gs290.** USB wire. Developer option enabled. File transfer set as default USB behavior. OEM unlocked. Before to start please be sure you have the requirement named above!!\nDownload SDK platform tool from the official site, in my case I downloaded the platform-tools_r31.0.1-linux.zip from the official documentation, they suggested to use the latest version. Unzip its content and into the unziped folder we are gonna to copy and paste the other files. On this step we have our platform-tools folder.\n$ unzip -d . platform-tools_r31.0.1-linux.zip* Download /e/os build from here it is the same link than the official site in my case I downloaded IMG-e-0.15-q-20210311105636-dev-GS290.zip\nUnzip the content, go into the folder unziped IMG-e-0.15-q-20210311105636-dev-GS290 copy the file system.img and paste it into platform-tools below commands:\n$ wget https://images.ecloud.global/dev/GS290/IMG-e-0.15-q-20210311105636-dev-GS290.zip $ unzip -d . IMG-e-0.15-q-20210311105636-dev-GS290.zip $ mv system.img platform-tools download recovery.img and boot.img and paste them into platform-tools folder. I assumed we\u0026rsquo;re issue the commands into platform-tools\n$ wget https://images.ecloud.global/dev/GS290/recovery-e-0.14-q-2021012698290-dev-GS290.img $ wget https://images.ecloud.global/dev/GS290/boot.img I assumed you have these requirements already done: Developer option enabled.** File transfer set as default USB behavior.** OEM unlocked.** If you do not know how to do it, please before to start follow these official instructions(https://doc.e.foundation/pages/enable-usb-debugging)\nSo connected the smartphone in your pc, and follow step by step the following commands:\nsudo ./fastboot reboot sudo ./fastboot flashing unlock sudo ./fastboot flash --disable-verity --disable-verification boot boot_g.img sudo ./fastboot flash recovery recovery_g.img sudo ./fastboot flash system system_g.img sudo ./fastboot -w sudo ./fastboot reboot On this step your phone is should be restarted and booting in /e/ OS system! congrat !\nFurther info from official documentation and from the community page here is a really good post\nHope it can be useful.\n","permalink":"https://jose.castrillo.eu/post/gigaset-e-fastboot/","summary":"\u003cp\u003eI created this post as aim to collaborate with the project and help those how are bought a \u003ca href=\"https://doc.e.foundation/devices/GS290/\"\u003eGigaset GS290\u003c/a\u003e to test this great /e/ OS degoogle fork, and have been failed by using \u003ca href=\"https://doc.e.foundation/easy-installer\"\u003eeasy installer\u003c/a\u003e, but first I will let clearly that these steps are the steps I followed in order to set up the /e/ OS in my Gigaset.\u003c/p\u003e\n\u003cp\u003eRequirement-system:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGNU/Linux OS (in my case Fedora).**\u003c/li\u003e\n\u003cli\u003eADB \u0026amp; Fastboot library \u003cstrong\u003elatest\u003c/strong\u003e.**\u003c/li\u003e\n\u003cli\u003e/e/OS build**\u003c/li\u003e\n\u003cli\u003eboot.img**\u003c/li\u003e\n\u003cli\u003erecovery.img**\u003c/li\u003e\n\u003cli\u003eBasic knowledge in terminal \u0026amp; command line.\u003c/li\u003e\n\u003cli\u003eSudo\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRequirement-smartphone:\u003c/p\u003e","title":"How to install /e/OS in Gigaset GS290 from GNU/Linux"},{"content":"I will share a little workaround in order to re-establish Prometheus service back in the game.\nOrigin of issue: I\u0026rsquo;ve had an issue with my local network at home by the ISP provider, I had have shut down my RaspberryPi and other devices.\nThen when I could solved the issue and all my devices were up and running I checked up my services and I found that Prometheus got stuck by a \u0026ldquo;mmap: invalid argument\u0026rdquo; message.\nPossible troubleshooting: Have a look at 1)journalctl as well as service by 2)systemd and the full message it was:\nlevel=error ts=2021-02-22T09:37:48.824Z caller=main.go:798 err=\u0026#34;opening storage failed: mmap files, file: /usr/local/bin/prometheus/data/chunks_head/000534: mmap: invalid argument\u0026#34; The service did not get start because when it was trying to grab that \u0026ldquo;/usr/local/bin/prometheus/data/chunks_head/000534\u0026rdquo; file stopped automatically.\nI checked the folder from that pointed path:\nroot@raspbi:/usr/local/bin/prometheus# ls -l /usr/local/bin/prometheus/data/chunks_head/ -rw-r--r-- 1 pi pi 1996469 Feb 21 13:00 000533 -rw-r--r-- 1 pi pi 0 Feb 21 13:00 000534 That was the error, the service it was trying to start with a empty file, so I deleted the \u0026ldquo;000534\u0026rdquo; and restart the service.\nsystemctl restart prometheus.service And all it was back just right.\n","permalink":"https://jose.castrillo.eu/post/prometheus-troubleshooting/","summary":"\u003cp\u003eI will share a little workaround in order to re-establish Prometheus service back in the game.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOrigin of issue:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI\u0026rsquo;ve had an issue with my local network at home by the ISP provider, I had have shut down my RaspberryPi and other devices.\u003c/p\u003e\n\u003cp\u003eThen when I could solved the issue and all my devices were up and running I checked up my services and I found that Prometheus got stuck by a \u003cem\u003e\u0026ldquo;mmap: invalid argument\u0026rdquo;\u003c/em\u003e message.\u003c/p\u003e","title":"/prometheus/data/chunks_head/ troubleshoot"},{"content":" On this post I will explain how I set up a Grafana + Prometheus into a RaspberryPi with Raspbian.\nHere it\u0026rsquo;s a little design where explains how it is the implementation I did:\n🔵 Server: RaspberryPi 3B+\nServices to install(server side): Grafana Prometheus (Metric collector and database) Node Exporter (collector worker) 🟢 Clients: Raspberrypi Zero Fedora Workstation Debian VPS\nServices to install(client side): Node Exporter (collector worker). 🔵 Lets start from the server side.\nInstalling Prometheus. NOTE: please go to the download section and pick up the right model of your processor. In my case is armv7\n$ wget https://github.com/prometheus/prometheus/releases/download/v2.22.0/prometheus-2.22.0.linux-armv7.tar.gz $ tar xfz prometheus-2.24.0.linux-armv7.tar.gz $ rm prometheus-2.24.0.linux-armv7.tar.gz $ mv prometheus-2.24.0.linux-armv7 prometheus Create the service [systemd]\n$ sudo nano /etc/systemd/system/prometheus.service Into the service we have:\n[Unit] Description=Prometheus Server Documentation=https://prometheus.io/docs/introduction/overview/ After=network-online.target [Service] User=pi ExecStart=/usr/local/bin/prometheus/prometheus \\ --config.file=/usr/local/bin/prometheus/prometheus.yml \\ --storage.tsdb.path=/usr/local/bin/prometheus/data \\ --web.enable-admin-api \\ --web.listen-address=:9090 [Install] WantedBy=multi-user.target Keep on mind the \u0026ldquo;prometheus.yml\u0026rdquo; file it\u0026rsquo;s where we need to config our prometheus\n$ sudo systemctl daemon-reload $ sudo systemctl enable prometheus.service $ sudo systemctl start prometheus.service Installing Node Export Go to the official download page and pick up your model here\n\u0026hellip;To be continue\u0026hellip;\n","permalink":"https://jose.castrillo.eu/post/raspberrypi-monitoring-system/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/grafa_prome_rasp.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eOn this post I will explain how I set up a Grafana + Prometheus into a RaspberryPi with \u003ca href=\"https://www.raspberrypi.org/downloads/raspbian/\"\u003eRaspbian\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eHere it\u0026rsquo;s a little design where explains how it is the implementation I did:\u003c/p\u003e\n\u003ch2\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/design_monitoring.png\" alt=\"\"  /\u003e\n\u003c/h2\u003e\n\u003cp\u003e🔵 Server:\nRaspberryPi 3B+\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eServices to install(server side):\n\u003col\u003e\n\u003cli\u003eGrafana\u003c/li\u003e\n\u003cli\u003ePrometheus (Metric collector and database)\u003c/li\u003e\n\u003cli\u003eNode Exporter (collector worker)\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e🟢 Clients:\nRaspberrypi Zero\nFedora Workstation\nDebian VPS\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eServices to install(client side):\n\u003col\u003e\n\u003cli\u003eNode Exporter (collector worker).\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e🔵 Lets start from the \u003cstrong\u003eserver\u003c/strong\u003e side.\u003c/p\u003e","title":"Setup monitoring system [Grafana+Prometheus] in RaspberryPi (Part1)"},{"content":"Format and Mount usb drive in GNU/Linux\nTools/commands:\nlsblk parted df fdisk mkfs wipefs check if which blcok devices used by usb (sd) [df -h, lsblk] eg: a)\n$ sudo fdisk -l Disk /dev/sda: 7.2 GiB, 7736072192 bytes, 15109516 sectors Disk model: DataTraveler 3.0 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x00000000 b)\n# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 7.2G 0 disk mmcblk0 179:0 0 15G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 14.7G 0 part / wipe the entire usb \u0026ndash;YOU WILL LOSE ALL THE USB\u0026rsquo;s DATA\u0026ndash; $ wipefs --all --force /dev/sda create the partition by using parted # parted /dev/sda create partition table (gpt or msdos) you can check by \u0026ldquo;p\u0026rdquo; \u0026ndash; further info about different labels here\u0026ndash; eg: $(parted) mklabel msdos create the partition spanning the entire drive, and check by using \u0026ldquo;p\u0026rdquo; (parted) mkpart primary fat32 0% 100% (parted) p Model: Kingston DataTraveler 3.0 (scsi) Disk /dev/sda: 7736MB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 7735MB 7734MB primary fat32 lba exit from parted [quit] and check the new partition on your system. eg: $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 7.2G 0 disk └─sda1 8:1 1 7.2G 0 part mmcblk0 179:0 0 15G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 14.7G 0 part / build the filesystem by mkfs [mkfs.exfat -n usb /dev/sda1] eg: # mkfs.exfat -n usb /dev/sda1 mkexfatfs 1.3.0 Creating... done. Flushing... done. File system created successfully. create a folder where to mount the devices [mkdir /media/usb-drive] finally mount the usb pointing the folder created [mount /dev/sda1 /media/usb-drive/] $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 7.2G 0 disk └─sda1 8:1 1 7.2G 0 part /media/usb-drive mmcblk0 179:0 0 15G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 14.7G 0 part / Now you have access to the usb by the path: /media/usb-drive/\n","permalink":"https://jose.castrillo.eu/post/mount-usb-gnulinux/","summary":"\u003cp\u003eFormat and Mount usb drive in GNU/Linux\u003c/p\u003e\n\u003cp\u003eTools/commands:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003elsblk\u003c/li\u003e\n\u003cli\u003eparted\u003c/li\u003e\n\u003cli\u003edf\u003c/li\u003e\n\u003cli\u003efdisk\u003c/li\u003e\n\u003cli\u003emkfs\u003c/li\u003e\n\u003cli\u003ewipefs\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003echeck if which blcok devices used by usb (sd) [df -h, lsblk] eg:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ea)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo fdisk -l\nDisk /dev/sda: 7.2 GiB, 7736072192 bytes, 15109516 sectors\nDisk model: DataTraveler 3.0\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: dos\nDisk identifier: 0x00000000\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eb)\u003c/p\u003e","title":"Format \u0026 Mount an usb drive in GNU/Linux [terminal]"},{"content":" On this post we are going to talk about cockpit how to monitoring and manage your GNU/Linux infrastructure. Based on the official description, Cockpit project is pretty easy to use, install and integrate, you can manage and add servers by ssh credentials to your dashboard, showing logs, monitoring containers(podman/docker), services running, disk usage, etc.\nI\u0026rsquo;ve using it around 1 year, the only thing I cannot see it\u0026rsquo;s an alert tool or event trigger, maybe for the next release; is developed by RH team and open source, it\u0026rsquo;s already integrated in some of the GNU/Linux distribution ( RH, debian, ubuntu, fedora, etc).\nYou can get access by a little web terminal console into the web dashboard, pretty nice if you need to issue something additional on that server, in the other hand, container extension and logger tool are really useful, you can pull, stop, start containers by the web interface. Also you have a Starter Kit package where you can develop your own pages/extensions further info here.\nI\u0026rsquo;m not going to explain how to installed because as far as you can see from the official website it\u0026rsquo;s pretty simple and well explained for almost all GNU/Linux distros, below I will mention which packages you need/want to install on your master server and clients.\nServer side: assumed you already installed Cockpit and you have access from: https://ip-address-of-machine:9090\n1.cockpit-dashboard \u0026ndash; little panel where you can see your server integrate on your dashboard (recommended) 2.cockpit-ws \u0026ndash; web service GUI(master server). As well you can install the extension named below(Client-side list). Client side:\n1.cockpit-bridge/stable \u0026ndash; allows you relay message and commands from the webfront end to the server 2.cockpit-docker/stable \u0026ndash; docker integration container management 3.cockpit-networkmanager/stable \u0026ndash; networking management 4.cockpit-packagekit/stable \u0026ndash; develop kit 5.cockpit-pcp/stable,stable \u0026ndash; framework to gather metrics data about the system 6.cockpit-storaged/stable \u0026ndash; to configure and monitor storage, disks, mounts etc. 7.cockpit-system/stable \u0026ndash; manage the system\u0026rsquo;s services from the Cockpit webfront. Further info or troubleshooting have a look over here.\nCockpit works with polkit, it\u0026rsquo;s an application-level toolkit for defining and handling the policy that allows unprivileged processes to speak to privileged processes. In order to have full management control from the Cockpit panel by your user, on my case is \u0026ldquo;pi\u0026rdquo; check out if you are in the requirement groups recommend here check out \u0026ldquo;/etc/groups\u0026rdquo; and \u0026ldquo;/etc/passwd\u0026rdquo;.\nThem from \u0026ldquo;/etc/sudoers.d\u0026rdquo; you need to create a rule to bypass the sudo right to cockpit-bridge, the file have to looks like:\n$ sudo cat /etc/sudoers.d/010_pi-nopasswd pi ALL=(ALL) NOPASSWD: ALL On that way the \u0026ldquo;cockpit-bridge\u0026rdquo; it can run as it needs:\n# ps -aux | grep cockpit pi 421 6.0 0.5 315904 10296 ? Ssl 10:44 0:04 cockpit-bridge root 433 0.0 0.1 10156 3832 ? S 10:44 0:00 /usr/bin/sudo -A cockpit-bridge --privileged root 434 1.6 1.1 317980 23128 ? Sl 10:44 0:01 cockpit-bridge --privileged root 617 0.0 0.0 6144 828 pts/0 S+ 10:46 0:00 grep cockpit In the other hand, if your user doesn\u0026rsquo;t have the sudo permission, beside you can not perform admin action from Cockpit panel, hence you will see this from the terminal:\n$ ps -aux | grep cockpit pi 32583 0.5 0.5 315236 10312 ? Ssl 10:34 0:00 cockpit-bridge pi 32698 0.0 0.0 6144 880 pts/0 S+ 10:37 0:00 grep cockpit ","permalink":"https://jose.castrillo.eu/post/cockpit-monitoring/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/cockpit.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eOn this post we are going to talk about \u003cstrong\u003ecockpit\u003c/strong\u003e how to monitoring and manage your GNU/Linux infrastructure. Based on the official description, \u003ca href=\"https://cockpit-project.org/\"\u003eCockpit\u003c/a\u003e project is pretty easy to use, install and integrate, you can manage and add servers by ssh credentials to your dashboard, showing logs, monitoring containers(podman/docker), services running, disk usage, etc.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve using it around 1 year, the only thing I cannot see it\u0026rsquo;s an alert tool or event trigger, maybe for the next release; is developed by RH team and \u003ca href=\"https://github.com/cockpit-project/cockpit/blob/master/COPYING\"\u003eopen source\u003c/a\u003e, it\u0026rsquo;s already integrated in some of the GNU/Linux distribution ( RH, debian, ubuntu, fedora, etc).\u003c/p\u003e","title":"Monitoring with Cockpit"},{"content":" I\u0026rsquo;m sure you\u0026rsquo;ve heard about Scrcpy! it\u0026rsquo;s a pretty nice tool that allows you to display and control an Android devices from your PC either usb or TCP/IP, hence on this post I will explained how to set up Scrcpy in Fedora 33 by using copr repo. It\u0026rsquo;s really useful, and believe me if I told you that; from one of my last job, one of my colleagues got the idea to install it, and thanks to that the dev team saved a lot of time testing a app integration remotely.\nNOTE: Copr is not yet officially supported by Fedora Infrastructure.\nEnables the copr repo $ sudo dnf copr enable zeno/scrcpy Then install the scrcpy $ sudo dnf install scrcpy Below are the dependencies:\nSDL 2.0.12 libavcodec 58.91.100 libavformat 58.45.100 libavutil 56.51.100 More below, if you will needed them,\n$ sudo dnf install android-tools ffmpeg SDL2-devel ffms2-devel meson On this step we have already Scrcpy installed, lets have a look, connects your android device by usb on your desktop, open a terminal and issue Scrcpy\n$ Scrcpy You should see the window popping up with the Android device\u0026rsquo;s screen on your desktop.\nIf you have more than ones connected, you can use the s flag and select it by its ID\n$ scrcpy -s \u0026lt;ID\u0026gt; Troubleshooting:\nUseful command that shows you if your android device is connected and opened.\n$ adb devices $ lsusb If you get a thread exception, error output below:\nINFO: scrcpy 1.19 \u0026lt;https://github.com/Genymobile/scrcpy\u0026gt; /usr/share/scrcpy/scrcpy-server: 1 file pushed, 0 skipped. 164.7 MB/s (37330 bytes in 0.000s) [server] INFO: Device: Gigaset GS290 (Android 10) INFO: Renderer: opengl INFO: OpenGL version: 4.6 (Compatibility Profile) Mesa 21.1.8 INFO: Trilinear filtering enabled INFO: Initial texture: 1080x2336 WARN: Device disconnected [server] ERROR: Exception on thread Thread[main,5,main] java.lang.IllegalStateException at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method) at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:2792) at com.genymobile.scrcpy.ScreenEncoder.encode(ScreenEncoder.java:114) at com.genymobile.scrcpy.ScreenEncoder.internalStreamScreen(ScreenEncoder.java:95) at com.genymobile.scrcpy.ScreenEncoder.streamScreen(ScreenEncoder.java:61) at com.genymobile.scrcpy.Server.scrcpy(Server.java:80) at com.genymobile.scrcpy.Server.main(Server.java:255) at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:340) I could found the solution by the following git bug issue here\nSome adb commands:\n$ adb devices $ adb kill-server $ adb start-server $ adb --help Remember:\nEnable the Android Debug Bridge(ADB) from your Android device. Thanks to the information found here\n","permalink":"https://jose.castrillo.eu/post/display-android-fedora/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/mirror.jpg\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;m sure you\u0026rsquo;ve heard about \u003ca href=\"https://github.com/Genymobile/scrcpy\"\u003eScrcpy\u003c/a\u003e! it\u0026rsquo;s a pretty nice tool that allows you to display and control an Android devices from your PC either usb or TCP/IP, hence on this post I will explained how to set up Scrcpy in Fedora 33 by using \u003ca href=\"https://pagure.io/copr/copr\"\u003ecopr\u003c/a\u003e repo. It\u0026rsquo;s really useful, and believe me if I told you that; from one of my last job, one of my colleagues got the idea to install it, and thanks to that the dev team saved a lot of time testing a app integration remotely.\u003c/p\u003e","title":"Display Android devices from Linux workstation"},{"content":"From my last post (Arduino-oled-display) I added a new function that allows me to send notification/messages from my terminal (linux) to my Arduino and it shows it through the little Oled screen. Here I will share the commands and code lines to get done the serial communication on your project.\nvoid loop() { while (Serial.available() \u0026gt; 0) { char recieved = Serial.read(); inData += recieved; // Process message when new line character is received if (recieved == \u0026#39;\\n\u0026#39;) { Serial.print(\u0026#34;Arduino Received: \u0026#34;); Serial.print(inData); //digitalWrite(ledPin, HIGH); // if(inData == \u0026#34;HELLO\\n\u0026#34;) { // DON\u0026#39;T forget to add \u0026#34;\\n\u0026#34; at the end of the string. Serial.println(\u0026#34;HELLO\u0026#34;); //digitalWrite(ledPin, LOW); display.clearDisplay(); display.setCursor(0,0); display.setTextSize(2); display.print(\u0026#34;Hi jose!\u0026#34;); display.display(); delay(3000); } inData = \u0026#34;\u0026#34;; // Clear received buffer } } } ","permalink":"https://jose.castrillo.eu/post/arduino-serial-oled/","summary":"\u003cp\u003eFrom my last post (Arduino-oled-display) I added a new function that allows me to send notification/messages from my terminal (linux) to my Arduino and it shows it through the little Oled screen. Here I will share the commands and code lines to get done the serial communication on your project.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eloop\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSerial\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eavailable\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003echar\u003c/span\u003e \u003cspan class=\"n\"\u003erecieved\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSerial\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eread\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003einData\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"n\"\u003erecieved\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// Process message when new line character is received\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecieved\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"sc\"\u003e\u0026#39;\\n\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eSerial\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Arduino Received: \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eSerial\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003einData\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"c1\"\u003e//digitalWrite(ledPin, HIGH);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"c1\"\u003e//\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003einData\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;HELLO\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"c1\"\u003e// DON\u0026#39;T forget to add \u0026#34;\\n\u0026#34; at the end of the string.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003eSerial\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;HELLO\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"c1\"\u003e//digitalWrite(ledPin, LOW);\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eclearDisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003esetCursor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003esetTextSize\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hi jose!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"n\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003edisplay\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"nf\"\u003edelay\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3000\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003einData\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"c1\"\u003e// Clear received buffer\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"Serial communication Arduino"},{"content":" The following post explains how to open and connect your Nextcloud\u0026rsquo;s DB (MariaDB) by a ssh tunnel.\nField description:\nServer side(GNULinux):\nNextcloud: running on Docker-compose engine. OS: Debian with Docker compose installed. Database: MariaDB. Localhost side(GNULinux):\nOS: Fedora. CLient: Dbeader 7.2.5 Further information you can go to my docker compose Statement here.\nEdit your docker-compose.yml and add the \u0026ldquo;ports\u0026rdquo; key into the statement. $ nano docker-compose.yml ports: - 5555:3306 port: 5555 \u0026ndash;\u0026gt; Host. port: 3306 \u0026ndash;\u0026gt; Container. From the above the port \u0026ldquo;5555\u0026rdquo; it was used as example.\nrecreate the Mariadb container. $ docker-compose up -d Into a production scenario you can use the \u0026ldquo;docker-compose up -d\u0026rdquo; it will notice the changed configuration and apply it to that container. Further info about docker-compose up here.\nChecking the new changes:\n$ docker ps | grep nextcloud-mariadb CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8281h2281i2i mariadb \u0026#34;docker-entrypoint.s…\u0026#34; 2 hours ago Up 2 hours 0.0.0.0:5555-\u0026gt;3306/tcp nextcloud-mariadb Open the ssh tunnel connection. Now we can test by the following command:\nssh -N -L a:b:c -p yyyy root@host.domain ssh -N -L 8888:127.0.0.1:5555 -p yyyy root@host.domain N - Tells SSH not to execute a remote command. L - Creates a local port forwarding. p - ssh port a(8888) - Host port. b(localhost) - Localhost IP. c(5555) - remote port. Setup Dbeaver connection. Above Main configuration, you have to fill up the database\u0026rsquo;s user credentials.\nFrom the above capture I pointed up each field needed with a pepper:\nHost/IP: server IP. Port: server ssh port. User name: server user. Private key: here you can copy and paste the id_rsa path.(localmachine) Localhost: 127.0.0.1 Local Port: a local port (localmachine)(eg:8888) Remote Host: server IP. Remote port: server port(eg:5555). And it\u0026rsquo;s done, if you have any issue with the connection, you have to check out the firewall configuration from each endpoints, as well have a look into \u0026ldquo;/etc/ssh/sshd_config\u0026rdquo; from server side, the following command it\u0026rsquo;s recommended to troubleshooting any issue netstat eg:\n# netstat -tu # netstat netstat -tulpn | grep LISTEN ","permalink":"https://jose.castrillo.eu/post/dbeaver-nextcloud-mariadb/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/nextcloud-dbeaver.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eThe following post explains how to open and connect your Nextcloud\u0026rsquo;s DB (MariaDB) by a ssh tunnel.\u003c/p\u003e\n\u003cp\u003eField description:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eServer side(GNULinux):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNextcloud: running on Docker-compose engine.\u003c/li\u003e\n\u003cli\u003eOS: Debian with Docker compose installed.\u003c/li\u003e\n\u003cli\u003eDatabase: MariaDB.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLocalhost side(GNULinux):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOS: Fedora.\u003c/li\u003e\n\u003cli\u003eCLient: Dbeader 7.2.5\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFurther information you can go to my docker compose Statement \u003ca href=\"https://help.nextcloud.com/t/nexcloud-deployment-by-docker-compose/90660\"\u003ehere\u003c/a\u003e.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eEdit your docker-compose.yml and add the \u0026ldquo;ports\u0026rdquo; key into the statement.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ nano docker-compose.yml\n  ports:\n    - 5555:3306\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eport: 5555 \u0026ndash;\u0026gt; Host.\u003c/li\u003e\n\u003cli\u003eport: 3306 \u0026ndash;\u0026gt; Container.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFrom the above the port \u0026ldquo;5555\u0026rdquo; it was used as example.\u003c/p\u003e","title":"Open a Nextcloud's DB through a ssh connection"},{"content":" Following the last post, where I shared how to use Telegram\u0026rsquo;s bot; on this post I\u0026rsquo;m going to explain how implement it by Chat Nextcloud API. This post is useful for those have a Nexctcloud deployment running at home/cloud.\nAssuming you have already Nextcloud up and running, we can create the new user, that we are gonna use it as \u0026ldquo;BOT\u0026rdquo; we will need the chat room token and the \u0026ldquo;BOT\u0026rdquo; credentials.\nThe Talk app I have installed is 10.0.1 you can check it by your app repository from your administrator account or by the following command through Nextcloud server app:\n$ php /var/www/html/occ app:list | grep \u0026#34;spreed\u0026#34; - spreed: 10.0.1 Create a new room chat between you and your \u0026ldquo;BOT\u0026rdquo;, it will give you the token, eg: https://hostname.domain/call/tokenid Test it by curl the API response, thus the REST API it will be something like: https://host.domain/ocs/v2.php/apps/spreed/api/v1/chat/tokenid\nI tested it sending a message by the following POST method:\ncurl -d \u0026#39;{\u0026#34;token\u0026#34;:\u0026#34;tokenid\u0026#34;, \u0026#34;message\u0026#34;:\u0026#34;hello world\u0026#34;}\u0026#39; -H \u0026#34;Content-Type: application/json\u0026#34; -H \u0026#34;Accept:application/json\u0026#34; -H \u0026#34;OCS-APIRequest:true\u0026#34; -u \u0026#34;user:password\u0026#34; https://host.domain/ocs/v1.php/apps/spreed/api/v1/chat/tokenid 2\u0026gt; /dev/null | \u0026gt; /dev/null remembers the: OCS-APIRequest:true flag more info over \u0026ndash;\u0026gt; here\nCreate your own script Below it will be the script where we can call in order to send whenever we want to sent\neg:\n$ nano sender.sh Copy, and fill it with your own data:\n#!/bin/bash API=https://hostname.domain.com/ocs/v2.php/apps/spreed/api/v1/chat/tokenid LOGIN=\u0026#34;user:password\u0026#34; MESSAGE=$1 curl -d \u0026#39;{\u0026#34;token\u0026#34;:\u0026#34;xxxxxxxx\u0026#34;, \u0026#34;message\u0026#34;:\u0026#34;\u0026#39;\u0026#34;$MESSAGE\u0026#34;\u0026#39;\u0026#34;}\u0026#39; -H \u0026#34;Content-Type: application/json\u0026#34; -H \u0026#34;Accept:application/json\u0026#34; -H \u0026#34;OCS-APIRequest:true\u0026#34; -u \u0026#34;$LOGIN\u0026#34; $API 2\u0026gt; /dev/null | \u0026gt; /dev/null Set the execution permission\n$ chmod 755 sender.sh Now we can test it:\n$ ./sender.sh \u0026#34;Hello Word\u0026#34; ","permalink":"https://jose.castrillo.eu/post/bot-nextcloud-api/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/donatello.png#center\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eFollowing the last post, where I shared how to use Telegram\u0026rsquo;s bot; on this post I\u0026rsquo;m going to explain how implement it by Chat \u003cem\u003eNextcloud API\u003c/em\u003e. This post is useful for those have a \u003cem\u003eNexctcloud\u003c/em\u003e deployment running at home/cloud.\u003c/p\u003e\n\u003cp\u003eAssuming you have already Nextcloud up and running, we can create the new user, that we are gonna use it as \u0026ldquo;BOT\u0026rdquo; we will need the chat room token and the \u0026ldquo;BOT\u0026rdquo; credentials.\u003c/p\u003e","title":"Nextcloud bot as Notification System"},{"content":"From one older post \u0026ldquo;Create a job using crontab\u0026rdquo; I used into my script the service exim4/ssmtp as mail server using gmail, but as we\u0026rsquo;re trying to walk away of Google\u0026rsquo;s jaw, I switched my notification engine to Telegram by an API service(bot)\u0026hellip; almost it\u0026rsquo;s a step forward ! :)\nRequirement:\nBot (Telegram) Web Browser Terminal(script) I will assume you have already set up your Bot on Telegram with BotFather\nWhen you have already created your Bot you can check by the API through a web browser\nhttps://api.telegram.org/botxxxxxxxxx:YYYYYYYYYYYYYYYYYY/getMe\nThe output it will be like:\nok\ttrue result id\txxxxxxxxx is_bot\ttrue first_name\t\u0026#34;bot_name\u0026#34; username\t\u0026#34;bot_username\u0026#34; can_join_groups\ttrue can_read_all_group_messages\tfalse supports_inline_queries\tfalse Telegram API fields you should know:\n/botxxxxxxxxx:YYYYYYYYYYYYYYYYYY/ the identity of your bot chat_id=xxxxxxxxxx this is the ID of your chat The method to use is sendMessage from the Telegram official page we can see that the structure to send it is the following(by curl):\neg: From bot to me(private)\ncurl \u0026#39;https://api.telegram.org/botxxxxxxxxx:YYYYYYYYYYYYYYYYYY/sendMessage?chat_id=357214926\u0026amp;text=hello_this_is_a_test\u0026#39; eg: From bot to a group\ncurl \u0026#39;https://api.telegram.org/botxxxxxxxxx:YYYYYYYYYYYYYYYYYY/sendMessage?chat_id=-380927924\u0026amp;text=hello_this_is_a_test\u0026#39; Below you will see a little script I made to wrap the message and call the job to sender.\nMessenger script:\n#!/bin/bash GROUP_ID=-xxxxxxxxxxxx BOT_TOKEN=zzzzzzzzzzzzz:YYYYYYYYYYYYYYYY curl -s --data \u0026#34;text=$1\u0026#34; --data \u0026#34;chat_id=$GROUP_ID\u0026#34; \u0026#39;https://api.telegram.org/bot\u0026#39;$BOT_TOKEN\u0026#39;/sendMessage\u0026#39; \u0026gt; /dev/null sh ./home/scripts/my_messenger \u0026#34;\u0026#34; Testing command:\nsh ./home/scripts/my_messenger \u0026#34;Hello, I\u0026#39;m a bot\u0026#34; Here we got our own bot as sender, also you can use other method (getUpdates) described into the official Telegram documentation where you can send tasks to your bot.\n","permalink":"https://jose.castrillo.eu/post/bot-telegram-linux/","summary":"\u003cp\u003eFrom one older post \u0026ldquo;Create a job using crontab\u0026rdquo; I used into my script the service exim4/ssmtp as mail server using gmail, but as we\u0026rsquo;re trying to walk away of Google\u0026rsquo;s jaw, I switched my notification engine to Telegram by an API service(bot)\u0026hellip; almost it\u0026rsquo;s a step forward ! :)\u003c/p\u003e\n\u003cp\u003eRequirement:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eBot (Telegram)\u003c/li\u003e\n\u003cli\u003eWeb Browser\u003c/li\u003e\n\u003cli\u003eTerminal(script)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eI will assume you have already set up your Bot on Telegram with \u003ca href=\"https://core.telegram.org/bots\"\u003eBotFather\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWhen you have already created your Bot you can check by the API through a web browser\u003c/p\u003e","title":"Telegram Bot as Notification System"},{"content":"Below you will see the statement I used to deploy a Wordpress as db mariadb (mysql); I shared it to you, cos I\u0026rsquo;ve been looking out for a good .yml statement piece, but some of them are older or put other set frontend as nginx, etc. I did a simple and easier deployment statement, so here we have:\nversion: \u0026#39;3.3\u0026#39; services: wordpress: depends_on: - db image: wordpress:latest volumes: - ./html:/var/www/html ports: - \u0026#34;8080:80\u0026#34; restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: password links: - db depends_on: - db db: image: mariadb:10.5.4-focal volumes: - ./db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: SECRET MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: password ports: - \u0026#34;3306:3306\u0026#34; You can switch the local mount to volume mount it will depend of you design.\nHope it can be useful to you\n","permalink":"https://jose.castrillo.eu/post/wordpress-mariadb-docker/","summary":"\u003cp\u003eBelow you will see the statement I used to deploy a \u003ca href=\"https://hub.docker.com/_/wordpress\"\u003eWordpress\u003c/a\u003e as db \u003ca href=\"https://hub.docker.com/_/mariadb\"\u003emariadb\u003c/a\u003e (mysql); I shared it to you, cos I\u0026rsquo;ve been looking out for a good .yml statement piece, but some of them are older or put other set frontend as nginx, etc. I did a simple and easier deployment statement, so here we have:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yml\" data-lang=\"yml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;3.3\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"nt\"\u003ewordpress\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e- \u003cspan class=\"l\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewordpress:latest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e- \u003cspan class=\"l\"\u003e./html:/var/www/html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;8080:80\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealways\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"nt\"\u003eWORDPRESS_DB_HOST\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edb:3306\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"nt\"\u003eWORDPRESS_DB_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewordpress\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"nt\"\u003eWORDPRESS_DB_PASSWORD\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003elinks\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e- \u003cspan class=\"l\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003edepends_on\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e- \u003cspan class=\"l\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"nt\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emariadb:10.5.4-focal\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e- \u003cspan class=\"l\"\u003e./db_data:/var/lib/mysql\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ealways\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"nt\"\u003eMYSQL_ROOT_PASSWORD\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSECRET\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"nt\"\u003eMYSQL_DATABASE\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewordpress\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"nt\"\u003eMYSQL_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ewordpress\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"nt\"\u003eMYSQL_PASSWORD\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epassword\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;3306:3306\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eYou can switch the local mount to volume mount it will depend of you design.\u003c/p\u003e","title":"How to deploy Wordpress + Mariadb using Docker"},{"content":" Requisitos:\nRaspberryPi \u0026ndash;\u0026gt; https://www.raspberrypi.org/downloads/raspberry-pi-os/ OpenVPN \u0026ndash;\u0026gt; https://pivpn.io/ Cuenta abierta \u0026ndash;\u0026gt; https://www.noip.com/ Una IP Estatica en tu Raspberry \u0026ndash;\u0026gt; Router manual Router con capacidad de tunel VPN \u0026mdash;\u0026gt; IPsec, PPTP, L2TP. Public IP \u0026mdash;\u0026gt; https://www.whatismyip.net/ Pasos:\n1. Crear DNS Record A en Noip Apunta tu IP publica Abre tu sesion con tus credenciales en Noip Dentro del Dashboard ve al apartado \u0026ldquo;Dynamic DNS \u0026gt; Create Hostname\u0026rdquo; rellena: hostname, ejemplo: test Domain, ejemplo: ddns.net IPv4 address: Tu IP publica Click en Crear Al finalizar obtendremos el siguiente Registro DNS A: test.ddns.net (ejemplo)\n2. Instalar OpenVPN Abre el terminal y ejecuta el siguiente comando:\ncurl -L https://install.pivpn.io | bash Cargara un mensaje de instalacion de paquetes y luego preguntara:\nEl default user: \u0026ldquo;pi\u0026rdquo; o el usuario que has creado. Habilitar unattended upgrades: \u0026ldquo;Yes\u0026rdquo; Protocolo de comunicacion: \u0026ldquo;UDP\u0026rdquo; Puerto de comunicacion: \u0026ldquo;1194 (default)\u0026rdquo;\u0026quot; - por seguridad cambiar el numero de Puerto. Habilitar Elliptic Curves: \u0026ldquo;Yes\u0026rdquo; ECDSA encryption strength: \u0026ldquo;256-bit\u0026rdquo; Public IP or DNS: \u0026ldquo;Use a public DNS\u0026rdquo; Public DNS: test.ddns.net ( ingresa el Hostname configurado en tu cuenta Noip.com) DNS provider: elige el provedor DNS de tu gusto ( en mi caso OpenDNS) Instalacion completada, el programa pedira: 1. reiniciar el sistema, 2. ejecutar el comando: \u0026ldquo;pivpn add\u0026rdquo; para crear un perfil ovpn.\n3. Crear cliente .ovpn Ejecuta:\npivpn add Client name: nombre de usuario de conexion vpn, por ejemplo: vpn_user1 Password: crea la password. El perfil creado sera guardado en el directorio:\n/home/pi/ovpns/ Para confirmar puedes usar un \u0026ldquo;ls\u0026rdquo;\nls /home/pi/ovpns/ Dentro de la carpeta encontraras tu archivo .ovpn ( credenciales) para poder usarlo en los dispositivos clientes.\n4. Habilitar Router para tunel VPN + Noip DNS En mi caso tengo un Router Linksys que me permite configurar mi provedor DNS apuntando a mi Hostname con mis credenciales del Noip tambien puedo habilitar IPSec y abrir el puerto apuntando la ip del RaspberryPi.\nNOTA: Revisar la configuracion de la tabla de IPtables\nsudo iptables -L Para mas informacion de como abrir puertos por Iptables puedes visitar el siguiente enlace\nOtro util comando para ver los puertos dentro de tu RaspberryPi:\nsudo netstat -tulpn Enlances:\nVideo tutorial usando Noip en RaspberryPi como servicio \u0026ndash;\u0026gt; link\n","permalink":"https://jose.castrillo.eu/post/openvpn-raspberrypi/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/openvpn-raspberry.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eRequisitos:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRaspberryPi \u0026ndash;\u0026gt; \u003ca href=\"https://www.raspberrypi.org/downloads/raspberry-pi-os/\"\u003ehttps://www.raspberrypi.org/downloads/raspberry-pi-os/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOpenVPN \u0026ndash;\u0026gt; \u003ca href=\"https://pivpn.io/\"\u003ehttps://pivpn.io/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCuenta abierta \u0026ndash;\u0026gt; \u003ca href=\"https://www.noip.com/\"\u003ehttps://www.noip.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUna IP Estatica en tu Raspberry \u0026ndash;\u0026gt; Router manual\u003c/li\u003e\n\u003cli\u003eRouter con capacidad de tunel VPN \u0026mdash;\u0026gt; IPsec, PPTP, L2TP.\u003c/li\u003e\n\u003cli\u003ePublic IP \u0026mdash;\u0026gt; \u003ca href=\"https://www.whatismyip.net/\"\u003ehttps://www.whatismyip.net/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePasos:\u003c/p\u003e\n\u003ch3 id=\"1-crear-dns-record-a-en-noip\"\u003e1. Crear DNS Record A en Noip\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eApunta tu \u003ca href=\"https://www.whatismyip.net/\"\u003eIP publica\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAbre tu sesion con tus credenciales en \u003ca href=\"https://www.noip.com/\"\u003eNoip\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDentro del Dashboard ve al apartado \u003cstrong\u003e\u0026ldquo;Dynamic DNS \u0026gt; Create Hostname\u0026rdquo;\u003c/strong\u003e rellena:\n\u003cul\u003e\n\u003cli\u003ehostname, ejemplo: \u003cem\u003etest\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eDomain, ejemplo: \u003cem\u003eddns.net\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eIPv4 address: \u003cstrong\u003eTu IP publica\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eClick en \u003cstrong\u003eCrear\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/openvpn-noip.png\" alt=\"\"  /\u003e\n\u003c/p\u003e","title":"OpenVPN usando Raspberry Pi3 + Noip"},{"content":" Into my Devops learning path 👨‍💻 I decided to deploy a monitoring centre into my workstation where I could be able to watch my containers, resources, logs, etc and continue improving my knowledge, in my case I\u0026rsquo;m using Silverblue developed by Fedora so in here it\u0026rsquo;s a little bit different the setup; as monitoring tool I choose Cockpit for its great integration and support.\nWorkstation: Silverblue 🖥️ Container engine: Podman ⚙️ Monitoring tool(app/service):Cockpit 📦 I splinted out the instructions in 4 simple parts:\nDownload. Installation. Implementation. Integration. 1. Download Go to the official website and follow the instructions wrote on this part we need to add those packages into our immutable system 🤖.\nrpm-ostree install cockpit-system cockpit-ostree cockpit-podman You can add more extension if you needed it, like kdump, network-manager,etc.\nReboot the system to boot with the need deployment layer implemented.\nsystemctl reboot Then when you are already login, checks out the packages are been implemented in your new deployment by typing:\nrmp-ostree status You will see something like:\nDeployments: ● ostree://fedora:fedora/31/x86_64/silverblue Version: 31.20200703.0 (2020-07-03T00:46:58Z) BaseCommit: b32ee7c7e67c096fadfd116b7cc1602ad45c68210d99d0d0734a295d4f64dde1 GPGSignature: Valid signature by 7D22D5867F2A4236474BF7B850CB390B3C3359C4 RemovedBasePackages: firefox 77.0.1-2.fc31 LayeredPackages: cockpit-networkmanager cockpit-ostree cockpit-podman cockpit-system dnf fedora-workstation-repositories 2. Installation Here we are gonna to setup and run our container as Root\n# podman container runlabel --name cockpit-ws RUN cockpit/ws Test the service is up and running from your web browser http://localhost:9090 (the connection is done by ssh so make sure the sshd service is running)\nsystemctl status sshd systemctl start sshd 3. Implementation Create the cockpit.service from the path: /etc/systemd/system/cockpit.service\neg:\n[Unit] Description=cockpit container monitoring [Service] Restart=on-failure Killmode=none ExecStart=/usr/bin/podman start -a cockpit-ws ExecStop=/usr/bin/podman stop -t 2 cockpit-ws SuccessExitStatus=143 [Install] WantedBy=multi-user.target 4. Integration Back to the official site we set the last step to start the cockpit on boot. As root:\n#podman container runlabel INSTALL cockpit/ws and enable the service\n#systemctl enable cockpit.service And here we are, our monitoring tool up and running by podman, in fact the nicer extension I liked when I tested it was cockpit-podman works really nice.\nHope this post it can be useful.\n","permalink":"https://jose.castrillo.eu/post/podman-monitoring-systemd/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/cockpit-fedora.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eInto my Devops learning path 👨‍💻 I decided to deploy a monitoring centre into my workstation where I could be able to watch my containers, resources, logs, etc and continue improving my knowledge, in my case I\u0026rsquo;m using \u003ca href=\"https://silverblue.fedoraproject.org/\"\u003eSilverblue\u003c/a\u003e developed by Fedora so in here it\u0026rsquo;s a little bit different the setup; as monitoring tool I choose \u003ca href=\"https://cockpit-project.org\"\u003eCockpit\u003c/a\u003e for its great integration and support.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWorkstation: Silverblue 🖥️\u003c/li\u003e\n\u003cli\u003eContainer engine: Podman ⚙️\u003c/li\u003e\n\u003cli\u003eMonitoring tool(app/service):Cockpit 📦\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI splinted out the instructions in 4 simple parts:\u003c/p\u003e","title":"Setup Podman service in Silverblue by Systemd"},{"content":"Resume to set a domain name in Linux\nconcepts:\nFQDN (Fully Qualified Domain Name) eg:\nhostname = server1 // FQDN = server1.example.com\n1. First add FQDN to your hostname in /etc/hosts file. # cat /etc/hosts 10.120.68.23 server1.example.com server1 confirm the FQDN issue the following command:\n# hostname -f server1.example.com 2.1. Configure domain name (Red Hat RHEL, Fedora and CentOS) From these path add the parameters needs\nvi /etc/sysconfig/network DOMAINNAME=\u0026lt;domainname\u0026gt; vi /etc/sysctl.conf kernel.domainname = \u0026lt;domainname\u0026gt; 2.2. figure domain name ( Ubuntu, Debian) #vi /etc/hostname server1 Then restart the service:\n# service hostname restart 3. add the domain in resolv.conf vi /etc/resolv.conf search example.com 4. check up everything is already config: Your server’s hostname\n# hostname server1 Your FQDN\n# hostname -f server1.example.com Your domain name of the server!\n# dnsdomainname example.com Post Based:\nBlog\n","permalink":"https://jose.castrillo.eu/post/domain-name-linux/","summary":"\u003cp\u003eResume to set a domain name in Linux\u003c/p\u003e\n\u003cp\u003econcepts:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eFQDN\u003c/strong\u003e (Fully Qualified Domain Name)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eeg:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ehostname\u003c/strong\u003e = server1 //\n\u003cstrong\u003eFQDN\u003c/strong\u003e = server1.example.com\u003c/p\u003e\n\u003ch3 id=\"1-first-add-fqdn-to-your-hostname-in-etchosts-file\"\u003e1. First add FQDN to your hostname in /etc/hosts file.\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# cat /etc/hosts\n10.120.68.23 server1.example.com server1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003econfirm the FQDN issue the following command:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# hostname -f\nserver1.example.com\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"21-configure-domain-name-red-hat-rhel-fedora-and-centos\"\u003e2.1. Configure domain name (Red Hat RHEL, Fedora and CentOS)\u003c/h3\u003e\n\u003cp\u003eFrom these path add the parameters needs\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evi /etc/sysconfig/network\nDOMAINNAME=\u0026lt;domainname\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evi /etc/sysctl.conf\nkernel.domainname = \u0026lt;domainname\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"22-figure-domain-name--ubuntu-debian\"\u003e2.2. figure domain name ( Ubuntu, Debian)\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#vi /etc/hostname\nserver1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen restart the service:\u003c/p\u003e","title":"How to set your Domain name in Linux"},{"content":" On this post I\u0026rsquo;ll explaining how to setup a little OLED screen 128X64 on Arduino Leonardo\nTools:\nChit: Arduino Leonardo Screen: Led OLED display 128x64 bought here Workstation: Silverblue Fedora 33 Compiler: Arduino IDE Over here you can see the connection diagram.\nSteps:\nInstall the Arduino IDE from Flathub repo. Now you have the flatpak Arduino app, below you will see older information related to a bug of the last Arduino Flatpak version, but now it fixed. Please continue with the 3th step. 2. Launch the Arduino IDE:\n- As root (not recommended):\n$ su\n# flatpak run cc.arduino.arduinoide\n- As not root:\n$ flatpak run cc.arduino.arduinoide\nNOTE: if the Arduino IDE reports that it can not read the mount folder at /dec/tty\u0026hellip; please take a look on this workaround more detail from Flatpak official documentation.\nCheck out the permission on that folder created by Arduino IDE:\n$ ls -l /dev/ttyACM0\ncrw-rw----. 1 root dialout 166, 0 Aug 24 20:54 ttyACM0\nAs you can see above the r/w permission are just allowed to owner and groups, so I granted the permission to \u0026ldquo;everyone\u0026rdquo;.\nYou must be aware about the security\u0026rsquo;s implication doing this:\n# chmod 666 ttyACM1\n$ ls -l ttyACM0 crw-rw-rw-. 1 root dialout 166, 0 Aug 24 20:54 ttyACM0\nFinally when you have opened the Arduino IDE, copy and paste the code below: NOTE: you can download the missing library through the Arduino IDE.\n#include \u0026lt;Adafruit_SH1106.h\u0026gt; #include \u0026lt;Adafruit_Sensor.h\u0026gt; #include \u0026#34;DHT.h\u0026#34; #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 Adafruit_SH1106 display(OLED_RESET); #define DHTPIN A0 // // Uncomment the type of sensor in use: #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); dht.begin(); display.begin(SH1106_SWITCHCAPVCC, 0x3C); delay(2000); display.clearDisplay(); display.setTextColor(WHITE); } void loop() { delay(5000); // 5 seg delay //read temperature and humidity float t = dht.readTemperature(); float h = dht.readHumidity(); if (isnan(h) || isnan(t)) { Serial.println(\u0026#34;Failed to read from DHT sensor!\u0026#34;); } //clear display display.clearDisplay(); // display temperature display.setTextSize(1); display.setCursor(0,0); display.print(\u0026#34;Temperature: \u0026#34;); display.setTextSize(2); display.setCursor(0,10); display.print(t); display.print(\u0026#34; \u0026#34;); display.setTextSize(1); display.cp437(true); display.write(167); display.setTextSize(2); display.print(\u0026#34;C\u0026#34;); // display humidity display.setTextSize(1); display.setCursor(0, 35); display.print(\u0026#34;Humidity: \u0026#34;); display.setTextSize(2); display.setCursor(0, 45); display.print(h); display.print(\u0026#34; %\u0026#34;); // print funtion, further detail into Adafruit library display.display(); } Library\nGood post (in Spanish): http://www.playbyte.es/electronica/arduino/display-oled-1-3-i2c/\n","permalink":"https://jose.castrillo.eu/post/arduino-oled-display/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/i2c-oled.jpg\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eOn this post I\u0026rsquo;ll explaining how to setup a little OLED screen 128X64 on Arduino Leonardo\u003c/p\u003e\n\u003cp\u003eTools:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eChit: \u003ca href=\"https://www.arduino.cc/en/Main/Arduino_BoardLeonardo\"\u003eArduino Leonardo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eScreen: Led OLED display 128x64 bought \u003ca href=\"https://www.amazon.es/gp/product/B078J78R45/\"\u003ehere\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWorkstation: \u003ca href=\"https://silverblue.fedoraproject.org/\"\u003eSilverblue\u003c/a\u003e Fedora 33\u003c/li\u003e\n\u003cli\u003eCompiler: \u003ca href=\"https://flathub.org/apps/details/cc.arduino.arduinoide\"\u003eArduino IDE\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOver \u003ca href=\"https://cdn.shopify.com/s/files/1/1509/1638/files/1.3_Zoll_OLED_Connection_Diagrams.pdf?v=1606158613\"\u003ehere\u003c/a\u003e you can see the connection diagram.\u003c/p\u003e\n\u003cp\u003eSteps:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eInstall the \u003ca href=\"https://flathub.org/apps/details/cc.arduino.arduinoide\"\u003eArduino IDE\u003c/a\u003e from Flathub repo.\u003c/li\u003e\n\u003cli\u003eNow you have the flatpak Arduino app, below you will see older information related to a bug of the last Arduino Flatpak version, \u003cem\u003ebut now it fixed\u003c/em\u003e. \u003cstrong\u003ePlease continue with the 3th step.\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cdel\u003e2. Launch the Arduino IDE:\u003c/del\u003e\u003c/p\u003e","title":"Display OLED Arduino"},{"content":" LineageOS17.1 in Xiaomi A2 Lite (Daisy)\nThe follow instructions are done by adb and twrp commands line.\nOS used: Windows 10\nRequirement:\nadb fastboot tool USB drivers Xiaomi driver Set into your android device:\nUSB debugging option enable. Disable Encryption on the phone (DisableForceEncryption.zip) Packages(download and leave the installation packages into your mobile SD):\nLineageOS 17.1 for Xiaomi \u0026ldquo;Daisy\u0026rdquo; TWRP GApps Press the dlower button + power button to boot in Plug the mobile on your pc. Open adb terminal tool (C:\\Program Files (x86)\\Minimal ADB and Fastboot\\cmd-here.exe) and test it by: adb devices Fastboot boot twrp.img \u0026ndash;\u0026gt; in my case I use: twrp-daisy-3.3.1-0-offain.img it worked for my device :) Make sure to create a backup (System, Data and Boot). Then wipe the data partition, cache partition and the system partition (on this step you will lose all your data). adb shell twrp wipe data twrp wipe cache twrp wipe system Install LineageOS17 image by TWRP commands and restart to TWRP mode again. twrp install /external_sd/LineageOS17/lineage-17.1-20200413-UNOFFICIAL-daisy.zip exit adb reboot bootloader Install Gapps (google play market) adb shell twrp install /external_sd/LineageOS17/BiTGApps-arm64-10.0.0-v0.6_signed.zip exit switch to slot if you are been in the A slot now switch boot onto B fastboot getvar current-slot --to know which slot you are fastboot set_active b -- If you were at A slot so switch to B adb reboot Below I left a couple of links were useful for me; I strong recommended to backup all your data before to start, as well as count with other phone in case you get in trouble with the installation.\nadb and fastboot twrp commands I used\nadb devices adb reboot bootloader fastboot getvar current-slot fastboot set_active b fastboot boot xxxxx adb shell twrp wipe data twrp wipe cache twrp wipe system twrp install /external_sd/LineageOS17/lineage-17.1-20200413-UNOFFICIAL-daisy.zip adb reboot bootloader twrp install /external_sd/LineageOS17/BiTGApps-arm64-10.0.0-v0.6_signed.zip adb reboot Thanks to: reujea0 \u0026amp; forum.xda-developers\nLinks:\nhttps://www.cyanogenmods.org/forums/topic/lineageos-17-1-mi-a2-lite/ https://www.getdroidtips.com/lineageos-17-gapps/ https://www.pocketables.com/2014/10/using-twrps-new-adb-interface.html https://www.reddit.com/r/LineageOS/comments/d0tskr/fastboot_error_failed_to_identify_current_slot/ https://forum.xda-developers.com/smartwatch/zenwatch-3/guide-reboot-recovery-fastboot-unlock-t3546743 https://twrp.me/faq/openrecoveryscript.html https://android.stackexchange.com/questions/196315/is-it-possible-to-install-a-rom-from-twrp-adb-shell ","permalink":"https://jose.castrillo.eu/post/lineageos17-xiaomi/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/LineageOS-17.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eLineageOS17.1 in Xiaomi A2 Lite (Daisy)\u003c/p\u003e\n\u003cp\u003eThe follow instructions are done by adb and twrp commands line.\u003c/p\u003e\n\u003cp\u003eOS used: Windows 10\u003c/p\u003e\n\u003cp\u003eRequirement:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eadb fastboot tool\u003c/li\u003e\n\u003cli\u003eUSB drivers\u003c/li\u003e\n\u003cli\u003eXiaomi driver\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSet into your android device:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUSB debugging option enable.\u003c/li\u003e\n\u003cli\u003eDisable Encryption on the phone (DisableForceEncryption.zip)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePackages(download and leave the installation packages into your mobile SD):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLineageOS 17.1 for Xiaomi \u0026ldquo;Daisy\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eTWRP\u003c/li\u003e\n\u003cli\u003eGApps\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003ePress the dlower button + power button to boot in\u003c/li\u003e\n\u003cli\u003ePlug the mobile on your pc.\u003c/li\u003e\n\u003cli\u003eOpen adb terminal tool (C:\\Program Files (x86)\\Minimal ADB and Fastboot\\cmd-here.exe) and test it by: adb devices\u003c/li\u003e\n\u003cli\u003eFastboot boot twrp.img \u0026ndash;\u0026gt; in my case I use: \u003cstrong\u003etwrp-daisy-3.3.1-0-offain.img\u003c/strong\u003e it worked for my device :)\u003c/li\u003e\n\u003cli\u003eMake sure to create a backup (System, Data and Boot).\u003c/li\u003e\n\u003cli\u003eThen wipe the data partition, cache partition and the system partition (on this step you will lose all your data).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eadb shell\n\ntwrp wipe data\ntwrp wipe cache\ntwrp wipe system\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"7\"\u003e\n\u003cli\u003eInstall LineageOS17 image by TWRP commands and restart to TWRP mode again.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etwrp install /external_sd/LineageOS17/lineage-17.1-20200413-UNOFFICIAL-daisy.zip\nexit\nadb reboot bootloader\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"8\"\u003e\n\u003cli\u003eInstall Gapps (google play market)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eadb shell\ntwrp install /external_sd/LineageOS17/BiTGApps-arm64-10.0.0-v0.6_signed.zip\nexit\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"9\"\u003e\n\u003cli\u003eswitch to slot if you are been in the A slot now switch boot onto B\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efastboot getvar current-slot  --to know which slot you are\nfastboot set_active b  -- If you were at A slot so switch to B\nadb reboot\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBelow I left a couple of links were useful for me; I strong recommended to backup all your data before to start, as well as count with other phone in case you get in trouble with the installation.\u003c/p\u003e","title":"LineageOS 17.1 in Xiaomi A2 Lite (Daisy)"},{"content":" I\u0026rsquo;ve been looking for a encryptation app open source, to encrypt my files into Cloud with a touch of off-online control, and I found this nice app called Cryptomator. I downloaded the extension .Appimage, so the following instruction I will explain is how to set the .appimage into the app menu in Gnome.\nDownload the Cryptomator by the link above.\nSet the permission below:\n#chmod a+x cryptomator-1.4.15-x86_64.AppImage The try to execute the file by a shell terminal or just double click on it ( to confirm it was downloaded fined)\nBy terminal:\n$./home/user/Download/cryptomator-1.4.15-x86_64.AppImage Then following the official documentation we can grab the sample file: Path: /usr/share/applications/\n[Desktop Entry] Type=Application Encoding=UTF-8 Name=Sample Application Name Comment=A sample application Exec=application Icon=application.png Terminal=false Then create the .desktop file using a text editor eg: vi, nano,etc. I rather prefer vi so\n#vi /usr/share/applications/cryptomator.desktop In my case I left my .desktop file like this:\n$cat /usr/share/applications/cryptomator.desktop [Desktop Entry] Name=cryptomator Comment=Free client-side encryption for your cloud files Exec=/usr/bin/cryptomator.AppImage Terminal=false Icon=/usr/bin/cryptomator.png Type=Application Categories=Security; Version=1.0 Permission \u0026amp; Owner; over here we can set the same permission that those apps If we do ls\n$ ls -all /usr/share/applications/ We can see the following permission output:\n-rw-r\u0026ndash;r\u0026ndash;. 1 root root xxxxxxx what does it mean ?\nUser: -wr -\u0026gt; Means that the file is readable and writeable to user. Group: r\u0026ndash; -\u0026gt; Means that the file is readable to group Other: r\u0026ndash; -\u0026gt; Means that the file is readable to other. Setting the permission:\nrwx rwx rwx 110 100 100 644\n# chmod 644 /usr/share/applications/cryptomator.desktop And finally the ownership:\n$sudo chown root:root /usr/share/applications/cryptomator.desktop To end we need to add the image.png so here you can download and copy to a path you want in my case I dropped it into the same path /usr/share/applications/\nenjoy. :)\n","permalink":"https://jose.castrillo.eu/post/desktop-gnome-app/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/cryptomator.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been looking for a encryptation app open source, to encrypt my files into Cloud with a touch of off-online control, and I found this nice app called \u003ca href=\"https://cryptomator.org/\"\u003eCryptomator\u003c/a\u003e. I downloaded the extension \u003ca href=\"https://appimage.org/\"\u003e.Appimage\u003c/a\u003e, so the following instruction I will explain is how to set the .appimage into the app menu in Gnome.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eDownload the Cryptomator by the link above.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSet the permission below:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#chmod a+x cryptomator-1.4.15-x86_64.AppImage\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe try to execute the file by a shell terminal or just double click on it ( to confirm it was downloaded fined)\u003c/p\u003e","title":"Add your app into the Gnome Desktop Menu"},{"content":"This is a documentation I\u0026rsquo;ve made time ago searching some open source tools and platforms(\u0026amp; freeware), I hope It can be useful to you:\nTicketing https://www.graylog.org/ Monitoring / Open source\nDiscover and resolve issues faster. Keep end users happy with less downtime and better performance by proactively monitoring key indicators and exceptions across the entire stack.\nhttps://www.happyfox.com/ Ticketing / private\nMeet HappyFox, a practical help desk and customer support software solution. Reduce chaos and bring order to your support process with a robust support ticket system, self-service knowledge base and community forums.\nSystem Centre Configuration Manager (SCCM) http://www.meshcommander.com/ SCCM / Open Source\nis an entirely web based tool for remote management of your Intel® AMT computers.\nhttps://www.spiceworks.com/ SCCM / Open Source\n﻿﻿﻿﻿Free online IT tools to help sysadmins, network engineers, technicians, and others set up and troubleshoot networks and more.\nhttps://www.lansweeper.com/ SCCM / Free less than 100 hosts\nNetwork Inventory, Asset Management, Deployment, Help Desk and much more…\nhttps://www.openstack.org/ Cloud / Open Source\nOpenStack is a free and open-source software platform for cloud computing, mostly deployed as infrastructure-as-a-service, whereby virtual servers and other resources are made available to customers\nhttps://www.proxmox.com/en/ Cloud - Virtualization / Open Source\nProxmox VE is a complete open-source platform for enterprise virtualization. With the built-in web interface you can easily manage VMs and containers, software-defined storage and networking, high-availability clustering, and multiple out-of-the-box tools on a single solution.\nhttps://tunnelblick.net/ VPN / Open Source\nTunnelblick is a free, open source graphic user interface for OpenVPN on OS X and macOS. It provides easy control of OpenVPN client and/or server connections.\nhttps://www.nagios.org/ IT Monitor / Open Source\nThe Industry Standard In IT Infrastructure Monitoring.\nhttps://www.zabbix.com/ IT Monitor / Open Source\nZabbix is the ultimate enterprise-level software designed for real-time monitoring of millions of metrics collected from tens of thousands of servers, virtual machines and network devices. Zabbix is Open Source and comes at no cost.\nhttp://www.andama.org/ RD / Open Source\nAndama is an open source remote desktop software, with client side encryption and privacy in mind.\nhttps://wiki.x2go.org/doku.php RD / open source\nX2Go enables you to access a graphical desktop of a computer over a low bandwidth (or high bandwidth) connection.\nhttps://ulterius.io/ RD / Open Source Task Manager, Command Prompt, PowerShell, and More.\nhttps://www.nomachine.com/ RD / Freeware\nGo from your desktop to any NoMachine-enabled computer at the speed of light. Thanks to our NX technology, NoMachine is the fastest and highest quality remote desktop you have ever tried. Get to any computer in the world in just a few clicks! Take what\u0026rsquo;s important where you go and share with who you want! NoMachine is your own personal server, private and secure. Did we say NoMachine is free? No strings attached.\nhttp://guacamole.apache.org/ RD / Open source\nhttp://www.freerdp.com/ RD / open source\nMore about Remote Desktop: https://en.wikipedia.org/wiki/Comparison_of_remote_desktop_software\nhttp://www.rabbitmq.com/ Deployed / open source\nRabbitMQ is the most widely deployed open source message broker.\nhttps://bloonix-monitoring.org/ System Monitoring / open source\nThe monitoring solution is a product of the hosting provider Bloonix, located in Germany.\nhttp://www.openldap.org/ LDAP / open source\nOpenLDAP Software is an open source implementation of the Lightweight Directory Access Protocol.\nhttps://directorymonitor.com/\nDirectory Monitor can be used for the surveillance of directories and/or network shares and will notify you of file changes, access, deletions, modifications, new files and inactivity in real-time.\nothers: http://ec.europa.eu/eurostat/statistics-explained/index.php/Main_Page\nStatistics Explained, your guide to European statistics. Statistics Explained is an official Eurostat website presenting statistical topics in an easily understandable way. Together, the articles make up an encyclopedia of European statistics for everyone, completed by a statistical glossary clarifying all terms used and by numerous links to further information and the latest data and metadata, a portal for occasional and regular users.\nAI https://www.tensorflow.org/\nhttps://www.inputdirector.com/ Sharing Mouse / open source\nPuppet: https://learn.puppet.com/?_ga=2.11665392.537398465.1511124414-1630578946.1511124414\nCloudFlare:\nCloudflare acelera y protege millones de sitios web, API, servicios de SaaS, y otros recursos conectados a Internet. Nuestra tecnología Anycast nos permite ampliar las ventajas con cada servidor que añadimos a nuestra creciente red de centros de datos.\nhttps://www.univention.com/\nThe Univention App Center contains an ever-growing number of software solutions from different developers for companies and public institutions. These apps can be simply installed via the App Center, integrated in your in-house IT, and conveniently managed via UCS’ central management system.\nhttps://www.opensource-socialnetwork.org\nOpen Source Social Network (Ossn) is a rapid development social networking software written in PHP. It allows you to make a social networking website. Ossn can be use to build different types of social apps.\nhttps://zammad.com/\nPersonalized and quick answers will satisfy your customers. With Zammad you can manage and organize your team and your tickets to make your customer support draw a smile on your customers face.\nhttps://rocket.chat/\nRocket.Chat is the leading free open source team chat Slack alternative.\nLet Chat\nhttps://www.tecmint.com/install-lets-chat-on-centos-ubuntu-debian/\nChartjs http://www.chartjs.org/ Simple yet flexible JavaScript charting for designers \u0026amp; developers\nPython IDE open source http://thonny.org/\nText editor https://atom.io/\nThe Official home of the DB Browser just for SQLite http://sqlitebrowser.org/\nRH Customer Portal ( Download RH iso ):\nhttps://access.redhat.com/downloads/content\nSystem backups:\nwww.urBackups.org\nhttps://blogs.technet.microsoft.com/canitpro/2015/07/22/step-by-step-installing-microsoft-azure-pack-for-windows-server/\nHow to create and design a database:\nhttps://docs.oracle.com/cd/E15276_01/doc.20/e13677/data_modeling.htm#BABGBGBG\nhttp://www.oracle.com/technetwork/developer-tools/datamodeler/downloads/index.html\nFreeNass:\nwww.freenas.org\nSystem backup open source:\nwww.Bacula.org\nhttps://www.cyberciti.biz/open-source/awesome-backup-software-for-linux-unix-osx-windows-systems/\nKubernetes: https://kubernetes.io/ is an open-source system for automating deployment, scaling, and management of containerized applications.\nSpinnaker: https://www.spinnaker.io/ is an open source, multi-cloud continuous delivery platform for releasing software changes with high velocity and confidence.\nSome NoSQL platforms(document-oriented):\nmongoDB CouchDB DynamoDB\nOpen Source Virtualization:\nhttps://xenserver.org/open-source-virtualization-download.html\nOpen source web servers:\nhttps://opensource.com/business/16/8/top-5-open-source-web-servers\nIBM cognos analytics\nhttps://www.cyberciti.biz/faq/install-use-setup-docker-on-rhel7-centos7-linux/\nSetup oracle 12C on Docker:\nhttps://dzone.com/articles/creating-an-oracle-database-docker-image\nClamavNet antivirus server open source:\nhttps://www.clamav.net/\nFirewall open source:\nhttp://gufw.org/\nBackup:\nhttps://www.bareos.org/en/download.html\nhttp://www.vmwarearena.com/download-link-for-all-versions-of-vmware-vsphere-client/\nhttp://www.mustbegeek.com/difference-between-vsphere-esxi-and-vcenter/\nhttps://developer.gnome.org/integration-guide/stable/desktop-files.html.en\nHow to setup a failover server (windows server):\nhttps://www.manageengine.com/products/desktop-central/help/configuring_desktop_central/configuring_failover_server.html\nEmtec terminal:\nhttps://www.emtec.com/index.html\nHow to create new icons into Visio:\nhttp://www.visguy.com/2009/09/11/visio-server-shape-icon-customization-tool/\nhttps://www.meteor.com/\nHow to freenas:\nhttps://www.windowscentral.com/how-to-set-up-freenas-home-file-server\nFreenas and esxi vmware NFS:\nhttps://www.virtualizationhowto.com/2017/05/configure-freenas-9-10-nfs-vmware-esxi-6-datastore/\nhttp://tekbloq.com/2016/08/19/how-to-configure-nfs-on-freenas/\nMirroring freenas boot:\nhttps://blog.brianmoses.net/2016/04/mirroring-the-freenas-usb-boot-device.html\nWindows server 2016 validation:\nhttps://msfreaks.wordpress.com/2016/10/06/convert-windows-server-2016-evaluation-to-licensed/\nMonitoring systems:\nhttps://nicolargo.github.io/glances/\n","permalink":"https://jose.castrillo.eu/post/repo-list/","summary":"\u003cp\u003eThis is a documentation I\u0026rsquo;ve made time ago searching some open source tools and platforms(\u0026amp; freeware), I hope It can be useful to you:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTicketing\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://www.graylog.org/\"\u003ehttps://www.graylog.org/\u003c/a\u003e    Monitoring / Open source\u003c/p\u003e\n\u003cp\u003eDiscover and resolve issues faster. Keep end users happy with less downtime and better performance by proactively monitoring key indicators and exceptions across the entire stack.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.happyfox.com/\"\u003ehttps://www.happyfox.com/\u003c/a\u003e   Ticketing / private\u003c/p\u003e\n\u003cp\u003eMeet HappyFox, a practical help desk and customer support software solution. Reduce chaos and bring order to your support process with a robust support ticket system, self-service knowledge base and community forums.\u003c/p\u003e","title":"Repo-list"},{"content":"SQL Structured Query Language, is a language designed to allow both technical and non-technical users query, manipulate, and transform data from a relational database.\nSome popular SQL databases:\nSQLite MySQL Postgres Oracle Microsoft SQL Server Relational database:\nRepresents a collection of related ( two-dimensional) tables.Each of the tables are similar to an Excel spreadsheet, with a fixed number of named columns and any number of rows of data.\nDDL (Data Definition Language) refers to the CREATE, ALTER and DROP statements DDL allows to add / modify / delete the logical structures which contain the data or which allow users to access / maintain the data (databases, tables, keys, views\u0026hellip;). DDL is about \u0026ldquo;metadata\u0026rdquo;. DML (Data Manipulation Language) refers to the INSERT, UPDATE and DELETE statements DML allows to add / modify / delete data itself. DQL (Data Query Language) refers to the SELECT, SHOW and HELP statements (queries) SELECT is the main DQL instruction. It retrieves data you need. SHOW retrieves infos about the metadata. HELP\u0026hellip; is for people who need help. DCL (Data Control Language) refers to the GRANT and REVOKE statements DCL is used to grant / revoke permissions on databases and their contents. DCL is simple, but MySQL\u0026rsquo;s permissions are rather complex. DCL is about security. DTL (Data Transaction Language) refers to the START TRANSACTION, SAVEPOINT, COMMIT and ROLLBACK [TO SAVEPOINT] statements DTL is used to manage transactions (operations which include more instructions none of which can be executed if one of them fails). Some SQL queries:\nSELECT: SELECT column, another_column, … FROM mytable; WHERE (constrain): SELECT column, another_column, … FROM mytable WHERE condition AND/OR another_condition AND/OR …; SELECT DISTINCT:\nSELECT DISTINCT column, another_column, … FROM mytable WHERE condition(s); SELECT column, another_column, … FROM mytable WHERE column LIKE condition(s); SELECT column, another_column, … FROM mytable WHERE condition(s) ORDER BY column ASC/DESC LIMIT num_limit OFFSET num_offset; Multi-table queries with JOINs\nTables that share information about a single entity need to have a primary key that identifies that entity uniquely across the database. One common primary key type is an auto-incrementing integer (because they are space efficient), but it can also be a string, hashed value, so long as it is unique.\nUsing the JOIN clause in a query, we can combine row data across two separate tables using this unique key. The first of the joins that we will introduce is the INNER JOIN.\nSELECT column, another_column, … FROM mytable INNER JOIN another_table ON mytable.id = another_table.id WHERE condition(s) ORDER BY column, … ASC/DESC LIMIT num_limit OFFSET num_offset; s\n","permalink":"https://jose.castrillo.eu/post/sql/","summary":"\u003cp\u003eSQL Structured Query Language, is a language designed to allow both technical and non-technical users query, manipulate, and transform data from a relational database.\u003c/p\u003e\n\u003cp\u003eSome popular SQL databases:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSQLite\u003c/li\u003e\n\u003cli\u003eMySQL\u003c/li\u003e\n\u003cli\u003ePostgres\u003c/li\u003e\n\u003cli\u003eOracle\u003c/li\u003e\n\u003cli\u003eMicrosoft SQL Server\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRelational database:\u003c/p\u003e\n\u003cp\u003eRepresents a collection of related ( two-dimensional) tables.Each of the tables are similar to an Excel spreadsheet, with a fixed number of named columns and any number of rows of data.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDDL\u003c/strong\u003e (Data Definition Language) refers to the CREATE, ALTER and DROP statements DDL allows to add / modify / delete the logical structures which contain the data or which allow users to access / maintain the data (databases, tables, keys, views\u0026hellip;). DDL is about \u0026ldquo;metadata\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDML\u003c/strong\u003e (Data Manipulation Language) refers to the INSERT, UPDATE and DELETE statements DML allows to add / modify / delete data itself.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDQL\u003c/strong\u003e (Data Query Language) refers to the SELECT, SHOW and HELP statements (queries) SELECT is the main DQL instruction. It retrieves data you need. SHOW retrieves infos about the metadata. HELP\u0026hellip; is for people who need help.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDCL\u003c/strong\u003e (Data Control Language) refers to the GRANT and REVOKE statements DCL is used to grant / revoke permissions on databases and their contents. DCL is simple, but MySQL\u0026rsquo;s permissions are rather complex. DCL is about security.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDTL\u003c/strong\u003e (Data Transaction Language) refers to the START TRANSACTION, SAVEPOINT, COMMIT and ROLLBACK [TO SAVEPOINT] statements DTL is used to manage transactions (operations which include more instructions none of which can be executed if one of them fails).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSome SQL queries:\u003c/p\u003e","title":"SQL some concepts \u0026 notes"},{"content":"Part I Containers are environments that host individual applications using a framework like Docker.\nDocker Editions:\nDocker CE ( community edition ) free version Docker EE ( enterprise edition) Paid Versions:\nStable, released every 4 months. Edge (beta) released every month. For testing EE, support for one year. Example how to create a container:\n$docker container run --publish 80:80 --detach --name webhost nginx detach: subcommand is to let run the container and keep use the command prompt name: create a container’s name.\n$docker container logs “container-name” Now you’ve got your Docker machines running, Docker Hub repository set up, and Docker Image built, you are ready to deploy the app across your machines. First, push your application to your repository. You’ll find the docker login and docker push commands useful here. Next, pull your application from your repository to your other machines. You can do all of this with the docker run command. It will automatically find, pull, and run your new application.\nThat’s it! Those are the steps to use Docker to easily deploy an application to multiple machines.\nSome useful commands:\n$docker ps -a -q | xargs docker rm -v To delete all container stopped\n$docker container ls Show current running containers\n$docker exec -it \u0026lt;containerIdOrName\u0026gt; bash NOTE:\nRemember the docker port publishing format of :. Port conflict errors occur when multiple services are running on the same published port on the same host, not in multiple containers. Each container gets its own internal IP behind NAT, so the ports won\u0026rsquo;t conflict across two container network interfaces.\nMoreover the official website: Docker Samples\n","permalink":"https://jose.castrillo.eu/post/docker-containers/","summary":"\u003ch2 id=\"part-i\"\u003ePart I\u003c/h2\u003e\n\u003cp\u003eContainers are environments that host individual applications using a framework like \u003cstrong\u003eDocker\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eDocker Editions:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDocker CE ( community edition ) free version\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eDocker EE ( enterprise edition) Paid\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVersions:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eStable, released every 4 months.\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEdge (beta) released every month. For testing\u003c/li\u003e\n\u003cli\u003eEE, support for one year.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExample how to create a container:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$docker container run --publish 80:80 --detach --name webhost nginx\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003edetach: subcommand is to let run the container and keep use the command prompt\nname: create a container’s name.\u003c/p\u003e","title":"Docker Container \"before start\""},{"content":"How to set you SSH key into Gitlab [First you need to had installed Git onto your distro]\nGo to your terminal and issue the follow command to generate your key: $ssh-keygen\nCopy your public key from the route: /home/user/.ssh/id_rsa.pub\nThen go at your gitlab profile https://gitlab.com/profile/keys/ a paste and save.\nFrom the terminal test the conection by typing: $ssh -T git@gitlab.com and if everything was fine it has to promt \u0026ndash;\u0026gt; Welcome to GitLab, @user_account!\nSet up the global credentials\ngit config --global user.email \u0026quot;youremail-account@sss.com\u0026quot; git config --global user.name \u0026quot;gitlab-account\u0026quot; It\u0026rsquo;s done 😎 NOTE:\n$git commit -m \u0026quot;adding new theme folder\u0026quot; $git push origin $git add hello-friend/ more info:\nhttps://www.youtube.com/watch?v=j-zmv-ITQb8\nadd-file\nI forgot something else, when we create by the first time a new project into Gitlab, from the dashboard it will show us the following basic instructions:\nCommand line instructions You can also upload existing files from your computer using the instructions below. Git global setup\ngit config --global user.name \u0026#34;name\u0026#34; git config --global user.email \u0026#34;email@domain.com\u0026#34; Create a new repository git clone git@gitlab.com:user/project-name.git cd project-name touch README.md git add README.md git commit -m \u0026#34;add README\u0026#34; git push -u origin master Push an existing folder cd existing_folder git init git remote add origin git@gitlab.com:user/project-name.git git add . git commit -m \u0026#34;Initial commit\u0026#34; git push -u origin master if you want to add a empty folder, the general workaround is to add an empty file .gitkeep and to add it to git:\ntouch work/subject/.gitkeep git add work/subject/.gitkeep git commit -am \u0026#34;Add directory subject\u0026#34; Push an existing Git repository cd existing_repo git remote rename origin old-origin git remote add origin git@gitlab.com:user/project-name.git git push -u origin --all git push -u origin --tags ","permalink":"https://jose.castrillo.eu/post/ssh-gitlab-git/","summary":"\u003cp\u003eHow to set you SSH key into Gitlab [\u003cem\u003eFirst you need to had installed Git onto your distro\u003c/em\u003e]\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eGo to your terminal and issue the follow command to generate your key: \u003ccode\u003e$ssh-keygen\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCopy your public key from the route: \u003cstrong\u003e/home/user/.ssh/id_rsa.pub\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eThen go at your gitlab profile \u003ca href=\"https://gitlab.com/profile/keys/\"\u003ehttps://gitlab.com/profile/keys/\u003c/a\u003e a paste and save.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFrom the terminal test the conection by typing: \u003ccode\u003e$ssh -T git@gitlab.com\u003c/code\u003e and if everything was fine it has to promt \u0026ndash;\u0026gt; Welcome to GitLab, @user_account!\u003c/p\u003e","title":"How to set you SSH key into Gitlab"},{"content":"Here are the steps I made to set a service into my Fedora server to start/stop my Docker-compose (Wikijs)\nWhy I decided to use a docker-compose into a Linux VM machine? \u0026mdash;\u0026gt; for make it more stable, faster,portable, isolated, etc.\nFirst I stared using Docker for Windows and it was a little bit unstable and not quite easy to handled, so when I switched to Docker compose into a Fedora VM and in that point it was a huge different(I do not recommend to use Docker in Windows); I use a Vmware hypervisor ( in the office we use it ).\nNOTE:\nThe docker-compose.yml file is into a folder /opt/wikijs\nInstructions:\nfirst go to /etc/systemd/system create the file ( eg: #touch wikijs.service ) copy and paste the config below (eg: #nano wikijs.service): # /etc/systemd/system ######################### # WIKIJS # # SERVICE # ########################## [Unit] Description=Docker Compose WIKIJS Service Requires=docker.service After=docker.service network.target [Service] Type=oneshot RemainAfterExit=yes WorkingDirectory=/opt/wikijs ExecStart=/usr/local/bin/docker-compose up -d ExecStop=/usr/local/bin/docker-compose down TimeoutStartSec=0 [Install] WantedBy=multi-user.target test the service: $systemctl start wikijs.service $systemctl status wikijs.service $systemctl enable wikijs.service NOTE:\nIn my case I got an unexpected behavior with the wiki container(node.js client) so I added the restart: on-failure into my docker-compose.yml file and issue resolved.\n.... wiki: image: requarks/wiki:beta restart: on-failure # added .... For further information:\nDocker-hub Website Wikijs-Github ","permalink":"https://jose.castrillo.eu/post/service-systemd-docker/","summary":"\u003cp\u003eHere are the steps I made to set a service into my Fedora server to start/stop my Docker-compose (Wikijs)\u003c/p\u003e\n\u003cp\u003eWhy I decided to use a docker-compose into a Linux VM machine? \u0026mdash;\u0026gt; for make it more stable, faster,portable, isolated, etc.\u003c/p\u003e\n\u003cp\u003eFirst I stared using Docker for Windows and it was a little bit unstable and not quite easy to handled, so when I switched to Docker compose into a Fedora VM and in that point it was a huge different(I do not recommend to use Docker in Windows); I use a Vmware hypervisor ( in the office we use it ).\u003c/p\u003e","title":"How to create a docker-compose.service"},{"content":"This is a little resume of how I\u0026rsquo;m doing a backup procedure of my wikijs database based in Docker-compose.\nBelow are the systems used in my enviroment:\nProject: Wikijs 2.0 Beta Platform: Docker-Compose DB: Postgres (9.6.14) Server: Fedora Server 30.x86_64 Workstation: Windows 10 (provided by work) \u0026#x1f62c; PSQL basic commands: Here are 4 basic commands I use to connect into my Postgre DB and check out DB list and quite.\n$psql -h localhost -p 5416 -U \u0026lt;my-user\u0026gt; -d \u0026lt;my-database\u0026gt;\n$psql -p 5432 -U wikijs -d wiki\nto show databases: wiki=# \\l\nto exit: wiki=# \\q\n\u0026#x2139;\u0026#xfe0f; Asummied you have the Docker-compose up and running that will be our starting point.\nBackup Procedure Stop you DB client (in our case stop the service \u0026ldquo;wiki\u0026rdquo;) $ docker stop \u0026lt;name-container\u0026gt; From your localhost ( my case Fedora) create a folder for the backup.\nCreate the DB backup:\ndocker exec docker_yml_db_1 pg_dumpall -U wikijs \u0026gt; backup.sql or\ndocker exec docker_yml_db_1 pg_dumpall -U wikijs \u0026gt; backup_`date +%d-%m-%Y\u0026#34;_\u0026#34;%H_%M_%S`.sql \u0026#x1f600; It\u0026rsquo;s done, with the steps describe above you can use the .sql file to restore your entire wikijs data to other system.\nRestore procedure \u0026#x2139;\u0026#xfe0f; Asummied you have the Docker-compose up and running that will be our starting point.\nStop you DB client (in our case stop the service \u0026ldquo;wiki\u0026rdquo;) $ docker stop \u0026lt;name-container\u0026gt; \u0026#x26a0;\u0026#xfe0f; Delete database: docker exec -it wikijs_db_1 dropdb -U wikijs wiki Create database: docker exec -it wikijs_db_1 createdb -U wikijs wiki Restore database: cat backup.sql | docker exec -i wikijs_db_1 psql -U wikijs wiki Start up the wiki service $ docker start \u0026lt;name-container\u0026gt; Finally we have restore/exported our data. This is an useful method I use to do my Wikijs data portables.\nExtra command: Container to local system: docker cp -a [container_name]:/wiki C:\\Users\\jcr\\Desktop\\docker_yml\\backup_db Connect into the postgre_container: docker exec -it wikijs_db_1 psql -p 5432 -U wikijs -d wiki The information below is being worked on! It\u0026rsquo;s Beta release. (aim: describes how to export by FTP the backup file)\nFTP To transfer the file between the container and Host I use vsftpd with the basic config.\nUsing systemd to start the service:\n$ systemctl start vsftpd\nStart as client by Filezilla:\nuser: xxxxx passwd: yyyyy port: 21 IP: locahost for more detail.\n","permalink":"https://jose.castrillo.eu/post/postgres-wikijs-backup/","summary":"\u003cp\u003eThis is a little resume of how I\u0026rsquo;m doing a backup procedure of my wikijs database based in Docker-compose.\u003c/p\u003e\n\u003cp\u003eBelow are the systems used in my enviroment:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eProject: \u003ca href=\"https://docs.requarks.io/\"\u003eWikijs\u003c/a\u003e 2.0 Beta\u003c/li\u003e\n\u003cli\u003ePlatform: Docker-Compose\u003c/li\u003e\n\u003cli\u003eDB: Postgres (9.6.14)\u003c/li\u003e\n\u003cli\u003eServer: Fedora Server 30.x86_64\u003c/li\u003e\n\u003cli\u003eWorkstation: Windows 10 (provided by work) \u0026#x1f62c;\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch5 id=\"psql-basic-commands\"\u003ePSQL basic commands:\u003c/h5\u003e\n\u003cp\u003eHere are 4 basic commands I use to connect into my Postgre DB and check out DB list and quite.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e$psql -h localhost -p 5416 -U \u0026lt;my-user\u0026gt; -d \u0026lt;my-database\u0026gt;\u003c/code\u003e\u003c/p\u003e","title":"Backup your Wikijs DB"},{"content":"After to install the 7z in our windows workstation/server then we need to create our evironment variables to call the function from the cmd [1].\nThen the command below will guide you to zip a simple file:\n7z a -r [myzip] [example.txt] [myzip] - the zip name file [example.txt] file used for the example To zip a folder\n7z a [myzip] [folder] Docu based thx to the information seen from: [1] GlobalEnviroment\n","permalink":"https://jose.castrillo.eu/post/zip-cmd-windows/","summary":"\u003cp\u003eAfter to install the 7z in our windows workstation/server then we need to create our \u003cstrong\u003eevironment variables\u003c/strong\u003e to call the function from the cmd [1].\u003c/p\u003e\n\u003cp\u003eThen the command below will guide you to zip a simple file:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e7z a -r [myzip] [example.txt]\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003e[myzip] - the zip name file\u003c/li\u003e\n\u003cli\u003e[example.txt] file used for the example\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo zip a folder\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e7z a [myzip] [folder]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDocu based thx to the information seen from: [1] \u003ca href=\"https://help.goodsync.com/hc/en-us/articles/360007773451-Automated-Backup-with-Compression-and-Encryption\"\u003eGlobalEnviroment\u003c/a\u003e\u003c/p\u003e","title":"Create a .zip using 7z by cmd in Windows"},{"content":"Using the Nmap to list our opened port in our machine, how described the official website: Nmap \u0026ldquo;..is an utility for network discovery and security auditing..\u0026rdquo;\nRegarding CUPS from the official website: \u0026ldquo;is an open source printing system developed by Apple Inc. for macOSÂ® and other UNIXÂ®-like operating systems. CUPS uses the Internet Printing Protocol (IPP) to support printing to local and network printers.\u0026rdquo;\nBy default we have the cups service running in the system\u0026rsquo;s startup we could check out issue the following commands:\n$ systemctl status cups\nand\n$ nmap localhost\nTo stop the cups service:\n$ systemctl stop cups to diable for the startup system:\n$ systemctl disable cups\n","permalink":"https://jose.castrillo.eu/post/ports-networking-linux/","summary":"\u003cp\u003eUsing the \u003cstrong\u003eNmap\u003c/strong\u003e to list our opened port in our machine, how described the \u003ca href=\"https://nmap.org/\"\u003eofficial website\u003c/a\u003e: Nmap \u0026ldquo;..is an utility for network discovery and security auditing..\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eRegarding \u003cstrong\u003eCUPS\u003c/strong\u003e from the \u003ca href=\"https://www.cups.org/\"\u003eofficial website\u003c/a\u003e: \u0026ldquo;is an open source printing system developed by Apple Inc. for macOSÂ® and other UNIXÂ®-like operating systems. CUPS uses the Internet Printing Protocol (IPP) to support printing to local and network printers.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eBy default we have the cups service running in the system\u0026rsquo;s startup we could check out issue the following commands:\u003c/p\u003e","title":"Closing opened ports on Linux (Fedora 29)"},{"content":"$file = \u0026#34;C:\\Users\\jcr\\a.html\u0026#34; $ipconfig=ipconfig /all |%{\u0026#34;$_\u0026lt;br/\u0026gt;\u0026#34;} $body=@\u0026#34; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;Network Report\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h1\u0026gt;IPConfig /All\u0026lt;/h1\u0026gt; \u0026lt;pre\u0026gt;$ipconfig\u0026lt;/pre\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; \u0026#34;@ $body | Out-File $file . $file ","permalink":"https://jose.castrillo.eu/post/report_script_powershell/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$file = \u0026#34;C:\\Users\\jcr\\a.html\u0026#34;\n$ipconfig=ipconfig /all |%{\u0026#34;$_\u0026lt;br/\u0026gt;\u0026#34;}\n\n$body=@\u0026#34;\n\u0026lt;html\u0026gt;\n    \u0026lt;head\u0026gt;\n    \u0026lt;title\u0026gt;Network Report\u0026lt;/title\u0026gt;\n    \u0026lt;/head\u0026gt;\n\u0026lt;body\u0026gt;\n    \u0026lt;h1\u0026gt;IPConfig /All\u0026lt;/h1\u0026gt;\n    \u0026lt;pre\u0026gt;$ipconfig\u0026lt;/pre\u0026gt;\n\u0026lt;/body\u0026gt;\n\u0026lt;/html\u0026gt;\n\u0026#34;@\n$body | Out-File $file\n. $file\n\u003c/code\u003e\u003c/pre\u003e","title":"Output IPCONFIG report to HTML by PowerShell"},{"content":" The below post is a simple explanation I did time ago, if you want further info and better explanation about how to setup a monitoring system into your Raspberripy please go to here.\nRaspbian version:9.8\n$ uname -r 4.14.98-v7+ $ uname -m armv7l Version installed on my RasPi: Grafana v6.0.2 (3f4c2e7)\nDownload Grafana package for your correct Raspi ARM $sudo dpkg -i grafana_6.1.3_armhf.deb $systemctl start grafana-server $systemctl status grafana-server then you will see from the status propmt the address=0.0.0.0:3000 msg=\u0026#34;HTTP Server Listen\u0026#34; logger=http.server address=0.0.0.0:3000 To check the site is working go through localhost:3000\nThe above post is a simple explanation I did time ago, if you want further info and better explanation about how to setup a monitoring system into your Raspberry Pi please go here\n","permalink":"https://jose.castrillo.eu/post/raspberrypi-grafana-post/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://castrillo.gitlab.io/figaro/grafana.png\" alt=\"\"  /\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eThe below post is a simple explanation I did time ago, if you want further info and better explanation about how to setup a monitoring system into your Raspberripy please go to here.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.raspberrypi.org/downloads/raspbian/\"\u003eRaspbian\u003c/a\u003e version:9.8\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ uname -r\n4.14.98-v7+\n$ uname -m\narmv7l\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVersion installed on my RasPi: \u003cstrong\u003eGrafana v6.0.2 (3f4c2e7)\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDownload \u003ca href=\"https://grafana.com/grafana/download?platform=arm\"\u003eGrafana\u003c/a\u003e package for your correct Raspi ARM\u003c/li\u003e\n\u003cli\u003e$sudo dpkg -i grafana_6.1.3_armhf.deb\u003c/li\u003e\n\u003cli\u003e$systemctl start grafana-server\u003c/li\u003e\n\u003cli\u003e$systemctl status grafana-server\u003c/li\u003e\n\u003cli\u003ethen you will see from the status propmt the address=0.0.0.0:3000\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emsg=\u0026#34;HTTP Server Listen\u0026#34; logger=http.server address=0.0.0.0:3000\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eTo check the site is working go through localhost:3000\u003c/p\u003e","title":"Setup Grafana in Raspbian (Raspberrypi)"},{"content":"To automate tasks or create some monitoring job we can use the older and efficient tool the \u0026ldquo;CronJob\u0026rdquo;.\nFor our example, I\u0026rsquo;ve created a simple script to detect the cache memory and clean it if raise to a condition then send a notification by mail.\nLibrary used:\nexim4 (mail server) or ssmtp (mail server). Both uses the same \u0026ldquo;mail\u0026rdquo; command. Script:\n# grab the buff/cache memory mem=\u0026#34;$(free -m | grep \u0026#39;Mem:\u0026#39; | awk \u0026#39;{print $6}\u0026#39;)\u0026#34; if (( $mem \u0026gt; 350 )) then echo \u0026#39;wooo is more than 250M\u0026#39; echo 3 | sudo tee /proc/sys/vm/drop_caches echo \u0026#39;cache dropped\u0026#39; echo \u0026#34;Memory buff/cache cleaned last value:\u0026#34; $mem | mail -s \u0026#34;cache_memory\u0026#34; target_mail@local.com else echo \u0026#39;be cool man, memory lower\u0026#39; fi script path: /user/Documents/script/memory\nCrontab description:\n* * * * * /user/Documents/script/memory - - - - - | | | | | | | | | ----- Day of week (0 - 7) (Sunday=0 or 7) | | | ------- Month (1 - 12) | | --------- Day of month (1 - 31) | ----------- Hour (0 - 23) ------------- Minute (0 - 59) Above it shows how works the interpretation of the line added to make the job works by cron.\nTo start to add our job issue the command below:\n$ crontab -e\nSet the schedule of the job plus the path to the script.\n0 * * * * /user/Documents/scripts/memory #Execute script every hour\n*/5 * * * * /user/Documents/scripts/memory #Execute script each 5 min\nSave and exit, after check the job set using the command below:\n$ crontab -l to check that our cronjobs are correctly working, we can have a look:\n$ journalctl -b 0 _SYSTEMD_UNIT=cron.service | grep \u0026#34;(/home/user/scripts/mem)\u0026#34; or\n$ sudo journalctl -u cron.service | grep \u0026#34;scripts\u0026#34; From the above commands, I pointed the folder where I save my scripts, so on my case I filtered it as \u0026ldquo;scripts\u0026rdquo; so I can grab the output where the cronjob executes the script from that folder.\n","permalink":"https://jose.castrillo.eu/post/cron-script-linux/","summary":"\u003cp\u003eTo automate tasks or create some monitoring job we can use the older and efficient tool the \u0026ldquo;CronJob\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eFor our example, I\u0026rsquo;ve created a simple script to detect the cache memory and clean it if raise to a condition then send a notification by mail.\u003c/p\u003e\n\u003cp\u003eLibrary used:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eexim4 (mail server) or ssmtp (mail server). Both uses the same \u0026ldquo;mail\u0026rdquo; command.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eScript:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# grab the buff/cache memory\nmem=\u0026#34;$(free -m | grep \u0026#39;Mem:\u0026#39; | awk \u0026#39;{print $6}\u0026#39;)\u0026#34;\n\nif  (( $mem \u0026gt; 350 ))\nthen\necho \u0026#39;wooo is more than 250M\u0026#39;\necho 3 | sudo tee /proc/sys/vm/drop_caches\necho \u0026#39;cache dropped\u0026#39;\necho \u0026#34;Memory buff/cache cleaned last value:\u0026#34; $mem | mail -s \u0026#34;cache_memory\u0026#34; target_mail@local.com\nelse\necho \u0026#39;be cool man, memory lower\u0026#39;\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003escript path: /user/Documents/script/memory\u003c/strong\u003e\u003c/p\u003e","title":"Create a job using crontab"},{"content":"Version:\nplatform x86_64-redhat-linux-gnu\narch x86_64\nos linux-gnu\nsystem x86_64, linux-gnu version.string R version 3.5.3 (2019-03-11)\nLibrary\nlubridate\nParse method\n\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; as.factor \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\nmydata$FECHA_NACIMIENTO\u0026lt;-as.factor(mydata$FECHA_NACIMIENTO) \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; variable for strptime \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\ntempo\u0026lt;-strptime(mydata$FECHA_NACIMIENTO,\u0026#34;%d/%m/%Y\u0026#34;) mydata$FECHA_NACIMIENTO\u0026lt;-as.Date(tempo,\u0026#34;%d/%m/%Y\u0026#34;) \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; clean variable \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\nrm (tempo) mydata$FECHA_NACIMIENTO \u0026lt;- format(as.Date(mydata$FECHA_NACIMIENTO), \u0026#34;%d/%m/%Y\u0026#34;) \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; parsing data \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\nlibrary(lubridate) mydata$FECHA_NACIMIENTO \u0026lt;-dmy(mydata$FECHA_NACIMIENTO) ","permalink":"https://jose.castrillo.eu/post/r-parse-post/","summary":"\u003cp\u003e\u003cstrong\u003eVersion:\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eplatform x86_64-redhat-linux-gnu\u003cbr\u003e\narch x86_64\u003cbr\u003e\nos linux-gnu\u003cbr\u003e\nsystem x86_64, linux-gnu\nversion.string R version 3.5.3 (2019-03-11)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003e\u003cem\u003eLibrary\u003c/em\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003elubridate\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003eParse method\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; \u003cem\u003eas.factor\u003c/em\u003e \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emydata$FECHA_NACIMIENTO\u0026lt;-as.factor(mydata$FECHA_NACIMIENTO)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; \u003cem\u003evariable for strptime\u003c/em\u003e \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etempo\u0026lt;-strptime(mydata$FECHA_NACIMIENTO,\u0026#34;%d/%m/%Y\u0026#34;)\nmydata$FECHA_NACIMIENTO\u0026lt;-as.Date(tempo,\u0026#34;%d/%m/%Y\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; \u003cem\u003eclean variable\u003c/em\u003e \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003erm (tempo)\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emydata$FECHA_NACIMIENTO \u0026lt;- format(as.Date(mydata$FECHA_NACIMIENTO), \u0026#34;%d/%m/%Y\u0026#34;)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash; \u003cem\u003eparsing data\u003c/em\u003e \u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u0026mdash;\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elibrary(lubridate)\nmydata$FECHA_NACIMIENTO \u0026lt;-dmy(mydata$FECHA_NACIMIENTO)\n\u003c/code\u003e\u003c/pre\u003e","title":"Parsing date format from .xlsx to R"},{"content":"The following instruction is a solution when you got an error response with live-restore using Docker Swarm in Fedora 28 or highter\n$ docker swarm init Error response from daemon: --live-restore daemon configuration is incompatible with swarm mode That\u0026rsquo;s not possible to enable Live-restore and Swarm-mode together.\nFirst make sure that the SElinux is Permissive or Disabled.\n$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31 Then remove the \u0026ndash;live-restore line from the /etc/sysconfig/docker\n# nano /etc/sysconfig/docker # Modify these options if you want to change the way the docker daemon runs #OPTIONS=\u0026#39;--selinux-enabled --log-driver=journald --live-restore\u0026#39; # original OPTIONS=\u0026#39;--selinux-enabled --log-driver=journald\u0026#39; #fixed if [ -z \u0026#34;${DOCKER_CERT_PATH}\u0026#34; ]; then DOCKER_CERT_PATH=/etc/docker fi $ systemctl restart docker Then you should get the bellow promt when you issue the docker swarm init\n# docker swarm init Swarm initialized: current node (cvd6pifjhr4adjj0leyywzzekr) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \\ --token SWMTKN-1-31dszgyu6ouctrmgccpsc8pu37jh0x7t8ms2ps0snl5z4wzsvq-72fnhrhb4pfsbzh0i996svrz7 \\ 10.123.20.123:2334 To add a manager to this swarm, run \u0026#39;docker swarm join-token manager\u0026#39; and follow the instructions. ","permalink":"https://jose.castrillo.eu/post/docker-local-post/","summary":"\u003cp\u003eThe following instruction is a solution when you got an error response with \u003ca href=\"https://docs.docker.com/v17.09/engine/admin/live-restore/\"\u003elive-restore\u003c/a\u003e using Docker Swarm in Fedora 28 or highter\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker swarm init\nError response from daemon: --live-restore daemon configuration is incompatible with swarm mode\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThat\u0026rsquo;s not possible to enable Live-restore and Swarm-mode together.\u003c/p\u003e\n\u003cp\u003eFirst make sure that the \u003cstrong\u003eSElinux\u003c/strong\u003e is Permissive or Disabled.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sestatus\n\nSELinux status:                 enabled\nSELinuxfs mount:                /sys/fs/selinux\nSELinux root directory:         /etc/selinux\nLoaded policy name:             targeted\nCurrent mode:                   permissive\nMode from config file:          enforcing\nPolicy MLS status:              enabled\nPolicy deny_unknown status:     allowed\nMemory protection checking:     actual (secure)\nMax kernel policy version:      31\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen remove the \u0026ndash;live-restore line from the \u003cstrong\u003e/etc/sysconfig/docker\u003c/strong\u003e\u003c/p\u003e","title":"Disable live-restore to run Docker Swarm"},{"content":"$ systemctl start docker $ systemctl status docker $ docker pull mysql $ docker image ls $ docker run --name db -e MYSQL_ROOT_PASSWORD=mysql123 -d mysql Use the docker exec -it command to start a mysql client inside the Docker container you have started, like the following:\n$ docker exec -it db mysql -uroot -p ","permalink":"https://jose.castrillo.eu/post/docker-mysql-local/","summary":"\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ systemctl start docker\n$ systemctl status docker\n$ docker pull mysql\n$ docker image ls\n$ docker run --name db -e MYSQL_ROOT_PASSWORD=mysql123 -d mysql\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUse the docker exec -it command to start a mysql client inside the Docker container you have started, like the following:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ docker exec -it db mysql -uroot -p\n\u003c/code\u003e\u003c/pre\u003e","title":"Pulling Mysql using Docker Hub into Linux workstation"},{"content":"When you\u0026rsquo;ve done the SDK installation in your Linux workstation. list the components you have installed, then you will see the full list additional components from gcp SDK:\ngcloud components list gcloud components install \u0026lt;COMPONENT_ID\u0026gt; gcloud components install kubectl Then follow the instruction from the kubernetes official documentation, check the \u0026ldquo;bash-completion\u0026rdquo; and finally issue the command below:\necho \u0026#34;source \u0026lt;(kubectl completion bash)\u0026#34; \u0026gt;\u0026gt; ~/.bashrc Even you can go directly through your .bashrc (sudo) to add manually, it should look like:\n1# User specific aliases and functions 2 3# The next line updates PATH for the Google Cloud SDK. 4 5if [ -f \u0026#39;/home/jose/Downloads/google-cloud-sdk/path.bash.inc\u0026#39; ]; then . \u0026#39;/home/jose/Downloads/google-cloud-sdk/path.bash.inc\u0026#39;; fi 6 7# The next line enables shell command completion for gcloud. 8 9if [ -f \u0026#39;/home/jose/Downloads/google-cloud-sdk/completion.bash.inc\u0026#39; ]; then . \u0026#39;/home/jose/Downloads/google-cloud-sdk/completion.bash.inc\u0026#39;; fi 10source \u0026lt;(kubectl completion bash) I hope could it be useful; it will save a lot of time typing.\n","permalink":"https://jose.castrillo.eu/post/k8s-gcp-post/","summary":"\u003cp\u003eWhen you\u0026rsquo;ve done the \u003ca href=\"https://cloud.google.com/sdk/docs/\"\u003eSDK\u003c/a\u003e installation in your Linux workstation. list the components you have installed, then you will see the full list additional components from gcp SDK:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egcloud components list\ngcloud components install \u0026lt;COMPONENT_ID\u0026gt;\ngcloud components install kubectl\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThen follow the instruction from the kubernetes official \u003ca href=\"https://kubernetes.io/docs/tasks/tools/install-kubectl/\"\u003edocumentation\u003c/a\u003e, check the \u0026ldquo;bash-completion\u0026rdquo; and finally issue the command below:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eecho \u0026#34;source \u0026lt;(kubectl completion bash)\u0026#34; \u0026gt;\u0026gt; ~/.bashrc\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEven you can go directly through your .bashrc (sudo) to add manually, it should look like:\u003c/p\u003e","title":"Enable \"Kubectl\" auto-completion in the Shell (Linux)"},{"content":"Hello there! I\u0026rsquo;m a big fan of GNU/Linux 🐧 and all things open-source. By day, I work as a DevOps 👨‍💻, wrangling various projects to ensure they run like well-oiled platform. But let me take you back to where my journey began - coding in Assembly language and tinkering with MicroChip, Atmega and embedded devices. That was my playground before I took the leap into the cloud, focusing on CI/CD, GitOps, SRE, and HA zones, my main focus it\u0026rsquo;s to delivers reliable IDP.\nNow, when I\u0026rsquo;m not in the tech world, you\u0026rsquo;ll often find me in my DIY electronics workshop. I love building IoT gadgets using cool stuff like Onion mega, RaspberryPi, Arduino, etc. And there\u0026rsquo;s something else I\u0026rsquo;m passionate about: music production. I create electronic beats and melodies that you can check out on my SoundCloud.\nThere\u0026rsquo;s a saying I live by: \u0026ldquo;I hear and I forget, I see and I remember, I do and I understand.\u0026rdquo; It\u0026rsquo;s not just words; it\u0026rsquo;s how I approach life and learning.\nLet\u0026rsquo;s connect and chat about tech, or music—I\u0026rsquo;m always up for a good conversation!\nGet in Touch Have a project in mind or want to discuss DevOps solutions? Fill out the form below or send me an email directly.\nReady to Transform Your Infrastructure? If you're looking for DevOps solutions, open-source migration, or digital sovereignty in the EU, get in touch. I’m here to help you optimize your infrastructure with open and autonomous technologies. ✉️ Email me at jose@castrillo.addy.io ","permalink":"https://jose.castrillo.eu/page/about/","summary":"\u003cp\u003eHello there! I\u0026rsquo;m a big fan of GNU/Linux 🐧 and all things open-source. By day, I work as a DevOps 👨‍💻, wrangling various projects to ensure they run like well-oiled platform. But let me take you back to where my journey began - coding in Assembly language and tinkering with MicroChip, Atmega and embedded devices. That was my playground before I took the leap into the cloud, focusing on CI/CD, GitOps, SRE, and HA zones, my main focus it\u0026rsquo;s to delivers reliable \u003ca href=\"https://internaldeveloperplatform.org/\"\u003eIDP\u003c/a\u003e.\u003c/p\u003e","title":"About"}]