From 6bec6d51dd7be09f218f58bb920b240aaf560d5e Mon Sep 17 00:00:00 2001 From: Pradumna Saraf Date: Fri, 3 Apr 2026 20:17:42 +0530 Subject: [PATCH 1/5] feat: enhance Docusaurus configuration with new navigation items, update introduction content, and improve feedback section; increment version to 2.6.2 --- README.md | 12 +- docs/docker/commands.md | 4 +- docs/docker/introduction.md | 32 +- docs/feedback.md | 12 +- docs/github-actions/introduction.md | 89 ++-- docs/introduction.md | 56 --- docs/introduction.mdx | 61 +++ docs/kubernetes/introduction.md | 63 ++- .../k8s-resources-type/pod/pod.yaml | 2 +- docs/qna.md | 10 +- docs/terraform/introduction.md | 26 +- docusaurus.config.js | 108 ++++- package-lock.json | 449 +++++------------- package.json | 9 +- src/components/HomepageFeatures/index.js | 82 ++-- .../HomepageFeatures/styles.module.css | 61 ++- src/css/custom.css | 50 +- 17 files changed, 580 insertions(+), 546 deletions(-) delete mode 100644 docs/introduction.md create mode 100644 docs/introduction.mdx diff --git a/README.md b/README.md index 0285afa..3ed52a5 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ - [Commands](docs/kubernetes/commands.md) - [Sample Apps](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/kubernetes/apps) - [Manifest Files](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/kubernetes/k8s-resources-type) -- [Tools](docs/kubernetes/tools.md) +- [Tools](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/kubernetes/tools) - [Playground](docs/kubernetes/playground.md) - [Other Resources](docs/kubernetes/other-resources.md) @@ -34,7 +34,7 @@ - [Workflows](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/github-actions/Workflows) - [Scenarios](docs/github-actions/scenarios.md) - [Other Resources](docs/github-actions/other-resources.md) -- + ## Linux linux @@ -71,11 +71,11 @@ network -- [Notes](docs/go/introduction.md) -- [Learning Resources](docs/go/learning-resources.md) +- [Notes](docs/golang/introduction.md) +- [Learning Resources](docs/golang/learning-resources.md) - [Concepts](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/golang/concepts) - [Practice App](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/golang/apps) -- [Other Resources](docs/go/other-resources.md) +- [Other Resources](docs/golang/other-resources.md) ## Helm @@ -138,4 +138,4 @@ - [Notes](docs/terraform/introduction.md) - [Learning Resources](docs/terraform/learning-resources.md) -- [Commands](docs/terraform/commands.md) \ No newline at end of file +- [Commands](docs/terraform/commands.md) diff --git a/docs/docker/commands.md b/docs/docker/commands.md index 6bb754c..cb8c255 100644 --- a/docs/docker/commands.md +++ b/docs/docker/commands.md @@ -228,7 +228,7 @@ docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker-image:version ### Docker Compose - Run docker compose file. - Note: By default it finds for the file name `docker-compose.yaml`, to give file with other naming use `-f ` command + Note: If you do not pass `-f`, Docker looks for `compose.yaml` or `docker-compose.yaml` in the working directory. ```bash docker compose up -d @@ -247,7 +247,7 @@ docker compose up --build - Override the existing of compose file ```bash -docker compose -f docker-compose.yaml -f docker-compose.dev.yaml +docker compose -f compose.yaml -f compose.dev.yaml ``` ### Docker Swarm and Services diff --git a/docs/docker/introduction.md b/docs/docker/introduction.md index fe83d31..248eb04 100644 --- a/docs/docker/introduction.md +++ b/docs/docker/introduction.md @@ -9,7 +9,9 @@ slug: "/docker" ### Overview of Docker -Docker is an open-source platform designed to simplify the development, deployment, and management of applications in a containerized environment, also known as Docker containers. Docker containers are a lightweight and portable way to package and run applications, enabling developers to package their applications with all the required dependencies and configurations in a single package that can be easily moved between any environment. Docker containers are simply the running instance of a Docker image. +Docker is an open-source platform for building, shipping, and running containerized applications. In day-to-day use, you usually build an image, run that image as one or more containers, and use registries, networks, volumes, and Compose files to manage the rest of the workflow. + +A Docker image is a packaged blueprint. A container is a running instance of that image. ### Why You Should Consider Using Docker @@ -25,7 +27,7 @@ Docker is an open-source platform designed to simplify the development, deployme - Images are made up of app binaries, dependencies, and metadata. They don't contain a full OS. - Images are a combination of multiple layers. -- Each image has its unique ID and a tag for a different version. +- Each image has a unique ID, and tags help identify versions or variants. ![Screenshot from 2022-11-02 11-57-19](https://user-images.githubusercontent.com/51878265/199414178-d59e8780-c140-4bf1-b27e-7e8f1c723afb.png) @@ -74,13 +76,13 @@ The .dockerignore file is used to specify files and directories that are not cop ### Docker Network -To connect to our created containers, Docker provides several network drivers. The available default drivers are bridge, host, and null. +Docker provides multiple network drivers. For local learning and day-to-day usage, the most common built-in drivers are `bridge`, `host`, and `none`. -- Bridge network creates a virtual network that allows containers to communicate with each other using IP addresses. We need to create a custom bridge network to enable DNS resolution between containers. Only containers connected to the same custom bridge network can communicate with each other directly. It doesn't work with the default bridge network. +- A `bridge` network lets containers communicate on the same Docker host. User-defined bridge networks are usually preferred because they provide automatic DNS-based service discovery between containers. -- Host network uses the host machine's network stack inside the container. We can use this network for applications that require high network performance. We don't need to expose ports here. +- A `host` network shares the host machine's network stack with the container. It is useful in specific performance-sensitive cases, and it removes the need for Docker port publishing. -- Using Null network driver disables the networking for the container. +- A `none` network disables networking for the container. ![docker network](https://user-images.githubusercontent.com/37767537/223677649-babf850a-a87f-46bd-bb32-425801f05b2e.png) @@ -92,19 +94,19 @@ docker network create ### Docker Volumes -We need volumes to persist our data, like databases and user info, because containers can go up and down, and we need some way to preserve our data. +We use volumes to persist data outside the container lifecycle. This matters for stateful applications like databases, uploaded files, and any data that should survive container replacement. -We attach a volume during runtime: +We can attach a named volume during runtime: ```bash -docker run -v /path/in/container +docker run -v app-data:/var/lib/postgresql/data postgres:16 ``` **Named Volume** We can also name the volume; otherwise, it will generate an ID and be hard to track: ```bash -docker run -v : +docker run -v : docker run -v myvolume:/src/public nginx ``` @@ -130,7 +132,8 @@ volumes: - Compose helps us define and run multi-container Docker applications and configure relationships between containers. - It also saves the hassle of entering the commands from the CLI. -- We have to write the configs in the YAML file, by default the file name is `docker-compose.yml`. We can run/stop by `docker compose up/down`. +- Compose files are written in YAML. Modern Docker looks for `compose.yaml` by default, while `docker-compose.yaml` is still widely recognized for backward compatibility. +- The `docker compose` CLI is the current interface for working with Compose projects. The Skeleton of Docker Compose: @@ -175,6 +178,11 @@ depends_on: - mysql-primary ``` +Useful references: + +- [Docker Compose CLI reference](https://docs.docker.com/reference/cli/docker/compose/) +- [Docker bridge network driver](https://docs.docker.com/engine/network/drivers/bridge/) + ### Docker Swarm Docker Swarm is an orchestration management tool that runs on Docker applications. Container orchestration automates the deployment, management, scaling, and networking of containers. @@ -271,4 +279,4 @@ We can create a registry with the official [Registry image](https://hub.docker.c - [Docker Commands](./commands.md) - Learn about the most commonly used Docker commands. - [Learning Resources](./learning-resources.md) - Learn more about Docker with these resources. -- [Other Resources](./other-resources.md) - Explore more about Docker with these resources. \ No newline at end of file +- [Other Resources](./other-resources.md) - Explore more about Docker with these resources. diff --git a/docs/feedback.md b/docs/feedback.md index badd6d9..575175d 100644 --- a/docs/feedback.md +++ b/docs/feedback.md @@ -7,8 +7,14 @@ title: Feedback & Suggestions Hey learner, practitioner, or expert in DevOps, -Thank you so much for checking out this project/website. I ([Pradumna](https://x.com/pradumna_Saraf)) know that this project/website is not perfect and there are many things that can be improved. You might have encountered some errors or outdated information. +Thank you for checking out this project. I ([Pradumna](https://x.com/pradumna_Saraf)) know the site is always a work in progress. Some pages will inevitably need updates as vendor docs, defaults, CLIs, and best practices change. -I am always open to feedback and suggestions. If you have any, please feel free to share them. You can raise a [Pull Request](https://github.com/Pradumnasaraf/DevOps) if the changes are minor. If you are unsure about the changes or if it's something major, please first raise an [Issue](https://github.com/Pradumnasaraf/DevOps/issues/new/choose) on the GitHub repo. I will try to incorporate your feedback and suggestions as much as possible. +If you notice a broken link, outdated command, confusing explanation, or a better way to teach a concept, please share it. You can open a [Pull Request](https://github.com/Pradumnasaraf/DevOps) for small fixes. If the change is larger or you want to discuss the direction first, open an [Issue](https://github.com/Pradumnasaraf/DevOps/issues/new/choose). -Thanks for your time and support. \ No newline at end of file +The most helpful reports usually include: + +- the page URL or doc path +- what looks incorrect or unclear +- the corrected example or an official source when available + +Thanks for helping keep the site useful. diff --git a/docs/github-actions/introduction.md b/docs/github-actions/introduction.md index e718223..39ee1c5 100644 --- a/docs/github-actions/introduction.md +++ b/docs/github-actions/introduction.md @@ -7,7 +7,7 @@ keywords: ["GitHub Actions", "DevOps", "CI/CD"] slug: "/github-actions" --- -GitHub Actions is a feature that allows you to automate your software development workflows. You can write individual tasks, called actions, and combine them to create a custom workflow. Workflows are custom automated processes that you can set up in your repository to build, test, package, release, or deploy any code project on GitHub. +GitHub Actions lets you automate software workflows directly inside a GitHub repository. You define workflows in YAML files, trigger them from events such as `push`, `pull_request`, or `workflow_dispatch`, and run jobs on GitHub-hosted or self-hosted runners. ### Overview @@ -17,24 +17,28 @@ GitHub Actions is a feature that allows you to automate your software developmen - **Jobs** - A job is a set of steps that execute on the same runner. Runner is a server that has the GitHub Actions runner application installed. -- **Steps** - A step is an individual task that can run commands or actions like `actions/checkout@v2`. Each step in a job executes on the same runner, allowing for direct file sharing. +- **Steps** - A step is an individual task that can run shell commands or reusable actions like `actions/checkout@v4`. Each step in a job executes on the same runner, so files are available across steps in that job. > Summary: The workflow is a set of jobs and each job is a set of steps. Each step can be an action or a shell command. -Basic worflow file. +Basic workflow file: ```yaml -name: CI # name of the workflow +name: CI -on: [push] # triggers the workflow on push or pull request events but only for the master branch +on: + push: + branches: [main] + pull_request: + branches: [main] jobs: - build: # name of the job - runs-on: ubuntu-latest # runs-on is the type of machine to run the job on - runner - steps: # steps are the individual tasks that make up a job - - uses: actions/checkout@v2 - - name: Run a one-line script # name is the name of the step - run: echo Hello, world! + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Run a one-line script + run: echo "Hello, world!" ``` - **Action** - An action is a custom application for the GitHub Actions platform that performs a complex but frequently repeated task. @@ -97,27 +101,24 @@ on: ### Services -Services are external resources that can be used in a workflow. We can use services like `redis` or `postgres` in our workflow. We can run a service in a container and use it in our workflow. We can also use custom images. +Services are containers that GitHub Actions starts for a job. They are useful for integration tests that need supporting dependencies such as Redis or Postgres. ```yaml services: redis: - image: redis # Docker image + image: redis:7 ports: - - 6379:6379 # port mapping + - 6379:6379 - mongodb: - image: mongo + postgres: + image: postgres:16 + env: + POSTGRES_PASSWORD: postgres ports: - - 27017:27017 - - sqlite: - image: sqlite - ports: - - 3306:3306 + - 5432:5432 ``` -### Using ouput from one step in another step +### Using output from one step in another step We can use the output from one step in another step using the `id` keyword. @@ -128,12 +129,14 @@ jobs: steps: - name: Get the version id: get_version - run: echo ::set-output name=version::1.0.0 + run: echo "version=1.0.0" >> "$GITHUB_OUTPUT" - name: Use the version - run: echo ${{ steps.get_version.outputs.version }} # {{ steps..outputs. }} + run: echo ${{ steps.get_version.outputs.version }} # steps..outputs. ``` +GitHub now recommends environment files such as `GITHUB_OUTPUT` instead of the deprecated `::set-output` command. + ### Jobs We can have multiple jobs in a workflow. Each job runs in parallel by default. We can also run jobs sequentially using the `needs` keyword. Each step in a job runs on the same runner. @@ -176,7 +179,7 @@ The `github` context is available to you in any workflow or action you create on ### Environment variables -We can set environment variables in the workflow file using the `env` keyword. WE +We can set environment variables in the workflow file using the `env` keyword. ```yaml env: @@ -198,18 +201,18 @@ jobs: ### Matrix -Matrix is helpful when we want to run a job on multiple versions of a tool.For eg. we want to run a job on multiple versions of Node.js. We can use the `matrix` keyword to run a job on multiple versions of a tool. We can also use the `matrix` keyword to run a job on multiple operating systems. +Matrix is helpful when we want to run the same job on multiple versions of a tool or across multiple operating systems. ```yaml jobs: example_matrix: strategy: matrix: - os: [ubuntu-22.04, ubuntu-20.04] - version: [14, 16, 18] + os: [ubuntu-22.04, ubuntu-24.04] + version: [20, 22] runs-on: ${{ matrix.os }} steps: - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.version }} ``` @@ -225,18 +228,24 @@ jobs: outputs: url: ${{ steps.deploy-preview.outputs.url }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: deploy-preview - run: echo "url=preview_url" >> $GITHUB_OUTPUT - - data: - runs-on: ubuntu-latest - needs: deploy - steps: - - name: load json files - run: echo ${{ needs.deploy.outputs.url }} + run: echo "url=preview_url" >> "$GITHUB_OUTPUT" + + data: + runs-on: ubuntu-latest + needs: deploy + steps: + - name: Load preview URL + run: echo ${{ needs.deploy.outputs.url }} ``` +Useful references: + +- [Understanding GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions) +- [Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions) +- [Workflow commands and `GITHUB_OUTPUT`](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-commands) + ## Artifacts It allows you to share data between jobs in a workflow and store data once the workflow has been completed. We can use the `upload-artifact` and `download-artifact` actions to upload and download artifacts. @@ -280,4 +289,4 @@ jobs: - [Scenarios](./scenarios.md) - A collection of GitHub Actions workflow files I use and created to help you understand the concepts better. - [Learning Resources](./learning-resources.md) - A list of resources to learn more about GitHub Actions. -- [other Resources](./other-resources.md) - A list of other resources that you can refer to learn more about GitHub Actions. \ No newline at end of file +- [other Resources](./other-resources.md) - A list of other resources that you can refer to learn more about GitHub Actions. diff --git a/docs/introduction.md b/docs/introduction.md deleted file mode 100644 index 721b35a..0000000 --- a/docs/introduction.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -sidebar_position: 1 -label: Introduction -title: DevOps -description: A collection of resources to learn more about DevOps. -tags: ["DevOps", "Development", "Operations"] -keywords: ["DevOps", "Development", "Operations"] -slug: / ---- - -> Hey, I created this repository to keep my learning, notes, and code in one place for various tools in DevOps. Now, it's helping thousands of learners, practitioners, and professionals every day in their DevOps journey. Good luck with your DevOps journey! - [Pradumna Saraf](https://twitter.com/pradumna_saraf) - -## What is DevOps? - -DevOps is a set of practices that combines software development (Dev) and information technology operations (Ops) to shorten the systems development life cycle while providing continuous delivery with high software quality. DevOps is a culture, movement, or practice that emphasizes the collaboration and communication of both software developers and other information-technology (IT) professionals while automating the process of software delivery and infrastructure changes. - -If you notice DevOps has a infinity symbol, which means it's a continuous process. It's not a one-time activity. It's a continuous process of development and operations. It's explained in the below image: - -## DevOps Lifecycle - -![DevOps Lifecycle](../static/img/devops-lifecycle.png) - -To understand the above image, let's break down the DevOps lifecycle into different stages: - -**1. Discovery**: In this stage, the team identifies the requirements and the scope of the project. - -**2. Plan**: In this stage, the team plans the project and creates a roadmap. - -**3. Build/Develop**: In this stage, the team develops the software. - -**4. Test**: In this stage, the team tests the software. - -**5. Deploy**: In this stage, the team deploys the software. - -**6. Operate**: In this stage, the team operates the software. - -**7. Monitor/Observe**: In this stage, the team monitors the software. - -**8. Continuous Feedback**: In this stage, the team gets feedback from the users and stakeholders. - -## DevOps Tools - -There are various tools available for different stages of the DevOps lifecycle. It depends on the requirements of the project and the team. Some of the popular DevOps tools are: - -- **Source Code Management**: Git, GitHub, GitLab, Bitbucket. -- **Continuous Integration**: Jenkins, GitLab CI, CircleCI, Travis CI. -- **Continuous Deployment**: Jenkins, GitLab CI, CircleCI, Travis CI. -- **Configuration Management**: Ansible, Puppet, Chef, SaltStack. -- **Containerization**: Docker, Podman, Containerd, LXC. -- **Orchestration**: Kubernetes, Docker Swarm, Amazon ECS. -- **Monitoring**: Prometheus, Grafana, ELK Stack, Nagios. -- **Infrastructure as Code**: Terraform, AWS CloudFormation, Azure Resource Manager. -- **Security**: SonarQube, OWASP ZAP, Clair, Trivy. -- **Collaboration**: Slack, Microsoft Teams, Google Chat, Zoom. - -To learn more about these tools, you can navigate to the respective sections in the sidebar. diff --git a/docs/introduction.mdx b/docs/introduction.mdx new file mode 100644 index 0000000..4afb2ae --- /dev/null +++ b/docs/introduction.mdx @@ -0,0 +1,61 @@ +--- +sidebar_position: 1 +label: Introduction +title: DevOps +description: Practical DevOps notes, examples, and learning paths for modern tooling. +tags: ["DevOps", "Development", "Operations"] +keywords: ["DevOps", "Development", "Operations"] +slug: / +--- + +import HomepageFeatures from '@site/src/components/HomepageFeatures'; + +## What This Site Is For + +This website is a curated DevOps notebook for people who want more than definitions. It combines topic overviews, commands, diagrams, sample manifests, and small runnable examples so you can move from concept to practice without switching between ten different tabs. + +:::tip How To Use The Site +If you are new, start with `Linux`, `Networking`, `Git`, `Docker`, and `Kubernetes`. If you already ship software, jump directly into `Terraform`, `GitHub Actions`, `Prometheus`, `GitOps`, or `DevSecOps`. +::: + +## What DevOps Means In Practice + +DevOps is not a single tool or job title. It is a way of building and operating software that emphasizes fast feedback, automation, reliability, and shared ownership across development and operations work. + +In practice, that usually means: + +- shipping changes in smaller, safer batches +- using version control for both code and infrastructure +- automating build, test, deployment, and validation steps +- treating observability and security as part of delivery, not afterthoughts + +## DevOps Lifecycle + +![DevOps Lifecycle](../static/img/devops-lifecycle.png) + +The infinity loop is a useful mental model, but the real point is continuous feedback: + +1. Plan the change and define the expected outcome. +2. Build and test in a repeatable way. +3. Release with enough confidence, visibility, and rollback options. +4. Operate, observe, and feed what you learn back into the next iteration. + +## Quality Notes + +- Core landing content and selected high-traffic docs were refreshed against official documentation in April 2026. +- Vendor CLIs, APIs, and defaults change frequently. Verify version-sensitive commands before using them in production. +- If you spot a broken link, stale example, or misleading explanation, open an issue or submit a pull request. + + + +> Hey, I created this repository to keep my learning, notes, and code in one place for various tools in DevOps. Now, it's helping thousands of learners, practitioners, and professionals every day in their DevOps journey. Good luck with your DevOps journey! +> +> [Pradumna Saraf](https://x.com/pradumna_Saraf) + +## Suggested Starting Points + +- [Docker](/docker) +- [Kubernetes](/kubernetes) +- [GitHub Actions](/github-actions) +- [Terraform](/terraform) +- [Q&A](/qna) diff --git a/docs/kubernetes/introduction.md b/docs/kubernetes/introduction.md index ff85b0f..5621648 100644 --- a/docs/kubernetes/introduction.md +++ b/docs/kubernetes/introduction.md @@ -7,7 +7,9 @@ keywords: ["Kubernetes", "Container Orchestration", "DevOps"] slug: "/kubernetes" --- -## Kubernetes Components - architecture +Kubernetes is an open-source platform for running containerized workloads and services. Its core strength is declarative configuration plus automation around scheduling, rollout, scaling, networking, and recovery. + +## Cluster Architecture ![Kube-component](https://user-images.githubusercontent.com/51878265/197317939-d7e8ecbb-912c-4223-b64a-1c46cbac255f.png) @@ -20,29 +22,34 @@ slug: "/kubernetes" ## Cluster -Cluster is collection of nodes. The nodes can be grouped into two categories, Control Plane and Data Plane. The Control Plane is responsible for runining all the Kubernetes components. The Data Plane is responsible for running the application (our application). +A cluster is a collection of machines, called nodes, that work together to run workloads. At a high level, you can think of a cluster as two main parts: + +- **Control Plane**: makes decisions about the cluster and manages its desired state. +- **Data Plane**: runs the application workloads. ## Control Plane -Control Plane is the brain of the Kubernetes cluster. It is responsible for managing the cluster. It contains the Control plane nodes. And each control plane node contains the following components: +The control plane is responsible for managing the cluster. Control plane nodes run components that store state, expose the API, and coordinate scheduling and reconciliation: -- **API Server**: It is the entry point for all the REST commands used to control the cluster. It is the only component that communicates with the etcd. -- **Etcd**: It stores the current state of the cluster. It's like a cluster brain. -- **Scheduler**: Decide which worker node will be best to deploy the next pods, after examining the resources and other paras. It does not schedule the pods, it just decides. -- **Controller Manager**: Detect the current state of the cluster and keep the desired state of pods running. Follow requests when some things need to change/added to a worker node -- **Cloud Controller Manager**: It Communicates with the cloud provider's API to create, delete, and update the resources. +- **API Server**: Entry point for cluster operations. Clients, controllers, and tooling talk to the API server. +- **etcd**: Stores the cluster's state and configuration data. +- **Scheduler**: Chooses which node should run a newly created Pod. +- **Controller Manager**: Runs reconciliation loops that move actual cluster state toward the desired state. +- **Cloud Controller Manager**: Integrates Kubernetes with cloud provider APIs when the cluster is running in the cloud. ## Data Plane -Data Plane is responsible for running the application. It contains the worker nodes. And each worker node contains the following components: +The data plane consists of worker nodes that actually run application workloads. -- **Kubelet**: It is an agent that runs on each node in the cluster. It makes sure that the containers are running in a pod. -- **Kube Proxy**: Maintains network rules on the node, that allow network communication to your Pods from network sessions inside or outside of your cluster. -- **Container Runtime** - Like Docker, ContainerD, etc. Which runs the container +- **Kubelet**: Agent on each node that makes sure Pods are running as described. +- **kube-proxy**: Maintains networking rules so traffic can reach Pods and Services. +- **Container runtime**: Runs containers on the node. Common CRI-compatible runtimes include `containerd` and `CRI-O`. ## CRI - Container Runtime Interface -It is a plugin interface that enables kubelet to use a wide variety of container runtimes, without the need to recompile the kubelet binary. It is a standard interface between Kubernetes and container runtimes. Previously, Docker was the default container runtime for Kubernetes and their was component called `dockershim` which was used to communicate with Docker. But it was removed in Kubernetes 1.20. and Docker is no longer the default container runtime. Now, the default container runtime is ContainerD. Popular choices are ContainerD, CRI-O, etc. +CRI is the standard interface between kubelet and container runtimes. It allows Kubernetes to work with different runtimes without recompiling kubelet. + +Historically, many clusters used Docker through a compatibility layer called `dockershim`. Dockershim was removed in Kubernetes 1.24, so modern clusters typically use CRI-compatible runtimes such as `containerd` or `CRI-O` directly. ## CNI - Container Network Interface @@ -52,7 +59,13 @@ It is a specification and libraries for writing plugins to configure network int It is a standard for exposing arbitrary block and file storage systems to containerized workloads on Kubernetes. It is used to provide persistent storage to the containers. It is a standard interface between Kubernetes and storage providers. It is used to provide persistent storage to the containers. Popular choices are Rook, OpenEBS, etc. -Custom Resource Definition - It allows you to define your own resources in Kubernetes. It extends the Kubernetes API. +Custom Resource Definition (CRD) lets you define your own resource types in Kubernetes and extend the API. + +Useful references: + +- [Kubernetes Concepts](https://kubernetes.io/docs/concepts/) +- [Container Runtime Interface (CRI)](https://kubernetes.io/docs/concepts/containers/cri/) +- [Dockershim removal in Kubernetes 1.24](https://kubernetes.io/blog/2021/11/12/are-you-ready-for-dockershim-removal/) ## Imperative Vs Declarative @@ -73,17 +86,17 @@ spec: # The desired state of the object ## Namespaces -Isolated environment, we can group resources separately like a database. Also, great for running different versions of the app. By default, we have a namespace called `default`. We can create a new namespace by creating a YAML file. +Namespaces are a logical way to group resources inside a cluster. They are useful for separating teams, applications, or environments such as `dev`, `staging`, and `prod`. -NOTE: By default namespaces DO NOT provide any security and Networking Boundary. It is just a logical separation of resources. +NOTE: Namespaces do not automatically provide security or network isolation by themselves. They are a logical boundary, not a complete security boundary. -We can create a namespace either by CLI or by +We can create a namespace either from the CLI: ```bash kubectl create namespace ``` -or in a declarative way vy creating a YAML file and then applying it. +or declaratively with a YAML manifest: ```yaml apiVersion: v1 @@ -92,7 +105,7 @@ metadata: name: non-default-namespace ``` -We can apply it by +We can apply it with: ```bash kubectl apply -f .yaml @@ -104,13 +117,17 @@ Some useful commands for namespaces kubectl get namespaces # To get all the namespaces ``` -We can also switch the namespace by +We can also switch the default namespace in the current context: + +```bash +kubectl config set-context --current --namespace= +``` ## Pods The "smallest deployable unit" in Kubernetes. It is a group of one or more containers, with shared storage/network, and a specification for how to run the containers. It is the basic building block of Kubernetes. -It's not recommended to create a pod directly, instead, we should create a deployment, which will create a pod for us. But we can create a pod by +It's usually better to create a higher-level workload like a Deployment, which manages Pods for you. But you can create a Pod directly for learning or troubleshooting: ```bash kubectl run --image= @@ -122,7 +139,7 @@ Or by creating in a declarative way by creating a YAML file and then applying it apiVersion: v1 kind: Pod metadata: - name: ngix-pod + name: nginx-pod namespace: my-namespace spec: containers: @@ -1249,4 +1266,4 @@ For communicating with a Pod in the different Namespace, we can use the below co ## CustomResourceDefinition (CRD) ## LimitRange ## NetworkPolicy ---> \ No newline at end of file +--> diff --git a/docs/kubernetes/k8s-resources-type/pod/pod.yaml b/docs/kubernetes/k8s-resources-type/pod/pod.yaml index 989d91b..4d23ec0 100644 --- a/docs/kubernetes/k8s-resources-type/pod/pod.yaml +++ b/docs/kubernetes/k8s-resources-type/pod/pod.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: Pod metadata: - name: ngix-pod + name: nginx-pod namespace: my-namespace spec: containers: diff --git a/docs/qna.md b/docs/qna.md index d692351..279e710 100644 --- a/docs/qna.md +++ b/docs/qna.md @@ -9,7 +9,7 @@ Having questions or doubts about DevOps is totally reasonable and normal. Here a ### Do I need to know programming to learn DevOps? -Yes, you need to know programming to learn DevOps. DevOps is a combination of software development (Dev) and information technology operations (Ops). You need to know programming to automate the process of software delivery and infrastructure changes. +You do not need to be an application developer before you start, but basic scripting and problem-solving skills help a lot. In practice, most DevOps work involves reading code, writing small scripts, working with configuration, and understanding how applications behave in production. ### What are the prerequisites to learn DevOps? @@ -17,7 +17,7 @@ It's good to have knowledge of one programming language, databases, operating sy ### Do I need to know Linux to learn DevOps? -Yes, you need to know Linux to learn DevOps. Linux is the most popular operating system used in the DevOps world. You need to know Linux commands and bash scripting. In most places, you will be writing Linux commands only. +Linux basics are high leverage because many servers, containers, CI environments, and cloud workloads run on Linux. You do not need expert-level Linux knowledge on day one, but you should get comfortable with the command line, files, processes, networking basics, and shell scripting. ### Do I need to learn all the tools in DevOps? @@ -29,7 +29,7 @@ You can start learning DevOps by understanding the basics of DevOps, the DevOps ### Is DevOps hard to learn? -No, DevOps is not hard to learn. Yes, it's a vast field with many tools available, but you can start by understanding the basics of DevOps, the DevOps lifecycle, networking concepts, Linux commands, and Git. Then, start learning the tools in DevOps. You can start with one tool and then learn others. +It is not easy because the field is broad, but it becomes manageable when you learn in layers. Focus on fundamentals first, then add one tool at a time. The difficulty usually comes from trying to learn every tool at once, not from any single concept. ### Can a beginner learn DevOps? @@ -41,7 +41,7 @@ There is no fixed time to learn DevOps. It depends on your current knowledge, ho ### Do I need to know cloud to learn DevOps? -Yes, you need to know about the cloud to learn DevOps. Cloud is an essential part of DevOps. You need to know how to deploy your applications on the cloud, manage your infrastructure on the cloud, and monitor your applications on the cloud. It's not a prerequisite, and you can learn about the cloud while learning DevOps. +Cloud knowledge becomes important quickly because many teams deploy and operate software on AWS, Azure, or Google Cloud. It is useful, but not a prerequisite. You can start with local environments and core concepts, then add cloud services once the fundamentals make sense. ### What resources are available to learn DevOps? @@ -55,4 +55,4 @@ Here are some communities you can join while learning DevOps: - [Docker Slack](https://www.docker.com/community) - [kubesimplify Discord Community](https://kubesimplify.com/) - [Collabnix Slack](https://collabnix.com) -- [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/) \ No newline at end of file +- [Cloud Native Computing Foundation (CNCF)](https://www.cncf.io/) diff --git a/docs/terraform/introduction.md b/docs/terraform/introduction.md index 67b8cca..f8bbd28 100644 --- a/docs/terraform/introduction.md +++ b/docs/terraform/introduction.md @@ -7,7 +7,7 @@ keywords: ["Terraform", "Infrastructure as Code", "HashiCorp"] slug: "/terraform" --- -Terraform is an open source infrastructure as code software tool created by HashiCorp. It allows users to define and provision infrastructure using a declarative configuration language. Terraform manages infrastructure across multiple cloud providers and on-premises environments. It uses a simple syntax called HashiCorp Configuration Language (HCL) to define the infrastructure components and their dependencies. +Terraform is an infrastructure as code tool created by HashiCorp. It lets you define infrastructure in configuration files, compare the desired state with the real environment, and apply changes in a controlled way. Terraform works across many cloud providers, SaaS platforms, and on-premises systems through provider plugins. ## Challenges with traditional infra @@ -24,7 +24,7 @@ To solve these challenges, organizations are adopting Infrastructure as Code (Ia ## Infrastructure as Code (IaC) -Infrastructure as Code (IaC) is the practice of managing infrastructure using code and automation. With IaC, infrastructure configurations are defined in code files that can be version-controlled. In the Iac tooling space we have 3 types of tools: +Infrastructure as Code (IaC) is the practice of managing infrastructure using code and automation. With IaC, infrastructure configurations are defined in version-controlled files. In the IaC tooling space, you will usually see three broad categories: - **Configuration Management Tools**: Tools like Ansible, Chef, and Puppet are used to automate the configuration of servers and applications. - **Server Templating Tools**: Tools like Packer and Docker are used to create machine images that can be deployed across different environments. @@ -34,7 +34,7 @@ Infrastructure as Code (IaC) is the practice of managing infrastructure using co ## Why Terraform? -Terraform is a popular Infrastructure as Code tool that allows you to define and provision infrastructure using a declarative configuration language. With Terraform we can deploy infrastructure across multiple cloud providers like AWS, Azure, Google Cloud, and on-premises environments. And it supports a variety of providers like Cloudflare, Grafana, Auth0, and more. +Terraform is popular because it uses a consistent workflow across many providers. You write configuration, initialize the working directory, review an execution plan, and then apply changes. HashiCorp's documentation describes providers as plugins that let Terraform interact with cloud platforms and other APIs. ![Terraform Providers](https://github.com/user-attachments/assets/e4fa9895-4cff-4b2d-b637-f1c97b38d599) @@ -51,9 +51,9 @@ resource "aws_instance" "example" { } ``` -It start by creating a configuration file and then work in three phases, **init** to initialize the working directory, **plan** to create an execution plan, and **apply** to apply the changes (more info below) +The usual workflow is to write configuration first and then move through `terraform init`, `terraform plan`, and `terraform apply`. -Each object the Terraform manages is called a **resource**. Resources are defined in Terraform configuration files, and Terraform uses providers to interact with APIs of cloud providers and services. If any of resources go out of sync with the desired state, Terraform can update the resources to match the desired state. +Each object Terraform manages is called a **resource**. Resources are declared in configuration files, and providers expose the resource types and data sources available for a given platform or API. ### Terraform benefits @@ -81,12 +81,12 @@ Syntax: It consists of blocks, arguments, and expressions. Blocks contains information about the infrastructure platform and resources within that platform we want to create. Arguments are key-value pairs that define the configuration settings for a block. Expressions are used to reference variables, functions, and other resources within the configuration. -For example if want to create a file locally with some content, we can define the following configuration: +For example, if you want to create a file locally with some content, you can define the following configuration: ```hcl # local.tf resource "local_file" "pet" { - filename = "/root/pets.txt" + filename = "./pets.txt" content = "We love pets!" } ``` @@ -117,7 +117,7 @@ resource "aws_s3_bucket" "example" { ### Terraform Workflow -To deploy a resource using Terraform, there is four step process: +To deploy resources with Terraform, a common workflow looks like this: 1. **Configuration**: Define the infrastructure components and their dependencies in Terraform configuration files. 2. **Initialization**: Initialize the working directory with `terraform init` command to download the necessary providers and modules. @@ -175,7 +175,12 @@ To destroy the resources created by Terraform, we can run `terraform destroy` co ### Terraform Providers -Terraform uses plugin based architecture to interact with cloud providers and services. Providers are responsible for understanding API interactions and exposing resources for managing infrastructure. Terraform supports a wide range of providers like AWS, Azure, Google Cloud, Kubernetes, Docker, and more. When we do `terraform init`, it downloads the necessary providers and modules. A list of available providers can be found on the [Terraform Registry](https://registry.terraform.io/browse/providers). +Terraform uses a plugin-based architecture to interact with cloud providers and services. Providers are responsible for understanding API interactions and exposing resource types and data sources. When you run `terraform init`, Terraform downloads the providers and modules needed for the current configuration. A list of available providers can be found on the [Terraform Registry](https://registry.terraform.io/browse/providers). + +Useful references: + +- [Terraform `init` command reference](https://developer.hashicorp.com/terraform/cli/commands/init) +- [Provider block reference](https://developer.hashicorp.com/terraform/language/providers/configuration) There are three types of providers: @@ -1503,7 +1508,7 @@ unset TF_LOG ## Terraform Import -So, there will not always be the case that every resource is being created and managed by Terraform. Sometimes we have to import it. Terraform import is used to import existing resources into Terraform state. It is used to import resources that were created outside of Terraform. For example some resources were created manually or using the AWS Management Console or using another Iac tool like Ansible or CloudFormation. +So, there will not always be the case that every resource is being created and managed by Terraform. Sometimes we have to import it. Terraform import is used to import existing resources into Terraform state. It is used to import resources that were created outside of Terraform. For example some resources were created manually or using the AWS Management Console or using another IaC tool like Ansible or CloudFormation. ![Terraform Import](https://github.com/user-attachments/assets/2aee6966-4b1e-4c36-af55-a0b65f3c342c) @@ -1839,4 +1844,3 @@ variable "ami" { Now if we create a new workspace like `ProjectA` and run the `terraform apply` command, it will use the `ami-0c55b159cbfafe1f0` AMI. If we create a new workspace like `ProjectB` and run the `terraform apply` command, it will use the `ami-oe4b3bfb4c0e9b2` AMI. We can use the `terraform workspace list` command to list the workspaces and the `terraform workspace select` command to select a workspace. The way terraform manages the the state files for different workspaces is that it creates a separate directory for each workspace and stores the state file in that directory. And all the directories are named as `terraform.tfstate.d/`. - diff --git a/docusaurus.config.js b/docusaurus.config.js index 12eafa4..6dd6126 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -9,7 +9,7 @@ import {themes as prismThemes} from 'prism-react-renderer'; /** @type {import('@docusaurus/types').Config} */ const config = { title: 'DevOps', - tagline: 'Learn DevOps', + tagline: 'Practical DevOps notes, examples, and learning paths', favicon: 'img/favicon.ico', url: 'https://devops.pradumnasaraf.dev', baseUrl: '/', @@ -34,6 +34,7 @@ const config = { docs: { sidebarPath: './sidebars.js', routeBasePath: '/', + showLastUpdateTime: true, editUrl: 'https://github.com/Pradumnasaraf/DevOps/edit/main/', }, @@ -60,6 +61,15 @@ const config = { // searchParameters: {}, //... other algolia configuration }, + colorMode: { + respectPrefersColorScheme: true, + }, + docs: { + sidebar: { + hideable: true, + autoCollapseCategories: true, + }, + }, image: 'img/devops-repo-card.png', navbar: { title: 'DevOps', @@ -68,14 +78,49 @@ const config = { src: 'img/logo.svg', }, items: [ + { + to: '/', + label: 'Start Here', + position: 'left', + }, + { + to: '/qna', + label: 'Q&A', + position: 'left', + }, + { + to: '/docker', + label: 'Docker', + position: 'left', + }, + { + to: '/kubernetes', + label: 'Kubernetes', + position: 'left', + }, + { + to: '/terraform', + label: 'Terraform', + position: 'left', + }, + { + to: '/github-actions', + label: 'GitHub Actions', + position: 'left', + }, { href: 'https://github.com/Pradumnasaraf/DevOps', label: 'GitHub', position: 'right', }, { - href: 'https://twitter.com/pradumna_Saraf', - label: 'Twitter', + href: 'https://x.com/pradumna_Saraf', + label: 'X', + position: 'right', + }, + { + to: '/feedback', + label: 'Contribute', position: 'right', }, ], @@ -87,6 +132,63 @@ const config = { href: 'https://devops.pradumnasaraf.dev', }, style: 'light', + links: [ + { + title: 'Start', + items: [ + { + label: 'Introduction', + to: '/', + }, + { + label: 'Q&A', + to: '/qna', + }, + { + label: 'Feedback', + to: '/feedback', + }, + ], + }, + { + title: 'Popular Topics', + items: [ + { + label: 'Docker', + to: '/docker', + }, + { + label: 'Kubernetes', + to: '/kubernetes', + }, + { + label: 'Terraform', + to: '/terraform', + }, + { + label: 'GitHub Actions', + to: '/github-actions', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'GitHub Repository', + href: 'https://github.com/Pradumnasaraf/DevOps', + }, + { + label: 'Open an Issue', + href: 'https://github.com/Pradumnasaraf/DevOps/issues/new/choose', + }, + { + label: 'Follow Pradumna', + href: 'https://x.com/pradumna_Saraf', + }, + ], + }, + ], copyright: `Copyright © ${new Date().getFullYear()} Pradumna Saraf`, }, prism: { diff --git a/package-lock.json b/package-lock.json index 5df3006..3833978 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,18 +6,16 @@ "packages": { "": { "name": "devops", - "version": "2.6.1", + "version": "2.6.2", "dependencies": { "@docusaurus/core": "^3.9.2", "@docusaurus/plugin-client-redirects": "^3.9.2", "@docusaurus/preset-classic": "^3.9.2", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", - "glob": "^13.0.0", "prism-react-renderer": "^2.4.1", - "react": "^19.2.3", - "react-dom": "^19.2.3", - "rimraf": "^6.1.2" + "react": "^19.2.4", + "react-dom": "^19.2.4" }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.9.2", @@ -233,7 +231,6 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.46.0.tgz", "integrity": "sha512-22SHEEVNjZfFWkFks3P6HilkR3rS7a6GjnCIqR22Zz4HNxdfT0FG+RE7efTcFVfLUkTTMQQybvaUcwMrHXYa7Q==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/client-common": "5.46.0", "@algolia/requester-browser-xhr": "5.46.0", @@ -359,7 +356,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2149,7 +2145,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -2172,7 +2167,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2282,7 +2276,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2704,7 +2697,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3663,7 +3655,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz", "integrity": "sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==", "license": "MIT", - "peer": true, "dependencies": { "@docusaurus/core": "3.9.2", "@docusaurus/logger": "3.9.2", @@ -4114,27 +4105,6 @@ "@hapi/hoek": "^9.0.0" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -4381,7 +4351,6 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", - "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -4700,7 +4669,6 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -4811,15 +4779,6 @@ "node": ">=14.16" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -4888,9 +4847,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, "node_modules/@types/estree-jsx": { @@ -5078,7 +5037,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -5426,11 +5384,10 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5438,6 +5395,18 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5500,11 +5469,10 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -5550,7 +5518,6 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.46.0.tgz", "integrity": "sha512-7ML6fa2K93FIfifG3GMWhDEwT5qQzPTmoHKCTvhzGEwdbQ4n0yYUWZlLYT75WllTGJCJtNUI0C1ybN4BCegqvg==", "license": "MIT", - "peer": true, "dependencies": { "@algolia/abtesting": "1.12.0", "@algolia/client-abtesting": "5.46.0", @@ -5974,9 +5941,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -6014,7 +5981,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -6971,7 +6937,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -7712,13 +7677,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -7764,9 +7729,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -8174,9 +8139,9 @@ "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/express/node_modules/range-parser": { @@ -8331,11 +8296,10 @@ } }, "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -8641,23 +8605,6 @@ "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", "license": "ISC" }, - "node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "path-scurry": "^2.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -8692,21 +8639,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "license": "BSD-2-Clause" }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/global-dirs": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", @@ -10111,12 +10043,16 @@ "license": "MIT" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -10149,9 +10085,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash.debounce": { @@ -12613,9 +12549,9 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -12633,15 +12569,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -12729,9 +12656,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" @@ -12824,11 +12751,10 @@ } }, "node_modules/null-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13117,12 +13043,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -13280,31 +13200,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/path-to-regexp": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", @@ -13330,9 +13225,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -13375,7 +13270,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -14279,7 +14173,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -14953,9 +14846,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -14999,15 +14892,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -15072,26 +14956,24 @@ } }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^19.2.4" } }, "node_modules/react-fast-compare": { @@ -15142,7 +15024,6 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" }, @@ -15171,7 +15052,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -15765,25 +15645,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz", - "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==", - "license": "BlueOak-1.0.0", - "dependencies": { - "glob": "^13.0.0", - "package-json-from-dist": "^1.0.1" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rtlcss": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", @@ -15864,10 +15725,13 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", - "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", - "license": "BlueOak-1.0.0" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/scheduler": { "version": "0.27.0", @@ -15882,9 +15746,9 @@ "license": "Apache-2.0" }, "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -16040,24 +15904,24 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=20.0.0" } }, "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "mime-types": "2.1.18", - "minimatch": "3.1.2", + "minimatch": "3.1.5", "path-is-inside": "1.0.2", "path-to-regexp": "3.3.0", "range-parser": "1.2.0" @@ -16790,18 +16654,18 @@ "license": "MIT" }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.0.0", + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo" @@ -16837,12 +16701,16 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { @@ -16864,15 +16732,14 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -17057,8 +16924,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-fest": { "version": "2.19.0", @@ -17444,11 +17310,10 @@ } }, "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17620,9 +17485,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -17652,35 +17517,36 @@ } }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.105.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", + "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -17919,46 +17785,14 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, "node_modules/webpack/node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -17980,24 +17814,6 @@ "node": ">= 0.6" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpackbar": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", @@ -18295,7 +18111,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 1229177..db813bc 100644 --- a/package.json +++ b/package.json @@ -18,16 +18,17 @@ "@docusaurus/preset-classic": "^3.9.2", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", - "glob": "^13.0.0", "prism-react-renderer": "^2.4.1", - "react": "^19.2.3", - "react-dom": "^19.2.3", - "rimraf": "^6.1.2" + "react": "^19.2.4", + "react-dom": "^19.2.4" }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.9.2", "@docusaurus/types": "^3.9.2" }, + "overrides": { + "serialize-javascript": "7.0.5" + }, "browserslist": { "production": [ ">0.5%", diff --git a/src/components/HomepageFeatures/index.js b/src/components/HomepageFeatures/index.js index acc7621..98d9ca8 100644 --- a/src/components/HomepageFeatures/index.js +++ b/src/components/HomepageFeatures/index.js @@ -1,63 +1,51 @@ -import clsx from 'clsx'; +import Link from '@docusaurus/Link'; import Heading from '@theme/Heading'; import styles from './styles.module.css'; -const FeatureList = [ +const topics = [ { - title: 'Easy to Use', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), + title: 'Docker', + href: '/docker', + description: 'Containers, images, Compose, and packaging fundamentals.', }, { - title: 'Focus on What Matters', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), + title: 'Kubernetes', + href: '/kubernetes', + description: 'Architecture, workloads, services, and day-to-day cluster concepts.', }, { - title: 'Powered by React', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), + title: 'GitHub Actions', + href: '/github-actions', + description: 'Workflow basics, runners, triggers, and reusable automation patterns.', + }, + { + title: 'Terraform', + href: '/terraform', + description: 'Infrastructure as code, providers, plans, and dependency management.', }, ]; -function Feature({Svg, title, description}) { - return ( -
-
- -
-
- {title} -

{description}

-
-
- ); -} - export default function HomepageFeatures() { return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
+
+
+ + Explore Core Topics + +

+ Start with the areas most people reach for first, then expand into the rest of the + library from the sidebar. +

+
+
+ {topics.map((topic) => ( + + + {topic.title} + +

{topic.description}

+ + ))}
); diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css index b248eb2..5cd31d5 100644 --- a/src/components/HomepageFeatures/styles.module.css +++ b/src/components/HomepageFeatures/styles.module.css @@ -1,11 +1,56 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; +.topicsSection { + margin: 3rem 0; } -.featureSvg { - height: 200px; - width: 200px; +.header { + margin-bottom: 1.25rem; +} + +.title { + margin-bottom: 0.4rem; +} + +.description { + margin: 0; + color: var(--ifm-color-emphasis-700); + max-width: 44rem; +} + +.grid { + display: grid; + gap: 1rem; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.card { + display: block; + padding: 1.25rem; + color: inherit; + text-decoration: none; + border: 1px solid var(--ifm-color-emphasis-200); + border-radius: 12px; + background: var(--ifm-background-surface-color); + transition: border-color 150ms ease, background 150ms ease; +} + +.card:hover { + text-decoration: none; + border-color: var(--ifm-color-primary); + background: var(--ifm-hover-overlay); +} + +.cardTitle { + margin: 0 0 0.35rem; + font-size: 1.1rem; +} + +.cardDescription { + margin: 0; + color: var(--ifm-color-emphasis-700); +} + +@media (max-width: 768px) { + .grid { + grid-template-columns: 1fr; + } } diff --git a/src/css/custom.css b/src/css/custom.css index 2bc6a4c..405f438 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -1,10 +1,3 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ :root { --ifm-color-primary: #2e8555; --ifm-color-primary-dark: #29784c; @@ -14,10 +7,11 @@ --ifm-color-primary-lighter: #359962; --ifm-color-primary-lightest: #3cad6e; --ifm-code-font-size: 95%; + --ifm-navbar-height: 4rem; + --ifm-global-radius: 10px; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); } -/* For readability concerns, you should choose a lighter palette in dark mode. */ [data-theme='dark'] { --ifm-color-primary: #25c2a0; --ifm-color-primary-dark: #21af90; @@ -28,3 +22,43 @@ --ifm-color-primary-lightest: #4fddbf; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } + +.theme-doc-sidebar-container { + border-right: 1px solid var(--ifm-toc-border-color); +} + +.theme-doc-markdown, +.markdown { + font-size: 1rem; +} + +.theme-doc-markdown > h2 { + margin-top: 2.5rem; +} + +.theme-doc-markdown img { + border-radius: 8px; +} + +.table-of-contents { + border-left: 1px solid var(--ifm-color-emphasis-200); +} + +.table-of-contents__link--active { + font-weight: 700; +} + +.pagination-nav__link { + border-radius: 10px; +} + +.theme-code-block, +pre { + border-radius: 10px; +} + +@media (max-width: 996px) { + .theme-doc-sidebar-container { + border-right: none; + } +} From 64fc001715edb441bae2699da32450828573f858 Mon Sep 17 00:00:00 2001 From: Pradumna Saraf Date: Fri, 3 Apr 2026 20:41:39 +0530 Subject: [PATCH 2/5] docs: update introduction content across multiple topics, enhancing clarity and detail in descriptions --- docs/argocd/introduction.md | 18 +++++------ docs/bash-scripting/introduction.md | 34 ++++++++++----------- docs/devsecops/introduction.md | 15 +++++++-- docs/git/introduction.md | 11 +++++-- docs/github-actions/scenarios.md | 4 +-- docs/gitops/introduction.md | 16 +++++----- docs/golang/introduction.md | 47 +++++++++++++++++------------ docs/helm/introduction.md | 38 ++++++++++++----------- docs/jenkins/introduction.md | 28 ++++++++--------- docs/linux/introduction.md | 13 ++++---- docs/networking/introduction.md | 18 ++++++----- docs/prometheus/introduction.md | 10 +++--- docs/terraform/commands.md | 17 +++++------ docs/webassembly/introduction.md | 35 +++++++++++---------- docs/yaml/introduction.md | 32 ++++++++++---------- src/css/custom.css | 23 ++++++++++++++ 16 files changed, 203 insertions(+), 156 deletions(-) diff --git a/docs/argocd/introduction.md b/docs/argocd/introduction.md index f1d69fe..da648d9 100644 --- a/docs/argocd/introduction.md +++ b/docs/argocd/introduction.md @@ -7,17 +7,17 @@ keywords: ["ArgoCD", "GitOps", "Kubernetes", "Continuous Delivery"] slug: "/argocd" --- -Argo CD is a popular GitOps controller. It is used to deploy applications to Kubernetes clusters. It is also used to manage the configuration of the cluster itself. It can be changed too. +Argo CD is a GitOps controller for Kubernetes. It watches a Git repository, compares the desired state with the current cluster state, and helps keep them in sync. It is commonly used to deploy applications and manage cluster configuration declaratively. -> _"One the founding principles of GitOps - everything stored in Git."_ +> One of the main ideas in GitOps is simple: store the desired state in Git. -- For production we can use the [Autopilot](https://github.com/argoproj-labs/argocd-autopilot). For a traditional approach we can use the [Manifest directory](https://github.com/argoproj/argo-cd/tree/master/manifests) approach. Community [Helm](https://github.com/argoproj/argo-helm/tree/master/charts/argo-cd) charts are also available +- For production, you can use tools such as [Autopilot](https://github.com/argoproj-labs/argocd-autopilot), install from the official [manifest directory](https://github.com/argoproj/argo-cd/tree/master/manifests), or use the community [Helm chart](https://github.com/argoproj/argo-helm/tree/master/charts/argo-cd).

Screenshot 2022-11-29 at 11 44 57 PM

### Installation -- By applying the manifests . Reference: [ArgoCD Installation](https://argoproj.github.io/argo-cd/getting_started/#1-install-argo-cd) +- Install it by applying the manifests. Reference: [Argo CD Installation](https://argoproj.github.io/argo-cd/getting_started/#1-install-argo-cd) ```bash kubectl create namespace argocd @@ -27,7 +27,7 @@ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/st Default credentials: - Username: admin -- Password : It can be found by running the following command +- Password: You can get it by running the following command ```bash kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d @@ -37,11 +37,11 @@ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.pas

Screenshot 2022-11-30 at 4 56 41 PM

-- **Auto Sync** - ArgoCD will automatically sync the application with the Git repository. This is done by polling the Git repository at a specified interval. +- **Auto Sync** - Argo CD automatically syncs the application with the Git repository. -- **Self Healing** - If the changes are done directly to deployment/cluster, it will discard those changes and keep the state as per the Git repository. For example, if someone change the replica count to two from 1 from the CLI, it will be changed back to 1. +- **Self Healing** - If someone changes resources directly in the cluster, Argo CD can revert them so the live state matches Git again. -- **Auto Pruning** - ArgoCD will automatically delete the resources that are not present in the Git repository. By default, it will not. +- **Auto Pruning** - Argo CD can automatically remove resources that are no longer defined in Git. ## Progressive Delivery @@ -51,7 +51,7 @@ Progressive Delivery is the practice of deploying an application in a gradual ma - **Canary** - Deploy the new version of the application to a small subset of users. If the new version is working fine, then deploy it to the rest of the users. This is the most common form of progressive delivery. It is also the most complex to implement. It requires a lot of infrastructure and a lot of testing. -- To make the whole setup declarative way and make it infrastructure as we deploy ArgoCD Argo CD applications just like any other Kubernetes resource. This is also managed through a git repository. +- To keep the whole setup declarative, we can define Argo CD applications just like any other Kubernetes resource and store them in Git as well. [Docs](https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/) for reference. diff --git a/docs/bash-scripting/introduction.md b/docs/bash-scripting/introduction.md index abf7185..d2e5edd 100644 --- a/docs/bash-scripting/introduction.md +++ b/docs/bash-scripting/introduction.md @@ -7,7 +7,7 @@ keywords: ["Bash", "Scripting", "Unix", "Shell"] slug: "/bash" --- -We start by creating a file with the `.sh` extension. For example, `script.sh`. Then we write the script in it. For example: +We usually start by creating a file with the `.sh` extension, for example `script.sh`, and then add Bash commands to it. Basic Script @@ -17,15 +17,15 @@ Basic Script echo "Hello World" ``` -We can run this by `bash script.sh` or `./script.sh`. But the second will only work if the script is executable (permission to execute). We can make it executable by `chmod +x script.sh`. Now we can run it by `./script.sh`. +You can run this script with `bash script.sh` or `./script.sh`. The second form only works if the file is executable. To make it executable, run `chmod +x script.sh`. ### Shebang -The first line of a bash script is called the shebang. It tells the system which interpreter to use to run the script. The shebang for bash is `#!/bin/bash`. The shebang for python is `#!/usr/bin/env python`. It varies from language to language. +The first line of a Bash script is called the shebang. It tells the system which interpreter should run the file. For Bash, a common shebang is `#!/bin/bash`. ### Variables -It is a placeholder for a value. Just like any other programming language. We use $ to access the variable. Eg: `$NAME`. We can also use `${NAME}`. The braces ensure the variable is not mistaken for a command. +A variable is a named value. In Bash, we use `$` to read it, for example `$NAME`. You can also write `${NAME}` when you want to make the variable boundary explicit. ```bash #!/bin/bash @@ -39,9 +39,9 @@ echo "My name is $NAME" echo "My name is ${NAME}" ``` -NOTE: We can create variables by `NAME="John"` through CLI; we can't use it in the script because it is not exported. We can export it by `export NAME="John"`. Now we can use it in the script. +NOTE: If you set `NAME="John"` in the shell, it is only a shell variable. To make it available to child processes, export it with `export NAME="John"`. -But here is one more catch. If we exit the terminal and open a new one, the variable will be gone. To make it permanent, we can add it to the `.bashrc` file. It is a hidden file in the home directory. We can open it by `vi ~/.bashrc` or any other editor. We can add the variable to the file. Eg: `export NAME="John"`. +If you close the terminal, that exported variable is gone. To make it persistent for future shell sessions, add it to `~/.bashrc` or your shell startup file. ### User Input @@ -59,7 +59,7 @@ echo "Hello $NAME, nice to meet you!" We can pass arguments to the script. The arguments are stored in the `$1`, `$2`, `$3` and so on. `$0` is the name of the script. -Eg: `bash script.sh arg1 arg2` +Example: `bash script.sh arg1 arg2` ```bash #!/bin/bash @@ -69,7 +69,7 @@ echo "First Argument: $1" ### Arithmetic Operations -We can do Arithmetic operations in bash. We use the `(( ))` to do Arithmetic operations. +We can do arithmetic operations in Bash with `(( ))`. ```bash #!/bin/bash @@ -104,9 +104,7 @@ else fi ``` -```bash -if [$1 == "hello"], then echo "Hello World", fi -``` +The compact one-line form exists, but the block form is easier to read and debug. #### Comparison Operators @@ -173,7 +171,7 @@ done ### Functions -We can create functions in bash. The syntax is: +We can create functions in Bash like this: ```bash #!/bin/bash @@ -186,16 +184,16 @@ sayHello ``` -- `exit 1` - Exit the script with an error (non-zero exit code). -- $RANDOM gives a random number between 0 and 32767. -- $SHELL gives the path of the shell. -- $USER gives the username of the user. -- $HOSTNAME gives the hostname of the machine. +- `exit 1` exits the script with a non-zero status code. +- `$RANDOM` gives a random number between `0` and `32767`. +- `$SHELL` gives the path of the shell. +- `$USER` gives the username of the current user. +- `$HOSTNAME` gives the hostname of the machine. ### jq -jq is a command-line JSON processor. It is used to parse JSON. It is used to extract data from JSON. It is used to transform JSON. It is used to generate JSON. +`jq` is a command-line JSON processor. It is useful for reading, filtering, transforming, and generating JSON from shell scripts. #### Installation diff --git a/docs/devsecops/introduction.md b/docs/devsecops/introduction.md index 1044644..b32c9b5 100644 --- a/docs/devsecops/introduction.md +++ b/docs/devsecops/introduction.md @@ -7,8 +7,17 @@ keywords: ["DevSecOps", "DevOps", "Security"] slug: "/devsecops" --- -It is a set of practices that combines software development (Dev) and information security (Sec) to shorten the systems development life cycle while providing continuous monitoring to ensure the delivery of secure software. +DevSecOps is the practice of integrating security into the software delivery lifecycle instead of treating it as a separate step at the end. The goal is to build, test, ship, and operate software with security checks built into the workflow. -- [DevSecOps](https://www.redhat.com/en/topics/devops/what-is-devsecops) +In practice, DevSecOps usually includes: -# MORE INFO COMING SOON \ No newline at end of file +- scanning dependencies and container images +- checking infrastructure and configuration for misconfigurations +- shifting security review earlier into CI/CD pipelines +- keeping feedback fast so teams can fix issues before release + +Good DevSecOps is not about adding more gates everywhere. It is about making secure defaults, useful automation, and fast feedback part of normal engineering work. + +### What's next? + +- [DevSecOps overview from Red Hat](https://www.redhat.com/en/topics/devops/what-is-devsecops) diff --git a/docs/git/introduction.md b/docs/git/introduction.md index 56ead66..d1fa0de 100644 --- a/docs/git/introduction.md +++ b/docs/git/introduction.md @@ -7,9 +7,16 @@ keywords: ["Git", "Version Control", "Software Development"] slug: "/git" --- -Git is a distributed version control system that is used to track changes in source code during software development. It is designed to coordinate work among programmers, but it can be used to track changes in any set of files. Its goals include speed, data integrity, and support for distributed, non-linear workflows. +Git is a distributed version control system used to track changes in files, especially source code. It helps individuals and teams work on the same project without losing history, overwriting each other's work, or guessing what changed. + +In practice, Git helps you: + +- keep a history of your work +- create branches to try changes safely +- review changes before merging them +- roll back when something goes wrong ### What's next? -- [commands](./commands.md) - Learn about the commands that you can use with Git. +- [Commands](./commands.md) - Learn the Git commands you will use most often. - [Learning Resources](./learning-resources.md) - Learn more about Git with these resources. diff --git a/docs/github-actions/scenarios.md b/docs/github-actions/scenarios.md index ea58bd5..4ba52da 100644 --- a/docs/github-actions/scenarios.md +++ b/docs/github-actions/scenarios.md @@ -56,7 +56,7 @@ jobs: ### Check and Build Go Project -This workflow will check if the code is getting built and formatted correctly. It will also check for linting issues in the code. Can be useful to check incoming PRs. +This workflow checks whether the code builds correctly, is properly formatted, and passes linting. It is useful for incoming pull requests. ```yaml name: CI @@ -293,4 +293,4 @@ jobs: - name: Docker Push run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/devops:${{ steps.package-version.outputs.current-version}} -``` \ No newline at end of file +``` diff --git a/docs/gitops/introduction.md b/docs/gitops/introduction.md index fa7db61..d17addd 100644 --- a/docs/gitops/introduction.md +++ b/docs/gitops/introduction.md @@ -7,21 +7,21 @@ keywords: ["GitOps", "Kubernetes", "Continuous Delivery"] slug: "/gitops" --- -GitOps is a way of managing Kubernetes clusters using Git as the source of truth. +GitOps is a way of managing infrastructure and applications by using Git as the source of truth. In a Kubernetes setup, that usually means the desired cluster state lives in a Git repository, and an agent in the cluster applies or reconciles that state. ### Benefits of GitOps -- History of changes to the cluster is stored in Git -- Rollback to a previous version of the cluster is easy -- Changes to the cluster can be reviewed before they are applied -- Changes to the cluster can be tested before they are applied -- Changes to the cluster can be automated +- The history of changes is stored in Git. +- Rolling back to a previous state is easier. +- Changes can be reviewed before they are applied. +- Changes can be tested before they reach the cluster. +- Synchronization can be automated. ### GitOps Tools -- [ArgoCD](../argocd/introduction.md) is a git controller that can be used to deploy applications to a Kubernetes cluster. +- [Argo CD](../argocd/introduction.md) is a GitOps controller that can be used to deploy applications to a Kubernetes cluster. ### What's next? - [Learning Resources](./learning-resources.md) - Learn more about GitOps with these resources. -- [ArgoCD](../argocd/introduction.md) - Learn more about ArgoCD. \ No newline at end of file +- [Argo CD](../argocd/introduction.md) - Learn more about Argo CD. diff --git a/docs/golang/introduction.md b/docs/golang/introduction.md index 5016499..0c5b2d7 100644 --- a/docs/golang/introduction.md +++ b/docs/golang/introduction.md @@ -7,21 +7,23 @@ keywords: ["Golang", "Programming Language", "Go"] slug: "/golang" --- -Golang (or Go) is statically typed, compiled programming language designed at Google. It is syntactically similar to C, but with memory safety, garbage collection, structural typing, and CSP-style concurrency. +Go (often called Golang) is a statically typed, compiled programming language designed at Google. It is known for a simple syntax, fast compilation, built-in concurrency support, and a strong standard library. -In Golang, everything is a package. A package is a collection of source files in the same directory that are compiled together. A package can be imported by other packages. `main` is a special package that defines a standalone executable program, not a library. +In Go, code is organized into packages. A package is a collection of source files in the same directory that are compiled together. The special package `main` defines an executable program. ## Installation -- [Download](https://golang.org/dl/) and install Go +- [Download](https://golang.org/dl/) and install Go. -- Garbage collected -- Multithreading -- concurrency +Some reasons people like Go: + +- Garbage collection +- Simple concurrency model +- Fast compilation ## Packages -Module is a collection of related Go packages that are versioned together as a single unit. +A module is a collection of related Go packages that are versioned together as a single unit. - fmt - formatted I/O with functions analogous to C's printf and scanf. - os - provides a platform-independent interface to operating system functionality. @@ -32,20 +34,27 @@ Module is a collection of related Go packages that are versioned together as a s - encoding/json - implements encoding and decoding of JSON. -## Hello World - Running a program +## Hello World ```go -package main // package declaration - -import "fmt" // import fmt package +package main -import ( "fmt" "os") // import multiple packages +import "fmt" func main() { -fmt.Println("Hello, World!") + fmt.Println("Hello, World!") } ``` +If you need multiple imports: + +```go +import ( + "fmt" + "os" +) +``` + We can run and compile the program using the following command: ```bash @@ -56,15 +65,15 @@ $ go run hello.go Go modules are a dependency management system that makes dependency version information explicit and easier to manage. Go modules are the future of dependency management in Go. -`go mod init github.com/username/repo` - creates a new module, initializing the go.mod file that describes it. +`go mod init github.com/username/repo` creates a new module and initializes the `go.mod` file. -- `go mod tidy` - command will add any missing modules necessary to build the current module's packages and dependencies. It will also remove any unused modules that don't provide any relevant packages. It will update the go.mod file and the go.sum file. +- `go mod tidy` adds missing dependencies and removes unused ones. It updates both `go.mod` and `go.sum`. -- `go mod verify` - command will verify dependencies have expected content. +- `go mod verify` checks that downloaded dependencies match the expected content. - `go list -m all` - command will list all modules needed to build the current module, as well as indirect and test dependencies. -- `go get` - command will add dependencies to current module and install them. +- `go get` adds or updates dependencies in the current module. - `go list -m -versions ` - command will list all available versions of a module. @@ -78,7 +87,7 @@ It is a file that contains the expected cryptographic checksums of the content o ## Go Path -Go path is an environment variable that specifies the location of your workspace. It is used to find the location of your Go code. +`GOPATH` is an environment variable that points to a Go workspace. It matters less than it used to before Go modules, but you will still see it in older tooling and setups. ## Build @@ -88,7 +97,7 @@ We can build a program using the following command: $ go build hello.go ``` -we can also build for different platforms using the following command: +We can also build for different platforms using the following command: ```bash $ GOOS=linux GOARCH=amd64 go build hello.go diff --git a/docs/helm/introduction.md b/docs/helm/introduction.md index 93e2763..606aa26 100644 --- a/docs/helm/introduction.md +++ b/docs/helm/introduction.md @@ -7,59 +7,61 @@ keywords: ["Helm", "Kubernetes", "Package Manager"] slug: "/helm" --- -Helm is package manager and a templating engine for Kubernetes. It allows you to define, install, and upgrade even the most complex Kubernetes applications. It's like apt, yum, or homebrew for Kubernetes. Primary use case is application deployment and environment management. +Helm is a package manager and templating tool for Kubernetes. It helps you define, install, upgrade, and manage Kubernetes applications using reusable charts. A common comparison is that Helm is like `apt`, `yum`, or `brew`, but for Kubernetes applications. + +Its main use case is application deployment and environment-specific configuration management. ## Helm Architecture -The new architecture of Helm 3 is very simple. It has only client-side components. The server-side components like Tiller are removed in Helm 3. Helm 3 is a client-side application that interacts with the Kubernetes API server. +Helm 3 has a simpler architecture than Helm 2. The server-side component called Tiller was removed, so Helm now works as a client-side application that talks directly to the Kubernetes API server. ### Using a Helm Chart To deploy an application using Helm, you need to create a Helm chart. A Helm chart is a collection of files that describe a related set of Kubernetes resources. A single chart might be used to deploy something simple, like a memcached pod, or something complex, like a full web app stack with HTTP servers, databases, caches, and so on. -First we need to add the repository to the helm +First, add the chart repository: ```bash helm repo add bitnami https://charts.bitnami.com/bitnami ``` -- We can update the repository using the following command +- Update the local repository index: ```bash helm repo update ``` -- Then we can install the chart using the following command +- Install the chart: ```bash helm install postgres bitnami/postgresql ``` -we can search for the available charts using the following command +Search for available charts: ```bash helm search repo bitnami ``` -Or search the available versions of the chart using the following command +Search for the available versions of a chart: ```bash helm search repo bitnami/postgresql --versions ``` -We can also pull the chart locally to look at the configuration files. `--version` flag is used to specify the version of the chart not the app version +You can also pull the chart locally to inspect its files. The `--version` flag refers to the chart version, not the application version. ```bash helm pull bitnami/postgresql --version 16.3.0 ``` -We can give values to the chart using the values flag and padding the values in the yaml file +You can pass custom values to the chart with a values file: ```bash helm install postgresql bitnami/postgresql --values values.yaml ``` -The values.yaml file should look like this +For example, the `values.yaml` file can look like this: ```yaml commonAnnotations: @@ -72,31 +74,31 @@ We can upgrade the chart using the following command helm upgrade --install postgresql bitnami/postgresql --values values.yaml --version=16.4.0 --namespace=my-namespace ``` -We can rollback the chart using the following command `postgresql` is the release name we can get the release name using `helm list`. +You can roll back the chart using the following command. Here `postgresql` is the release name, which you can get from `helm list`. ```bash helm rollback postgresql ``` -To check helm release status +To check Helm releases: ```bash helm list ``` -To check values provided by the user. Again `postgresql` is the release name +To check the values provided by the user. Again, `postgresql` is the release name: ```bash helm get values postgresql ``` -We can also get actual manifest files that are generated by the helm chart. Again `postgresql` is the release name +You can also inspect the rendered Kubernetes manifests generated by the chart. Again, `postgresql` is the release name: ```bash helm get manifest postgresql ``` -We can uninstall the chart using the following command. Again `postgresql` is the release name +You can uninstall the chart using the following command. Again, `postgresql` is the release name: ```bash helm uninstall postgresql @@ -104,13 +106,13 @@ helm uninstall postgresql ### Creating our own Helm Chart -- We can create our own helm chart using the following command. It will generate a dir with all the boilerplate code. +- You can create your own Helm chart using the following command. It generates a directory with the boilerplate files. ```bash helm create mychart ``` -- We can install the chart using the following command. `mychart` is the chart name and `./mychart` is the path to the chart +- You can install the chart using the following command. `mychart` is the release name and `./mychart` is the chart path. ```bash helm install mychart ./mychart @@ -131,4 +133,4 @@ Helm hooks are a way to interact with the lifecycle of a release. They allow you ### What's next? -[Learning Resources](./learning-resources.md) - Learn more about Helm with these resources. \ No newline at end of file +- [Learning Resources](./learning-resources.md) - Learn more about Helm with these resources. diff --git a/docs/jenkins/introduction.md b/docs/jenkins/introduction.md index 000203c..04d2796 100644 --- a/docs/jenkins/introduction.md +++ b/docs/jenkins/introduction.md @@ -7,11 +7,11 @@ keywords: ["Jenkins", "Continuous Integration", "Continuous Deployment"] slug: "/jenkins" --- -Jenkins is an open source automation server. It helps automate the parts of software development related to building, testing, and deploying, facilitating continuous integration and continuous delivery. +Jenkins is an open-source automation server. It helps automate software delivery tasks such as building, testing, and deploying applications. It is commonly used for CI/CD pipelines. ## Jenkinsfile - Pipeline as Code -Insted of configuring the pipeline in the Jenkins UI, we can define the entire pipeline in a Jenkinsfile and check it into source control. The file name is case sensitive and must be named `Jenkinsfile`. +Instead of configuring a pipeline only in the Jenkins UI, we can define it in a `Jenkinsfile` and store it in source control. The filename is case-sensitive and should be exactly `Jenkinsfile`. **This pipeline can be written in two ways:** @@ -36,7 +36,7 @@ node { ### Declarative Pipeline -Declarative Pipeline is a new way of defining the entire pipeline using a simple and easy to understand structure. +Declarative Pipeline defines the pipeline in a more structured and readable format. ```Jenkinsfile pipeline { @@ -44,7 +44,7 @@ pipeline { stages { stage('Build') { steps { - sh npm install + sh 'npm install' echo 'Building..' } } @@ -64,13 +64,13 @@ pipeline { - **Pipeline**: The top-level directive that defines the entire pipeline. - **Agent**: The agent directive defines where the entire pipeline, or a specific stage, will execute in the Jenkins environment. -- **Stages**: The stages directive defines the different stages in pipeline. +- **Stages**: The `stages` directive defines the different stages in the pipeline. - **Stage**: The stage directive defines a single stage in a pipeline. - **Steps**: The steps directive defines the steps to be executed in a stage. Post Step: -The post section is used to define actions to be taken after the completion of the pipeline. It can be used to send notifications, sccess/failure messages, etc. +The `post` section is used to define actions that should happen after the pipeline finishes, such as notifications or success and failure messages. ```Jenkinsfile stages{} @@ -89,7 +89,7 @@ post{ When: -The when directive is used to control the flow of the pipeline based on the conditions. It can be used to skip stages, or entire pipelines, based on the conditions. +The `when` directive controls whether a stage should run based on conditions. ```Jenkinsfile when{ @@ -117,11 +117,11 @@ http:///env-vars.html http://localhost:8080/env-vars.html ``` -### Buils Tools +### Build Tools The tools directive is used to define the tools required for the pipeline. It can be used to define the JDK, Maven and Gradle tools. -With the 1st approach we can directly use the tools and its commands in the pipeline. +With the first approach, we can define the tools directly and use their commands in the pipeline. ```jenkinsfile tools { @@ -130,7 +130,7 @@ tools { } ``` -We can also follow wrapper approach to define the tools. +We can also use wrapper-based steps to define the tools. ```jenkinsfile stage('Build') { @@ -154,7 +154,7 @@ Note: The tools must be installed in Jenkins. To install the tools, go to `Manag ### Parameters -The parameters directive is used to define the parameters required for the pipeline. It can be used to define the parameters like string, boolean, choice, etc. we can check the parameters in the UI by clicking on the `Build with Parameters` button. +The `parameters` directive defines inputs for the pipeline, such as string, boolean, or choice values. In the Jenkins UI, these appear under `Build with Parameters`. ```jenkinsfile parameters { @@ -176,7 +176,7 @@ stage('Build') { ### Triggers -The triggers directive is used to define the triggers for the pipeline. Common way are, poll, github webhooks, etc. +The `triggers` directive is used to define how the pipeline should start. Common triggers include polling and GitHub webhooks. Screenshot 2023-01-08 at 12 40 23 AM @@ -184,10 +184,10 @@ The triggers directive is used to define the triggers for the pipeline. Common w #### Replay -The replay option is used to re-run the pipeline. It is useful to test withou making/committing any changes to the code. +The replay option is used to re-run the pipeline. It is useful when you want to test changes without committing them first. Screenshot 2023-01-07 at 2 18 28 PM ### What's next? -- [Learning Resources](./learning-resources.md) - Learn more about Jenkins with these resources. \ No newline at end of file +- [Learning Resources](./learning-resources.md) - Learn more about Jenkins with these resources. diff --git a/docs/linux/introduction.md b/docs/linux/introduction.md index 8b9c10b..51a6d99 100644 --- a/docs/linux/introduction.md +++ b/docs/linux/introduction.md @@ -7,11 +7,11 @@ keywords: ["Linux", "Operating System", "Open Source"] slug: "/linux" --- -### Overview of Linux and Why it is so popular? +### Overview of Linux and Why It Is So Popular -Linux is an open-source operating system (OS) that runs on a computer and controls all of the other software and hardware on the computer. Initially, Linux was built on the Unix operating system, which was created many decades ago as a platform for scientific and academic computing. It is used on a wide range of devices, including servers, desktop computers, laptops, cloud computing, and Mobile devices. +Linux is an open-source operating system that manages hardware and provides the foundation for software to run. It is heavily influenced by Unix ideas and is used across servers, laptops, cloud platforms, networking devices, and embedded systems. -As Linux is open-source software so anyone can access its source code and make changes to it. Other than this Linux is known for its Security features. It has a large community of users and developers who are constantly working to identify and fix security vulnerabilities. Also, Linux is well known for its Customizability allowing users to modify and configure it in order to meet their specific needs. +Linux is widely used because it is open source, stable, flexible, and well suited for automation. It is also known for strong community support, broad tooling, and the ability to tailor systems for different use cases. ### Linux Architecture Components @@ -35,8 +35,7 @@ The main architectural components that work together to form a complete Linux OS ### Linux Distributions -Linux distributions, also known as "distros," are different versions of the Linux operating system that are built -and packaged with specific versions of the architectural components, the package management system used, the graphical user interface, and the tools and applications included in it. +Linux distributions, or distros, are packaged versions of Linux that combine the kernel with package managers, system tools, and often a desktop environment or server-focused defaults. Examples of Linux distros include Ubuntu, Fedora, Debian, CentOS, Mint, Red Hat Enterprise Linux (RHEL), etc. @@ -44,7 +43,7 @@ Examples of Linux distros include Ubuntu, Fedora, Debian, CentOS, Mint, Red Hat The Linux file system is the way that the operating system organizes and stores files and directories on a computer's hard drive or other storage devices. It consists of a hierarchical structure where files and directories are arranged in a tree-like format starting from the root directory (represented by "/"). Each file and directory has a unique location within the file system hierarchy, and these locations can be referred to using a path similar to how file paths work in other operating systems. -There are several types of file systems available for use in Linux including below: +There are several file systems commonly used with Linux, including: - Ext4: This is the most widely used file system in Linux and it is known for its high performance, reliability, and scalability. It is a journaling file system meaning that it keeps track of changes made to the file system in a log that helps to ensure that data is not lost in the event of a system failure. @@ -81,7 +80,7 @@ In Linux, the file system is organized into a hierarchical structure, with the r - /usr - contains user utilities and libraries as well as data shared by multiple users - /var - contains variable data such as log files, mail spools, and database files -These subdirectories may vary between different Linux distributions but the basic structure will remain the same. It is strongly recommended to explore each subdirectory separately to understand more about it. +These subdirectories may vary slightly between Linux distributions, but the overall structure stays fairly consistent. Exploring them one by one is one of the best ways to get comfortable with Linux. ![Linux-2](https://user-images.githubusercontent.com/37767537/226103260-c51190cf-3e9a-47e9-abe8-6b131227572d.png) diff --git a/docs/networking/introduction.md b/docs/networking/introduction.md index 26a223f..88f6747 100644 --- a/docs/networking/introduction.md +++ b/docs/networking/introduction.md @@ -8,22 +8,24 @@ slug: "/networking" --- +Networking basics matter in DevOps because almost every system depends on moving data between services, hosts, and users. The goal is not to memorize everything at once, but to understand the main concepts well enough to reason about how applications communicate. + ### OSI Layer

OSI

### TCP -TCP is a connection-oriented protocol. This means that it first establishes a link between the source and destination before it sends data. TCP is a preferred protocol when data integrity is critical, such as in any transactional system. Eg: email and file transfer +TCP is a connection-oriented protocol. It establishes a connection before sending data, which makes it a good fit when reliability matters more than raw speed. Common examples include web traffic, email, and file transfers. ### UDP -UDP in turn is not connection-oriented. UDP starts transmitting data immediately, without waiting for connection confirmation from the receiving side. Even though some data loss can happen, UDP is most often used in cases where speed is more important than perfect transmissions, such as in voice or video streaming. +UDP is not connection-oriented. It sends data without waiting for connection confirmation from the receiver. Some packets may be lost, but UDP is useful when low latency matters more than perfect delivery, such as in voice, video, or gaming traffic. ### Ports -A virtual point where network connections start and end. So that multiple applications can communicate easily. +A port is a logical endpoint used by applications to send and receive network traffic. Ports allow multiple services to communicate on the same machine without getting mixed together.

Tcp port

@@ -31,10 +33,10 @@ A virtual point where network connections start and end. So that multiple applic |Port Number| Process | Uses | |:--:|:--:|:--:| |80 | HTTP | | -|443| HTTPs| | -|3306| MySQl | | +|443| HTTPS| | +|3306| MySQL | | -To check which ports the system are using +To check which ports the system is using: ```bash netstat -a -b @@ -42,13 +44,13 @@ netstat -a -b ### URL (Uniform Resource Locator) -A unique identifier is used to locate a resource on the Internet. Lilke HTML, JS files. +A URL is a unique identifier used to locate a resource on the internet, such as an HTML page, image, or API endpoint. ### URL Breakdown

-- Generally, the URL doesn't contains a port number in the string because it is by default. For eg, `google.com` or `google.com:443` +- A URL often omits the port when the default port is implied. For example, `https://google.com` usually means port `443`. ### IP Address diff --git a/docs/prometheus/introduction.md b/docs/prometheus/introduction.md index 02ac16c..d3c1869 100644 --- a/docs/prometheus/introduction.md +++ b/docs/prometheus/introduction.md @@ -7,11 +7,11 @@ keywords: ["Prometheus", "Monitoring", "Alerting", "Kubernetes"] slug: "/prometheus" --- -Prometheus is an open-source systems monitoring and alerting toolkit. +Prometheus is an open-source monitoring and alerting toolkit. It is widely used to collect metrics, query them over time, and trigger alerts when systems behave unexpectedly. ### Installation using Helm -We will install Prometheus Operator using Helm. It is collection of Promethus + Grafana + Alertmanager + Node Exporter + Kube State Metrics + Pushgateway + Blackbox Exporter +One common way to install Prometheus in Kubernetes is with the `kube-prometheus-stack` Helm chart. It includes Prometheus along with related components such as Grafana, Alertmanager, Node Exporter, and kube-state-metrics. Step 1: Create a Kubernetes Namespace @@ -26,15 +26,15 @@ helm repo add prometheus-community https://prometheus-community.github.io/helm-c helm repo update helm install prometheus prometheus-community/kube-prometheus-stack -n monitoring ``` -Step 3: Accessing though localhost by Port forwarding +Step 3: Access through localhost using port forwarding ```bash kubectl port-forward svc/prometheus-grafana 3000:80 -n monitoring ``` -> The Grafana dashboard will be available at http://localhost:3000. The default username and password are `admin` $ `prom-operator`. +> The Grafana dashboard will be available at `http://localhost:3000`. The default username is `admin`. The initial password usually comes from the chart configuration or the generated Kubernetes secret, depending on the version you install. ### What's next? -- [Learning Resources](./learning-resources.md) - Learn more about Prometheus with these resources. \ No newline at end of file +- [Learning Resources](./learning-resources.md) - Learn more about Prometheus with these resources. diff --git a/docs/terraform/commands.md b/docs/terraform/commands.md index 5c49a27..869ee08 100644 --- a/docs/terraform/commands.md +++ b/docs/terraform/commands.md @@ -9,7 +9,7 @@ slug: "/terraform/commands" 1. Terraform Init -It is used to initialize a working directory containing Terraform configuration files. +It is used to initialize a working directory containing Terraform configuration files. ```bash terraform init @@ -17,7 +17,7 @@ terraform init 2. Terraform Plan -It is used to create an execution plan. It shows what Terraform will do when you call apply. +It is used to create an execution plan. It shows what Terraform will do when you run `apply`. ```bash terraform plan @@ -33,13 +33,13 @@ terraform apply 4. Terraform Validate -We can run this command before applying the changes to check whether the configuration is syntactically valid and internally consistent. +We can run this command before applying changes to check whether the configuration is syntactically valid and internally consistent. ```bash terraform validate ``` -It will print the exact in the console if there is any error in the configuration file. +If there is an error, Terraform prints the details in the console. 5. Terraform Format @@ -51,7 +51,7 @@ terraform fmt 6. Terraform Show -It is used to provide human-readable output of current state of the resources. +It is used to provide a human-readable view of the current state. ```bash terraform show @@ -87,13 +87,13 @@ terraform output 9. Terraform Refresh -It is used to update the state file according to the real-world infrastructure. +It is used to reconcile the state with the real infrastructure. ```bash terraform plan ``` -or +or ```bash terraform apply -refresh-only @@ -153,7 +153,7 @@ When we move the resource in the state file (technically renaming), we have to m 15. Terraform State Pull -It is used to pull the state and output it to the console. +It is used to pull the state and print it to the console. ```bash terraform state pull @@ -331,4 +331,3 @@ aws iam attach-group-policy --group-name --policy-arn aws iam attach-group-policy --group-name developers --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess ``` - diff --git a/docs/webassembly/introduction.md b/docs/webassembly/introduction.md index ef0ae8f..2a94eda 100644 --- a/docs/webassembly/introduction.md +++ b/docs/webassembly/introduction.md @@ -7,30 +7,29 @@ keywords: ["WebAssembly", "Wasm", "JavaScript", "Programming"] slug: /webassembly --- -In simple terms WebAssembly (Wasm) is a binary instruction format. With WebAssembly, you can write code in languages like C, C++, and Rust, and run it in the browser at near-native speed. It is design to run alongside JavaScript, allowing both to work together. +In simple terms, WebAssembly (Wasm) is a binary instruction format. It allows code written in languages such as C, C++, and Rust to run in the browser at near-native speed. It is designed to work alongside JavaScript, not replace it. ## Why WebAssembly? -As JavaScript is the only language that runs in the browser. It comes with its own limitations and challenges like: +JavaScript is the main language of the browser, but it is not always the best fit for every workload. Some common limitations are: -- Interpreted language: it's translated on-the-fly by the browser and different browsers have different JavaScript engines. Like V8 in Chrome, SpiderMonkey in Firefox, etc. And it's still generally slower than compiled languages. -- Performance: Applications which require high performance like games, video editing, real-time graphics intensive computations, etc. often encounter performance issues. -- Memory limitations: JavaScript has memory limitations. The garbage collector can introduce a pause in the application execution and doesn't allow direct memory access. -- Concurrency: JavaScript is single-threaded and doesn't support multi-threading. It can't take advantage of multi-core processors. Yes, it can efficiently handle asynchronous operations using callbacks, promises, async/await, etc. But can't truly run multiple tasks in parallel. Becomes more pain point with real-time simulations or data intensive applications. +- Performance: applications such as games, video editing tools, and graphics-heavy workloads can hit performance limits. +- Memory control: JavaScript uses garbage collection and does not expose low-level memory control in the same way as systems languages. +- CPU-heavy work: JavaScript can handle asynchronous tasks well, but CPU-intensive work can still become a bottleneck. -WebAssembly was designed to address these limitations. With it's low-level binary format, it can be executed at near-native speed. Additional benefits include: -- Language agnostic: It's not tied to any specific language. You can write code in any language that compiles to WebAssembly. -- Secure: It runs in a sandboxed environment and doesn't have direct access to the host system. -- Portable: We can WASM application be it smartphones, desktops, or servers. -- Concurrency and Parallelism: WebAssembly can take advantage of multi-core processors and run multiple tasks in parallel. -- Compactness and Speed: WebAssembly is designed to be fast to decode and execute. It's compact and can be downloaded quickly. Web application which uses WebAssembly can load faster and run more efficiently. The speed is achieved by the binary format which is smaller and and download faster and binary decoding is faster than parsing text. +WebAssembly was designed to help with these limits. Because it uses a compact binary format, it can be decoded quickly and executed efficiently. Additional benefits include: + +- Language agnostic: it is not tied to one programming language. +- Secure: it runs in a sandboxed environment. +- Portable: the same module can run across browsers and other supported environments. +- Efficient: it is designed for compact downloads and fast execution. ## Use Cases -- **Machine Learning and AI**: With this app can make real-time predictions, image recognition, etc without sending data to the server and latency in processing. -- **Multimedia Applications**: Video editing, audio processing, real-time graphics, etc. Rendering and video/image filters need high performance, with WASM it can be smoother and faster. -- **Real-time Data Visualization**: Real-time simulations, data processing, etc. can be done more efficiently. Sector like finance, logistics, etc can benefit from this. -- **3D Games and Simulations**: Games which requires intensive graphics operations can benefit from WASM. 3D games and simulations can run more smoothly and efficiently. +- **Machine Learning and AI**: real-time predictions and browser-side inference can run faster. +- **Multimedia Applications**: video editing, audio processing, and image filters benefit from better performance. +- **Real-time Data Visualization**: simulations and heavy data processing can run more smoothly. +- **3D Games and Simulations**: graphics-heavy experiences can benefit from faster execution. ### Real-world examples @@ -42,9 +41,9 @@ WebAssembly was designed to address these limitations. With it's low-level binar ## WebAssembly vs JavaScript -WebAssembly and JavaScript are not competing technologies. They are designed to work together. WebAssembly is not a replacement for JavaScript. Both have it's own strengths and weaknesses. On one hand, JavaScript is high-level, dynamic, ubiquity and ecosystem. With few line of code we can create a form or button, etc. On the other hand, WebAssembly give us flexibility to write code in any language and run it in the browser. And comes with the performance benefits. +WebAssembly and JavaScript are not competing technologies. They are designed to work together. JavaScript is great for the UI, browser APIs, and general application logic. WebAssembly is useful for the parts that need more predictable performance or reuse of existing non-JavaScript code. -For better perspective how they work together. Take an example of image processing web application. The UI and user interactions, like button, sliders and dropdown menus or the event handling (select a filter, adjust a slider) or feedback (display notification, progress bar, etc) can be done in JavaScript. On the other hand, heavy lifting like image processing, that need computational power can be done in WebAssembly. This way we can take advantage of both technologies. Like tha actual image processing can be done in WebAssembly ensuring that filters are applied quickly and efficiently. Or complex algo ported from existing C or C++ libraries can be complied to WASM and use to process the image data. +For example, in an image-processing web app, JavaScript can handle buttons, sliders, and UI updates, while WebAssembly handles the heavy image-processing logic. That way you keep the browser experience flexible while moving the expensive work into a faster runtime path. ## Building blocks of WebAssembly diff --git a/docs/yaml/introduction.md b/docs/yaml/introduction.md index 0ac70c9..a1dc373 100644 --- a/docs/yaml/introduction.md +++ b/docs/yaml/introduction.md @@ -8,9 +8,9 @@ slug: "/yaml" ## YAML - YAML Ain't Markup Language -YAML is a human-readable data serialization language. It is commonly used for configuration files and in applications where data is being stored or transmitted. +YAML is a human-readable data serialization language. It is commonly used for configuration files and for describing structured data in tools such as Kubernetes, GitHub Actions, and Docker Compose. -Eg: +Example: ```yaml name: Pradumna @@ -28,18 +28,18 @@ address: ### Properties -- Similar to XML & JSON. -- We can't add commands. -- Strict syntax - (Indentation) -- Human readable data serialization language. +- Similar in purpose to JSON and XML. +- Designed for data, not executable commands. +- Sensitive to indentation and spacing. +- Easy for humans to read when formatted clearly. ### Syntax -#### Key Value pair +#### Key-value pair ```yaml Name: "Pradumna Saraf" -1: "This a list" +1: "This is a value" ``` #### List @@ -53,7 +53,7 @@ Name: "Pradumna Saraf" or ```yaml -cities: [new delhi, patna,gujrat] +cities: [new delhi, patna, gujarat] ``` #### String and Variables @@ -64,7 +64,7 @@ fruit: "Mango" job: 'Advocate' age: 65 marks: 10.33 -booleanValue: No, N, false, False, FALSE +booleanValue: false ``` #### Multiline String @@ -75,7 +75,7 @@ Address: | Delhi India ``` -Single line in multiple line. +Folded style joins multiple lines into a single string. ```yaml message: > @@ -130,7 +130,7 @@ surname: !!null #null or NULL ~ ~: this a null key # Exponential Numbers -myNum: 6.22ES56 +myNum: 6.22E56 # Dates and time date: !!timestamp 2002-01-02 @@ -140,11 +140,11 @@ India Time: 2012-12-15T02:59:43 +5:30 ### Usage -- Used in Kubernetes, Ansible, Docker, etc. -- Used to store data in key-value pairs. -- CI/CD tools like GitHub Actions, CircleCI, use YAML to create workflows. +- Used in Kubernetes, Ansible, Docker, and many other tools. +- Useful for storing data in key-value form. +- Common in CI/CD systems like GitHub Actions and CircleCI. ### What's next? - [Learning Resources](./learning-resources.md) - Learn more about YAML with these resources. -- [Tools](./tools.md) - Learn about the tools that you can use with YAML. \ No newline at end of file +- [Tools](./tools.md) - Learn about the tools that you can use with YAML. diff --git a/src/css/custom.css b/src/css/custom.css index 405f438..da6effc 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -40,6 +40,29 @@ border-radius: 8px; } +.theme-edit-this-page { + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin-top: 1rem; + padding: 0.7rem 0.95rem; + border: 1px solid var(--ifm-color-emphasis-200); + border-radius: 10px; + background: var(--ifm-hover-overlay); + font-weight: 600; + text-decoration: none; +} + +.theme-edit-this-page::before { + content: 'Improve this page'; + color: var(--ifm-font-color-base); +} + +.theme-edit-this-page:hover { + border-color: var(--ifm-color-primary); + text-decoration: none; +} + .table-of-contents { border-left: 1px solid var(--ifm-color-emphasis-200); } From 32625a0cdb76f7a011394ce10fdff9a10d8e14d8 Mon Sep 17 00:00:00 2001 From: Pradumna Saraf Date: Fri, 3 Apr 2026 20:44:26 +0530 Subject: [PATCH 3/5] feat: add README link checker script and GitHub Actions workflow for documentation quality --- .github/workflows/docs-quality.yml | 30 +++++++++++++++++++++ package.json | 1 + scripts/check-readme-links.mjs | 42 ++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 .github/workflows/docs-quality.yml create mode 100644 scripts/check-readme-links.mjs diff --git a/.github/workflows/docs-quality.yml b/.github/workflows/docs-quality.yml new file mode 100644 index 0000000..a6c3cfa --- /dev/null +++ b/.github/workflows/docs-quality.yml @@ -0,0 +1,30 @@ +name: Docs Quality + +on: + pull_request: + push: + branches: + - main + +jobs: + docs-quality: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Check README links + run: npm run check:readme-links + + - name: Build docs site + run: npm run build diff --git a/package.json b/package.json index db813bc..0a3dfa8 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "devops", "version": "2.6.2", "scripts": { + "check:readme-links": "node scripts/check-readme-links.mjs", "docusaurus": "docusaurus", "start": "docusaurus start", "build": "docusaurus build", diff --git a/scripts/check-readme-links.mjs b/scripts/check-readme-links.mjs new file mode 100644 index 0000000..f78d0b7 --- /dev/null +++ b/scripts/check-readme-links.mjs @@ -0,0 +1,42 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const rootDir = process.cwd(); +const readmePath = path.join(rootDir, 'README.md'); +const readme = fs.readFileSync(readmePath, 'utf8'); + +const markdownLinks = [...readme.matchAll(/\[[^\]]+\]\(([^)]+)\)/g)].map((match) => match[1]); +const htmlLinks = [...readme.matchAll(/(?:href|src)="([^"]+)"/g)].map((match) => match[1]); +const links = [...new Set([...markdownLinks, ...htmlLinks])]; + +const missing = []; + +for (const link of links) { + if ( + link.startsWith('http://') || + link.startsWith('https://') || + link.startsWith('mailto:') || + link.startsWith('#') + ) { + continue; + } + + const cleanLink = link.split('#')[0]; + const targetPath = path.resolve(path.dirname(readmePath), cleanLink); + + if (!fs.existsSync(targetPath)) { + missing.push({link, targetPath}); + } +} + +if (missing.length > 0) { + console.error('README contains broken local links:\n'); + + for (const entry of missing) { + console.error(`- ${entry.link} -> ${entry.targetPath}`); + } + + process.exit(1); +} + +console.log('README local links look good.'); From 8f600adb70201a80fd55d73eaf9270335a3fe233 Mon Sep 17 00:00:00 2001 From: Pradumna Saraf Date: Fri, 3 Apr 2026 20:56:53 +0530 Subject: [PATCH 4/5] feat: add content quality and documentation link checker scripts; update GitHub Actions workflow for enhanced documentation quality checks --- .github/workflows/docs-quality.yml | 6 ++ docs/argocd/learning-resources.md | 5 ++ docs/argocd/other-resources.md | 7 +- docs/bash-scripting/learning-resources.md | 7 +- docs/bash-scripting/other-resources.md | 9 ++- docs/bash-scripting/tools.md | 9 ++- docs/docker/commands.md | 60 +++++++------- docs/docker/learning-resources.md | 5 ++ docs/docker/other-resources.md | 11 ++- docs/git/commands.md | 11 ++- docs/git/learning-resources.md | 5 ++ docs/github-actions/introduction.md | 8 +- docs/github-actions/learning-resources.md | 5 ++ docs/github-actions/other-resources.md | 9 ++- docs/github-actions/scenarios.md | 6 ++ docs/gitops/learning-resources.md | 5 ++ docs/golang/learning-resources.md | 4 + docs/golang/other-resources.md | 9 ++- docs/helm/learning-resources.md | 5 ++ docs/jenkins/learning-resources.md | 7 +- docs/kubernetes/commands.md | 36 +++++---- docs/kubernetes/introduction.md | 4 +- docs/kubernetes/learning-resources.md | 7 +- docs/kubernetes/other-resources.md | 7 +- docs/kubernetes/playground.md | 5 ++ docs/linux/commands.md | 70 ++++++++-------- docs/linux/learning-resources.md | 7 +- docs/networking/commands.md | 7 +- docs/networking/learning-resources.md | 7 +- docs/prometheus/learning-resources.md | 7 +- docs/terraform/commands.md | 4 + docs/terraform/introduction.md | 2 +- docs/terraform/learning-resources.md | 7 +- docs/webassembly/learning-resources.md | 7 +- docs/webassembly/tools.md | 9 ++- docs/yaml/learning-resources.md | 7 +- docs/yaml/tools.md | 11 ++- package.json | 2 + scripts/check-content-quality.mjs | 93 +++++++++++++++++++++ scripts/check-doc-links.mjs | 99 +++++++++++++++++++++++ 40 files changed, 480 insertions(+), 111 deletions(-) create mode 100644 scripts/check-content-quality.mjs create mode 100644 scripts/check-doc-links.mjs diff --git a/.github/workflows/docs-quality.yml b/.github/workflows/docs-quality.yml index a6c3cfa..33a4605 100644 --- a/.github/workflows/docs-quality.yml +++ b/.github/workflows/docs-quality.yml @@ -26,5 +26,11 @@ jobs: - name: Check README links run: npm run check:readme-links + - name: Check docs links + run: npm run check:doc-links + + - name: Check content quality + run: npm run check:content-quality + - name: Build docs site run: npm run build diff --git a/docs/argocd/learning-resources.md b/docs/argocd/learning-resources.md index 1d44265..0911af4 100644 --- a/docs/argocd/learning-resources.md +++ b/docs/argocd/learning-resources.md @@ -9,3 +9,8 @@ slug: "/argocd/resources" - [GitOps Tech world with naina (Video)](https://youtu.be/MeU5_k9ssrs) - [GitOps Fundamentals (Course)](https://learning.codefresh.io/) + +## Read next + +- [ArgoCD Introduction](./introduction.md) - Return to the main concepts and examples. +- [Other Resources](./other-resources.md) - Explore sample manifests and supporting material. diff --git a/docs/argocd/other-resources.md b/docs/argocd/other-resources.md index ae8a260..73a678f 100644 --- a/docs/argocd/other-resources.md +++ b/docs/argocd/other-resources.md @@ -7,6 +7,11 @@ keywords: ["ArgoCD", "GitOps", "Kubernetes", "Continuous Delivery"] slug: "/argocd/other-resources" --- -Here are list of other resources that you can refer to learn more about ArgoCD: +Here are some extra resources you can use to go deeper into ArgoCD: - [Sample ArgoCD Manifest files](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/argocd/manifests): A collection of ArgoCD manifest files to help you understand the concepts better. + +## Read next + +- [ArgoCD Introduction](./introduction.md) - Review the core ArgoCD concepts and workflow. +- [Learning Resources](./learning-resources.md) - Continue learning with videos and guides. diff --git a/docs/bash-scripting/learning-resources.md b/docs/bash-scripting/learning-resources.md index 41c5591..9b21045 100644 --- a/docs/bash-scripting/learning-resources.md +++ b/docs/bash-scripting/learning-resources.md @@ -9,4 +9,9 @@ slug: "/bash/resources" - [You need to learn Bash Scripting right now playlist - NetworkChuck (Video)](https://youtube.com/playlist?list=PLIhvC56v63IKioClkSNDjW7iz-6TFvLwS) - [Devhints Bash Cheat Sheet](https://devhints.io/bash) -- [Google Shell Style Guide](https://google.github.io/styleguide/shellguide.html) \ No newline at end of file +- [Google Shell Style Guide](https://google.github.io/styleguide/shellguide.html) + +## Read next + +- [Bash Scripting Introduction](./introduction.md) - Revisit shell basics and examples. +- [Other Resources](./other-resources.md) - Browse extra scripts and concept files. diff --git a/docs/bash-scripting/other-resources.md b/docs/bash-scripting/other-resources.md index 7bf8012..fc89f04 100644 --- a/docs/bash-scripting/other-resources.md +++ b/docs/bash-scripting/other-resources.md @@ -7,7 +7,12 @@ keywords: ["Bash Scripting", "Linux", "Shell Scripting"] slug: "/bash/other-resources" --- -Here are list of other resources that you can refer to learn more about Bash Scripting: +Here are some extra resources you can use to learn Bash scripting with examples: -- [Concepts](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/bash-scripting/concepts): Each topic is break into seprate files to help better understand the concepts. +- [Concepts](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/bash-scripting/concepts): Each topic is split into separate files so the concepts are easier to understand. - [Scripts](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/bash-scripting/scripts): A collection of Bash scripts I have created to help you understand the concepts better. + +## Read next + +- [Bash Scripting Introduction](./introduction.md) - Go back to the basics and common shell concepts. +- [Tools](./tools.md) - Explore tools that make shell work easier. diff --git a/docs/bash-scripting/tools.md b/docs/bash-scripting/tools.md index 097b9bb..8e76a32 100644 --- a/docs/bash-scripting/tools.md +++ b/docs/bash-scripting/tools.md @@ -7,6 +7,13 @@ keywords: ["Bash Scripting", "Linux", "Shell Scripting"] slug: "/bash/tools" --- +Here are a few tools that are useful when writing or debugging shell scripts: + - [Chmod Calculator](https://chmodcommand.com/) - [devhints](https://devhints.io/) -- [jq](https://stedolan.github.io/jq/) \ No newline at end of file +- [jq](https://stedolan.github.io/jq/) + +## Read next + +- [Bash Scripting Introduction](./introduction.md) - Review shell basics and examples. +- [Other Resources](./other-resources.md) - Explore extra scripts and concept files. diff --git a/docs/docker/commands.md b/docs/docker/commands.md index cb8c255..4c00949 100644 --- a/docs/docker/commands.md +++ b/docs/docker/commands.md @@ -7,11 +7,11 @@ keywords: ["Docker", "Containerization", "DevOps"] slug: "/docker/commands" --- -### Docker Basic +### Docker Basics -- To check Docker vesrion +- Check the Docker version -``` +```bash docker version ``` @@ -21,21 +21,21 @@ docker version docker images ``` -- Pull/Download the image from the Docker registry to local machine. +- Pull or download an image from a registry to your local machine. ```bash docker pull //Eg: docker pull nginx ``` -- To run an container (It will 1st pull the image if not present in the local sytem) - - NOTE: When we just provide the name of the image it will pull the latest one, i.e `nginx:latest`. We can also specify the version `nginx:1.14` - - Additioanly we can use flags +- Run a container. Docker will pull the image first if it is not available locally. + - NOTE: If you only provide the image name, Docker uses the default tag, usually `latest`. You can also specify a version such as `nginx:1.14`. + - Common flags: - `--name `- To give a name to the container. - `-p `- To forward the port. - `-d` - To run in detached mode - - `-it` - For interactive envirnoment + - `-it` - For an interactive environment - `-e` - For environment variable ```bash @@ -145,7 +145,7 @@ docker image prune -all ### Docker Network -- Check list of avilable networks. +- Check the list of available networks. ```bash docker network ls @@ -157,7 +157,7 @@ docker network ls docker network inspect ``` -- Run a container on a certian network/own careted network +- Run a container on a specific or user-created network. ``` docker run --network @@ -193,7 +193,7 @@ docker inspect docker history ``` -- Create a our own image with an existing image. +- Create your own tagged image from an existing image. ``` docker image tag @@ -203,12 +203,12 @@ docker image tag ubuntu:18.04 pradumna/ubuntu:example ### Docker Volume -- Create bind mount - - Help to sync our local files with help of Docker container. +- Create a bind mount. + - This helps you sync local files with a container. -- To sync our local machine changes with help of Docker volume (Bind mount) - - `- v` is use to define volume, also we give another `-v` flag to override the changes so that it will not chnage in container. +- Sync local changes into a container with a bind mount. + - `-v` is used to define the mount. You can also mount a second path as read-only when needed. ```bash docker run -v : -p : -d --name docker-node docker-node @@ -218,16 +218,16 @@ docker ```bash docker run -v : -v -p : -d --name docker-node docker-node ``` -To make it read only so that when you add some files inside it, the container will not get created on your local machine use `-v port:port:ro` +To make the mount read-only, add `:ro` at the end of the mount definition. -- docker volume command for mounting the docker socket to the docker container for accessing the host's docker daemon for performing the continuous integration in jenkins while using docker as a agent.. +- Mount the Docker socket into a container when you need that container to talk to the host Docker daemon, for example in some Jenkins setups. ```bash docker run -it -v /var/run/docker.sock:/var/run/docker.sock docker-image:version bin/bash ``` ### Docker Compose -- Run docker compose file. +- Run a Docker Compose project. Note: If you do not pass `-f`, Docker looks for `compose.yaml` or `docker-compose.yaml` in the working directory. ```bash @@ -238,13 +238,13 @@ docker compose up -d docker compose down ``` -- To rebuilt the new Image with thew new changes +- Rebuild the image with new changes. ```bash docker compose up --build ``` -- Override the existing of compose file +- Combine multiple Compose files. ```bash docker compose -f compose.yaml -f compose.dev.yaml @@ -252,13 +252,13 @@ docker compose -f compose.yaml -f compose.dev.yaml ### Docker Swarm and Services -- Initalize swarm +- Initialize Swarm ```bash docker swarm init ``` -- Check all the node available +- Check all available nodes ```bash docker node ls @@ -286,7 +286,7 @@ docker network create -d overlay backend docker service create -p 8080:80 --name vote --replicas 2 nginx ``` -- To get all task containers running on different node +- Get all task containers running across nodes ```bash docker service ps @@ -339,13 +339,13 @@ docker stack ls **STACK -> SERVICES -> TASKS -> CONTAINERS** -- To check which services are running inside a staacks +- Check which services are running inside a stack ``` docker stack services ``` -- To check taks are running inside a stack +- Check which tasks are running inside a stack ``` docker stack ps @@ -362,8 +362,8 @@ docker stack ps - Run the command with the container creation ```bash -doc run -// Eg: `doc run ubuntu:16.04 echo hey` +docker run +// Eg: `docker run ubuntu:16.04 echo hey` ``` @@ -374,3 +374,9 @@ Step 1 - create Dockerfile Step 2 - docker build -t myimage:1.0 (-t for tag) Step 3 - docker run myimage:1.0 ``` + +## Read next + +- [Docker Introduction](./introduction.md) - Review the core Docker concepts behind these commands. +- [Learning Resources](./learning-resources.md) - Continue with courses and videos for deeper practice. +- [Other Resources](./other-resources.md) - Explore sample Dockerfiles and Compose files. diff --git a/docs/docker/learning-resources.md b/docs/docker/learning-resources.md index dbd9557..b9376af 100644 --- a/docs/docker/learning-resources.md +++ b/docs/docker/learning-resources.md @@ -9,3 +9,8 @@ slug: "/docker/resources" - [Docker Mastery (Course)](https://www.udemy.com/course/docker-mastery/) - [FreeCodeCamp Docker (Video)](https://youtu.be/kTp5xUtcalw) + +## Read next + +- [Docker Introduction](./introduction.md) - Return to the core concepts and architecture. +- [Docker Commands](./commands.md) - Practice the commands alongside these resources. diff --git a/docs/docker/other-resources.md b/docs/docker/other-resources.md index 4297130..2b28add 100644 --- a/docs/docker/other-resources.md +++ b/docs/docker/other-resources.md @@ -7,7 +7,12 @@ keywords: ["Docker", "Containerization", "DevOps"] slug: "/docker/other-resources" --- -Here are list of other resources that you can refer to learn more about Docker: +Here are some extra resources you can use to explore Docker with working examples: -- [Dockerfiles files](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/docker/dockerfiles): A collection of Dockerfiles to help you understand the concepts better. -- [Docker Compose files](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/docker/docker-compose): A collection of Docker Compose files I have created for different applications to help you understand the concepts better. \ No newline at end of file +- [Dockerfiles](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/docker/dockerfiles): A collection of Dockerfiles to help you understand the concepts better. +- [Docker Compose files](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/docker/docker-compose): A collection of Docker Compose files I have created for different applications to help you understand the concepts better. + +## Read next + +- [Docker Introduction](./introduction.md) - Revisit the core ideas behind images, containers, networks, and volumes. +- [Docker Commands](./commands.md) - Practice the commands you will use the most. diff --git a/docs/git/commands.md b/docs/git/commands.md index 3d515a0..4b20417 100644 --- a/docs/git/commands.md +++ b/docs/git/commands.md @@ -434,20 +434,25 @@ slug: "/git/commands" git diff ``` -- repo's remote url +- Remote URLs ```bash git remote -v ``` -- repo's remote url +- Branches ```bash git branch # The active branch is prefixed with * ``` -- repo's remote url +- Tags ```bash git tag ``` + +## Read next + +- [Git Introduction](./introduction.md) - Review the core Git concepts behind these commands. +- [Learning Resources](./learning-resources.md) - Continue with tutorials, docs, and practice tools. diff --git a/docs/git/learning-resources.md b/docs/git/learning-resources.md index 476240b..83cfec4 100644 --- a/docs/git/learning-resources.md +++ b/docs/git/learning-resources.md @@ -18,3 +18,8 @@ slug: "/git/resources" ```bash git push --help ``` + +## Read next + +- [Git Introduction](./introduction.md) - Revisit the core Git concepts first. +- [Git Commands](./commands.md) - Practice the commands you will use most often. diff --git a/docs/github-actions/introduction.md b/docs/github-actions/introduction.md index 39ee1c5..6735dc2 100644 --- a/docs/github-actions/introduction.md +++ b/docs/github-actions/introduction.md @@ -61,7 +61,7 @@ on: #### Trigger Filters -- We can trigger the workflow when only when certain files are changed. +- We can trigger the workflow only when certain files are changed. ```yaml on: @@ -70,7 +70,7 @@ on: - "src/index.js" ``` -- We can trigger the workflow when only when certain files with an extension are changed. +- We can trigger the workflow only when certain file types are changed. ```yaml on: @@ -83,7 +83,7 @@ on: - "**.js" ``` -- We can trigger the workflow when only when certain files in a directory are changed. +- We can trigger the workflow only when files in a specific directory are changed. ```yaml on: @@ -289,4 +289,4 @@ jobs: - [Scenarios](./scenarios.md) - A collection of GitHub Actions workflow files I use and created to help you understand the concepts better. - [Learning Resources](./learning-resources.md) - A list of resources to learn more about GitHub Actions. -- [other Resources](./other-resources.md) - A list of other resources that you can refer to learn more about GitHub Actions. +- [Other Resources](./other-resources.md) - A list of extra resources that you can use to learn more about GitHub Actions. diff --git a/docs/github-actions/learning-resources.md b/docs/github-actions/learning-resources.md index 0c0a917..1e9a533 100644 --- a/docs/github-actions/learning-resources.md +++ b/docs/github-actions/learning-resources.md @@ -11,3 +11,8 @@ slug: "/github-actions/resources" - [GitHub Actions: Getting Started](https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions) - [GitHub Action Tutorial - Tech World With Nana](https://youtu.be/R8_veQiYBjI) - [GitHub Actions Certification - Andrew Brown](https://youtu.be/Tz7FsunBbfQ?si=mq-lzTPSP0wd3Esm). Note, that the video is free on FreeCodeCamp, but certification might be under a paywall. + +## Read next + +- [GitHub Actions Introduction](./introduction.md) - Review the workflow model and syntax. +- [Scenarios](./scenarios.md) - See practical examples you can reuse. diff --git a/docs/github-actions/other-resources.md b/docs/github-actions/other-resources.md index 03c4e98..b64043c 100644 --- a/docs/github-actions/other-resources.md +++ b/docs/github-actions/other-resources.md @@ -7,6 +7,11 @@ keywords: ["GitHub Actions", "DevOps", "Continuous Integration", "Continuous Dep slug: "/github-actions/other-resources" --- -Here are list of other resources that you can refer to learn more about GitHub Actions: +Here are some extra resources you can use to learn GitHub Actions with real workflow files: -- [Wokflow files](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/github-actions/Workflows): A collection of GitHub Actions workflow files I use and created to help you understand the concepts better. +- [Workflow files](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/github-actions/Workflows): A collection of GitHub Actions workflow files I use and created to help you understand the concepts better. + +## Read next + +- [GitHub Actions Introduction](./introduction.md) - Review the workflow, job, and runner basics. +- [Scenarios](./scenarios.md) - See practical workflow examples you can adapt. diff --git a/docs/github-actions/scenarios.md b/docs/github-actions/scenarios.md index 4ba52da..7de9f85 100644 --- a/docs/github-actions/scenarios.md +++ b/docs/github-actions/scenarios.md @@ -294,3 +294,9 @@ jobs: - name: Docker Push run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/devops:${{ steps.package-version.outputs.current-version}} ``` + +## Read next + +- [GitHub Actions Introduction](./introduction.md) - Review workflow syntax, jobs, and events. +- [Learning Resources](./learning-resources.md) - Continue with official docs and longer tutorials. +- [Other Resources](./other-resources.md) - Browse reusable workflow files. diff --git a/docs/gitops/learning-resources.md b/docs/gitops/learning-resources.md index b2fddc1..eb6601f 100644 --- a/docs/gitops/learning-resources.md +++ b/docs/gitops/learning-resources.md @@ -10,3 +10,8 @@ slug: "/gitops/resources" - [What is GitOps - TechWorld with Nana](https://youtu.be/f5EpcWp0THw) - [ArgoCD Guide: Full Tutorial for Beginers](https://youtu.be/JLrR9RV9AFA) - [OpenGitOps](https://opengitops.dev/) + +## Read next + +- [GitOps Introduction](./introduction.md) - Review the GitOps workflow and principles. +- [ArgoCD Introduction](../argocd/introduction.md) - Continue with a common GitOps tool. diff --git a/docs/golang/learning-resources.md b/docs/golang/learning-resources.md index 02a51bb..c1de239 100644 --- a/docs/golang/learning-resources.md +++ b/docs/golang/learning-resources.md @@ -16,4 +16,8 @@ slug: "/golang/resources" - [Codeacademy Free course](https://www.codecademy.com/learn/learn-go) - [Gophercises](https://gophercises.com/) +## Read next + +- [Golang Introduction](./introduction.md) - Review the basics and core language concepts. +- [Other Resources](./other-resources.md) - Browse more Go concepts and example apps. diff --git a/docs/golang/other-resources.md b/docs/golang/other-resources.md index ac2c8e8..c58fbed 100644 --- a/docs/golang/other-resources.md +++ b/docs/golang/other-resources.md @@ -7,7 +7,12 @@ keywords: ["Golang", "Programming", "DevOps"] slug: "/golang/other-resources" --- -Here are list of other resources that you can refer to learn more about Golang: +Here are some extra resources you can use to learn Go through hands-on examples: - [Apps](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/golang/apps): Source code for the apps I build while learning Golang -- [Concepts](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/golang/concepts): Each Golang topic is break into seprate files to help better understand the concepts. \ No newline at end of file +- [Concepts](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/golang/concepts): Each Go topic is split into separate files so the concepts are easier to understand. + +## Read next + +- [Golang Introduction](./introduction.md) - Review the language basics and where Go fits. +- [Learning Resources](./learning-resources.md) - Continue with official docs, tutorials, and practice sites. diff --git a/docs/helm/learning-resources.md b/docs/helm/learning-resources.md index 16b7181..fd80f7e 100644 --- a/docs/helm/learning-resources.md +++ b/docs/helm/learning-resources.md @@ -10,3 +10,8 @@ slug: "/helm/resources" - [Helm Docs](https://helm.sh/) - [ Helm for beginers](https://www.youtube.com/watch?v=KeRrvCrF8zc) - [ Helm in Depth ](https://www.youtube.com/watch?v=gbUBTTXuQwI&list=PLLYW3zEOaqlKYku0piyzzLFGpR9VpPvXR) + +## Read next + +- [Helm Introduction](./introduction.md) - Review charts, templates, and releases. +- [Kubernetes Introduction](../kubernetes/introduction.md) - Connect Helm concepts back to Kubernetes. diff --git a/docs/jenkins/learning-resources.md b/docs/jenkins/learning-resources.md index cdf43e2..f887be5 100644 --- a/docs/jenkins/learning-resources.md +++ b/docs/jenkins/learning-resources.md @@ -12,4 +12,9 @@ slug: "/jenkins/resources" - [official documentation](https://www.jenkins.io/doc/) - [Jenkins Docker Installation (docs)](https://www.jenkins.io/doc/book/installing/docker/) - [Jenkins Tutorial - TechWorld with Nana (video)](https://www.youtube.com/playlist?list=PLy7NrYWoggjw_LIiDK1LXdNN82uYuuuiC) -- [Jenkins FreeCodeCamp (video)](https://youtu.be/f4idgaq2VqA) \ No newline at end of file +- [Jenkins FreeCodeCamp (video)](https://youtu.be/f4idgaq2VqA) + +## Read next + +- [Jenkins Introduction](./introduction.md) - Review the Jenkins basics and pipeline model. +- [GitHub Actions Introduction](../github-actions/introduction.md) - Compare Jenkins with another common CI/CD tool. diff --git a/docs/kubernetes/commands.md b/docs/kubernetes/commands.md index 6fbfac6..a86e893 100644 --- a/docs/kubernetes/commands.md +++ b/docs/kubernetes/commands.md @@ -7,7 +7,7 @@ keywords: ["Kubernetes", "Containerization", "DevOps"] slug: "/kubernetes/commands" --- -> KUBECTL COMMANDS +## kubectl Commands - To check the version: @@ -26,7 +26,7 @@ kubectl config view ```bash kubectl run --image -kubectl run myngix --image nginx +kubectl run mynginx --image nginx ``` - To create a deployment @@ -49,7 +49,7 @@ kubectl scale deployment mynginx --replicas 2 kubectl get all ``` -- To get the get details from the a particular namespace +- To get details from a particular namespace ```bash kubectl get all -n @@ -79,13 +79,13 @@ kubectl get pods kubectl get pods -o wide ``` -- To check all the running node. +- To check all the running nodes ```bash kubectl get nodes ``` -- To check all the replicaset +- To check all ReplicaSets ```bash kubectl get replicaset @@ -127,12 +127,12 @@ kubectl delete pod --field-selector="status.phase==Failed" kubectl logs ``` -- To check logs or sh/bash of a container inside a pod. That if pods have multiple container an we have enter inside a container +- To open a shell in a specific container or inspect logs in a multi-container Pod ```bash -kube exec -it -c -- -kube exec -it multi-container -c nginx-container -- curl localhost -kube exec -it multi-container -c nginx-container -- sh +kubectl exec -it -c -- +kubectl exec -it multi-container -c nginx-container -- curl localhost +kubectl exec -it multi-container -c nginx-container -- sh kubectl logs multi-container -c nginx-container ``` @@ -143,10 +143,10 @@ kubectl exec -it -- sh kubectl exec -it nginx -- sh ``` -- Get a deep details/state chnages about a pod +- Get detailed state and event changes for a Pod ```bash -kube describe pod +kubectl describe pod ``` - To watch the pods (watch refresh every few seconds) @@ -154,10 +154,10 @@ kube describe pod kubectl get pods -w ``` -- To check the cluster are avilable +- To check the available cluster contexts ``` -kube config get-contexts +kubectl config get-contexts ``` - We can create namespace by @@ -167,7 +167,7 @@ kubectl create namespace kubectl create namespace dev ``` -- To do a dry nun and get the output as Yaml +- To do a dry run and get the output as YAML ```bash kubectl create namespace test-name --dry-run=client -oyaml @@ -204,7 +204,7 @@ kubectl get pv kubectl get pvc ``` -- To chnage default/active namespace +- To change the default or active namespace ```bash kubectl config set-context --current --namespace= @@ -215,3 +215,9 @@ kubectl config set-context --current --namespace= ```bash kubectl get all -n ``` + +## Read next + +- [Kubernetes Introduction](./introduction.md) - Review the concepts behind Pods, Deployments, and namespaces. +- [Learning Resources](./learning-resources.md) - Continue with courses, docs, and longer tutorials. +- [Playground](./playground.md) - Practice these commands in a browser-based cluster. diff --git a/docs/kubernetes/introduction.md b/docs/kubernetes/introduction.md index 5621648..e74bf1b 100644 --- a/docs/kubernetes/introduction.md +++ b/docs/kubernetes/introduction.md @@ -57,7 +57,7 @@ It is a specification and libraries for writing plugins to configure network int ### CSI - Container Storage Interface -It is a standard for exposing arbitrary block and file storage systems to containerized workloads on Kubernetes. It is used to provide persistent storage to the containers. It is a standard interface between Kubernetes and storage providers. It is used to provide persistent storage to the containers. Popular choices are Rook, OpenEBS, etc. +CSI is the standard interface between Kubernetes and storage providers. It lets Kubernetes work with different block and file storage systems for persistent workloads. Popular choices in the ecosystem include Rook and OpenEBS. Custom Resource Definition (CRD) lets you define your own resource types in Kubernetes and extend the API. @@ -188,7 +188,7 @@ spec: ### Probes -Probes are used to check the health of the container. There are three types of probes: +Probes are used to check the health of a container. Kubernetes supports three main probe types: - **Startup Probe**: It is used to check if the container is started. It is used to delay the liveness and readiness probes until the container is started. - **Readiness Probe**: It is used to check if the container is ready to serve traffic. If the readiness probe fails, the container will not receive traffic. It is used to delay the traffic until the container is ready. diff --git a/docs/kubernetes/learning-resources.md b/docs/kubernetes/learning-resources.md index 4b70e26..e191f3b 100644 --- a/docs/kubernetes/learning-resources.md +++ b/docs/kubernetes/learning-resources.md @@ -13,4 +13,9 @@ slug: "/kubernetes/resources" - [BretFisher/udemy-docker-mastery GitHub repo](https://github.com/BretFisher/udemy-docker-mastery) - [Kubernetes official docs](https://kubernetes.io/docs/home/) - [Kubernetes Basic Concepts - Blog](https://spacelift.io/blog/kubernetes-tutorial) -- [Kubernetes in Action](https://www.manning.com/books/kubernetes-in-action) \ No newline at end of file +- [Kubernetes in Action](https://www.manning.com/books/kubernetes-in-action) + +## Read next + +- [Kubernetes Introduction](./introduction.md) - Review the cluster model and resource basics. +- [Kubernetes Playground](./playground.md) - Practice these concepts in the browser. diff --git a/docs/kubernetes/other-resources.md b/docs/kubernetes/other-resources.md index 317e7fa..8cf4653 100644 --- a/docs/kubernetes/other-resources.md +++ b/docs/kubernetes/other-resources.md @@ -7,6 +7,11 @@ keywords: ["Kubernetes", "Containerization", "DevOps"] slug: "/kubernetes/other-resources" --- -Here are list of other resources that you can refer to learn more about Kubernetes: +Here are some extra resources you can use to explore Kubernetes beyond the core docs: - [Kubernetes apps](https://github.com/Pradumnasaraf/DevOps/tree/main/docs/kubernetes/apps): A collection of simple Kubernetes applications that you can use to learn Kubernetes. + +## Read next + +- [Kubernetes Introduction](./introduction.md) - Revisit the core cluster concepts and resource model. +- [Kubernetes Commands](./commands.md) - Practice the commands you will use day to day. diff --git a/docs/kubernetes/playground.md b/docs/kubernetes/playground.md index 02ceaf4..2ec1441 100644 --- a/docs/kubernetes/playground.md +++ b/docs/kubernetes/playground.md @@ -11,3 +11,8 @@ Kubernetes Playground is a web-based Kubernetes environment that allows you to l - [labs.play-with-k8s.com](https://labs.play-with-k8s.com/) - [killercoda.com/playgrounds](https://killercoda.com/playgrounds) + +## Read next + +- [Kubernetes Introduction](./introduction.md) - Review the concepts before trying them in a playground. +- [Kubernetes Commands](./commands.md) - Use these commands while practicing in the browser. diff --git a/docs/linux/commands.md b/docs/linux/commands.md index 73b089c..b10c531 100644 --- a/docs/linux/commands.md +++ b/docs/linux/commands.md @@ -7,41 +7,40 @@ keywords: ["Linux", "Operating System", "Kernel"] slug: "/linux/commands" --- -- `whereis` - Find the path of that executable file. +- `whereis` - Find the path of an executable file. -### List operation -- `ls` - Shows list. - - `-a` - Hidden file. - - `-l` - Permission. - - `-R` - Show sub dir. +### List operations +- `ls` - Show files and directories. + - `-a` - Include hidden files. + - `-l` - Show permissions and detailed info. + - `-R` - Show subdirectories recursively. -### Changing dir operation -- `cd ` - Change Dir. -- `cd ..` - Go one Directory back. -- `cd` - Go to home. -- `cd ../` - Open a previous dir folder. -- `cd ` - Open a dir with the path. +### Changing directories +- `cd ` - Change directory. +- `cd ..` - Go one directory back. +- `cd` - Go to the home directory. +- `cd ../` - Open a folder in the previous directory. +- `cd ` - Open a directory by path. -### File/Folder Ope. +### File and folder basics - `mkdir ` - Create a new folder. - `mkdir -p test/test1/test2` - Create a dir between two directories. -- `touch ` - create a blank file. +- `touch ` - Create a blank file. - `pwd` - Present working directory. - `cat ` - Display file content. - `cat > ` - Create a file. -- `dd if=/dev/zero of=bos_dosya bs=4G count=1`- create empty file with zeros +- `dd if=/dev/zero of=bos_dosya bs=4G count=1` - Create an empty file filled with zeros. - `cat >> ` - Append the file - `cat >> ` - Append the content of the file filename1 at the end of the file `` . - `cat ` - Display 2 files at a time. - `cat > ` - Merge both of file content in a single one. - `cat | tr > ` - Translate the file. -- `cut -c 1-2 ` - cut the file column wise +- `cut -c 1-2 ` - Cut the file column-wise. - `echo "Hello" >> ` -- `man ` - Know about the command usages and options. -- `man ` - know about the command. +- `man ` - Show command usage and options. -### File/Folder operation -- `cp ` - Make a copy of a file in the current location. +### File and folder operations +- `cp ` - Make a copy of a file in the current location. - `mv ` - Move a file from one dir to another. - `mv ` - Rename a file. - `mv -R ` - Move Dir @@ -54,14 +53,14 @@ slug: "/linux/commands" - `locate ` - To find out the file. - `find ` - Find a file/folder. - `find ` - Find files inside the dir -- `find .-type d` - Show only dir. - - `.-type f` - show only files. - - `.-type f -name "*.txt"` - Show only files with that specific name. - - `.-type f -iname "*.txt"` - Show only files with that specific name - not case sensitive (i) - - `.-type f -mmin -20` - Show files which modify less than 20 min ago. - - `.-type f -mmin +20` - show files which modify more than 20 min ago. - - `.-type f -maxdepth 2` - Will only show 1 folder deep. - - `.-size +1k` - will only show file/folder with size of 1kb +- `find . -type d` - Show only directories. + - `-type f` - Show only files. + - `-type f -name "*.txt"` - Show only files with that specific name. + - `-type f -iname "*.txt"` - Show only files with that specific name, case-insensitive. + - `-type f -mmin -20` - Show files modified less than 20 minutes ago. + - `-type f -mmin +20` - Show files modified more than 20 minutes ago. + - `-maxdepth 2` - Show matches only two levels deep. + - `-size +1k` - Show files or folders larger than 1 KB. ### System commands @@ -76,7 +75,7 @@ slug: "/linux/commands" - `df` - Check the capacity and storage details. - `m` - In megabyte or - `hg` - In gigabyte. -- `du` - Disk usages capcity +- `du` - Disk usage and capacity details - `-h` (human readable) - `echo` - Get a output of a string - `echo $PATH` - Check the path variable @@ -85,7 +84,7 @@ slug: "/linux/commands" - `!` - Run the previous command - `git add .; git commit -m "message"` - Run multiple commands at a time - `sort "` - sort the file -- `job` - show the jobs +- `jobs` - Show background jobs - `wget ` - download the file from the URL - `top` - what processes are running - `kill ` -stop that process @@ -99,7 +98,7 @@ slug: "/linux/commands" - `free` - free memory - `vmstat` - virtual memory - `lsof` - list all the open file -- `xdg-open ` - open the folder (graphical window) of a file/folder with path. +- `xdg-open ` - Open a file or folder in the graphical file manager. - `xdg-open .` - open the folder of the current directory. - `vi ~/.bashrc` - set your Alias - `echo -n 'username' | base64` - encode the username to base64 @@ -117,7 +116,7 @@ slug: "/linux/commands" - `chmod u=rwx,g=rxw,o=rwx ` READ, WRITE AND EXECUTE - `chmod 777 ` - 4- Read, 2- Write, 1 - Execute - `find . -perm 777 ` - shows files with all permissions(rwx) -- `grep ` - To search if the keyword is presnt in the file or not +- `grep ` - Search whether the keyword is present in the file. - `grep -w ` - To search if the keyword is present in the file or not (complete word) - `grep -i ` - To search if the keyword is present in the file or not (not case sens) - `grep -n ` - To search if the keyword is present in the file or not (Line number) @@ -138,4 +137,9 @@ history - `echo "google.com" && {echo "facebook.com"; eco "pradumnasaraf.co"}` - `echo "google.com" || echo "pingfacebook.com"` - second will only run if first is not successful - `rm -r !(file.txt)` - delete all files except file.txt -- `printevnv` - to print all th env. +- `printenv` - Print all environment variables. + +## Read next + +- [Linux Introduction](./introduction.md) - Review the Linux basics and filesystem layout. +- [Learning Resources](./learning-resources.md) - Continue with Linux-focused videos and references. diff --git a/docs/linux/learning-resources.md b/docs/linux/learning-resources.md index 9f242b9..70f28c3 100644 --- a/docs/linux/learning-resources.md +++ b/docs/linux/learning-resources.md @@ -8,4 +8,9 @@ slug: "/linux/resources" --- - [Linux kernel source tree](https://github.com/torvalds/linux) -- [Linux & Docker Fundamentals - Kubesimplify](https://www.youtube.com/live/EUu1E_YKGTw?feature=share) \ No newline at end of file +- [Linux & Docker Fundamentals - Kubesimplify](https://www.youtube.com/live/EUu1E_YKGTw?feature=share) + +## Read next + +- [Linux Introduction](./introduction.md) - Review the basics of Linux and the filesystem layout. +- [Linux Commands](./commands.md) - Practice the commands you will use often. diff --git a/docs/networking/commands.md b/docs/networking/commands.md index 7693c24..35c74b6 100644 --- a/docs/networking/commands.md +++ b/docs/networking/commands.md @@ -46,4 +46,9 @@ Hostname is a command that is used to display the name of the current host. ```bash hostname -``` \ No newline at end of file +``` + +## Read next + +- [Networking Introduction](./introduction.md) - Review the basics behind DNS, IP addresses, and routing. +- [Learning Resources](./learning-resources.md) - Continue with tutorials and networking references. diff --git a/docs/networking/learning-resources.md b/docs/networking/learning-resources.md index 21b5796..ad70308 100644 --- a/docs/networking/learning-resources.md +++ b/docs/networking/learning-resources.md @@ -7,4 +7,9 @@ keywords: ["Computer Networking", "Networking", "Network"] slug: "/networking/resources" --- -- [Computer Networking](https://youtu.be/IPvYjXCsTg8) \ No newline at end of file +- [Computer Networking](https://youtu.be/IPvYjXCsTg8) + +## Read next + +- [Networking Introduction](./introduction.md) - Review the core networking concepts first. +- [Networking Commands](./commands.md) - Practice the commands used for troubleshooting. diff --git a/docs/prometheus/learning-resources.md b/docs/prometheus/learning-resources.md index 343e293..7192426 100644 --- a/docs/prometheus/learning-resources.md +++ b/docs/prometheus/learning-resources.md @@ -7,4 +7,9 @@ keywords: ["Prometheus", "Monitoring", "Alerting", "Time Series Database"] slug: "/prometheus/resources" --- -- [Prometheus Playlist - TechWorld with Nana](https://youtube.com/playlist?list=PLy7NrYWoggjxCF3av5JKwyG7FFF9eLeL4) \ No newline at end of file +- [Prometheus Playlist - TechWorld with Nana](https://youtube.com/playlist?list=PLy7NrYWoggjxCF3av5JKwyG7FFF9eLeL4) + +## Read next + +- [Prometheus Introduction](./introduction.md) - Review the monitoring stack and basic concepts. +- [Kubernetes Introduction](../kubernetes/introduction.md) - Connect Prometheus setup back to Kubernetes basics. diff --git a/docs/terraform/commands.md b/docs/terraform/commands.md index 869ee08..cbff853 100644 --- a/docs/terraform/commands.md +++ b/docs/terraform/commands.md @@ -331,3 +331,7 @@ aws iam attach-group-policy --group-name --policy-arn aws iam attach-group-policy --group-name developers --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess ``` +## Read next + +- [Terraform Introduction](./introduction.md) - Review the Terraform workflow and state concepts first. +- [Learning Resources](./learning-resources.md) - Continue with official docs and deeper guides. diff --git a/docs/terraform/introduction.md b/docs/terraform/introduction.md index f8bbd28..1337ce6 100644 --- a/docs/terraform/introduction.md +++ b/docs/terraform/introduction.md @@ -1843,4 +1843,4 @@ variable "ami" { Now if we create a new workspace like `ProjectA` and run the `terraform apply` command, it will use the `ami-0c55b159cbfafe1f0` AMI. If we create a new workspace like `ProjectB` and run the `terraform apply` command, it will use the `ami-oe4b3bfb4c0e9b2` AMI. We can use the `terraform workspace list` command to list the workspaces and the `terraform workspace select` command to select a workspace. -The way terraform manages the the state files for different workspaces is that it creates a separate directory for each workspace and stores the state file in that directory. And all the directories are named as `terraform.tfstate.d/`. +The way Terraform manages the state files for different workspaces is by creating a separate directory for each workspace and storing the state file in that directory. Those directories are named `terraform.tfstate.d/`. diff --git a/docs/terraform/learning-resources.md b/docs/terraform/learning-resources.md index 04ef02e..04668c9 100644 --- a/docs/terraform/learning-resources.md +++ b/docs/terraform/learning-resources.md @@ -9,4 +9,9 @@ slug: "/terraform/resources" - [Official Terraform Documentation](https://www.terraform.io/docs) - [Terraform Providers](https://registry.terraform.io/browse/providers) -- [Terraform: Up & Running](https://www.terraformupandrunning.com/) \ No newline at end of file +- [Terraform: Up & Running](https://www.terraformupandrunning.com/) + +## Read next + +- [Terraform Introduction](./introduction.md) - Review the core Terraform workflow and concepts. +- [Terraform Commands](./commands.md) - Practice the commands you will use most often. diff --git a/docs/webassembly/learning-resources.md b/docs/webassembly/learning-resources.md index 872a0f4..16a8be0 100644 --- a/docs/webassembly/learning-resources.md +++ b/docs/webassembly/learning-resources.md @@ -11,4 +11,9 @@ slug: "/webassembly/resources" - [MDN Web Docs](https://developer.mozilla.org/en-US/docs/WebAssembly) - Mozilla Developer Network's WebAssembly documentation. - [GitHub WebAssembly](https://github.com/WebAssembly) - WebAssembly's GitHub organization. - [Awesome Wasm repo](https://github.com/mbasso/awesome-wasm) - A curated list of awesome WebAssembly projects. -- [KodeKloud WebAssembly Course](https://kodekloud.com/p/webassembly) - NOTE: This is a paid course. Mentioning it here as I used it to learn WebAssembly. \ No newline at end of file +- [KodeKloud WebAssembly Course](https://kodekloud.com/p/webassembly) - NOTE: This is a paid course. Mentioning it here as I used it to learn WebAssembly. + +## Read next + +- [WebAssembly Introduction](./introduction.md) - Review the basics, runtimes, and ecosystem first. +- [Tools](./tools.md) - Try WebAssembly tools and playgrounds in the browser. diff --git a/docs/webassembly/tools.md b/docs/webassembly/tools.md index beeec41..fc0e16c 100644 --- a/docs/webassembly/tools.md +++ b/docs/webassembly/tools.md @@ -7,7 +7,14 @@ keywords: ["WebAssembly", "Assembly", "Web Development"] slug: "/webassembly/tools" --- +Here are some tools you can use to experiment with WebAssembly directly in the browser: + - [WasmFiddle](https://wasdk.github.io/WasmFiddle/) - An online playground for WebAssembly. - [WebAssembly Explorer](https://mbebenita.github.io/WasmExplorer/) - An online tool for exploring WebAssembly. - [WABT Online](https://webassembly.github.io/wabt/demo/wat2wasm/) - An online tool for working with WebAssembly. -- [WasmCloud Playground](https://playground.wasmcloud.dev/) - An online tool for building and running WebAssembly modules. \ No newline at end of file +- [WasmCloud Playground](https://playground.wasmcloud.dev/) - An online tool for building and running WebAssembly modules. + +## Read next + +- [WebAssembly Introduction](./introduction.md) - Review the core ideas, runtimes, and ecosystem. +- [Learning Resources](./learning-resources.md) - Continue with official docs and curated references. diff --git a/docs/yaml/learning-resources.md b/docs/yaml/learning-resources.md index 9c25b47..5d3af8f 100644 --- a/docs/yaml/learning-resources.md +++ b/docs/yaml/learning-resources.md @@ -12,4 +12,9 @@ slug: "/yaml/resources" - [YAML Official Website](https://yaml.org/) - [Yaml Tutorial - TechWorld with Nana](https://youtu.be/1uFVr15xDGg) - [Complete YAML Course](https://youtu.be/IA90BTozdow) -- [YAML: The Missing Battery in Python](https://realpython.com/python-yaml/) \ No newline at end of file +- [YAML: The Missing Battery in Python](https://realpython.com/python-yaml/) + +## Read next + +- [YAML Introduction](./introduction.md) - Revisit the syntax and data structure basics. +- [Tools](./tools.md) - Validate and format YAML with the listed tools. diff --git a/docs/yaml/tools.md b/docs/yaml/tools.md index 8d6384b..f9fd5f2 100644 --- a/docs/yaml/tools.md +++ b/docs/yaml/tools.md @@ -7,9 +7,14 @@ keywords: ["YAML", "DevOps", "Kubernetes"] slug: "/yaml/tools" --- -Here are some of the tools that you can use to work with YAML files: +Here are some useful tools you can use to validate, format, and convert YAML files: -- [Yamllint](http://www.yamllint.com/) - Check the the format of the file. -- [YAML Validator](https://codebeautify.org/yaml-validator) - Check the the format of the file. +- [Yamllint](http://www.yamllint.com/) - Check the format and structure of a YAML file. +- [YAML Validator](https://codebeautify.org/yaml-validator) - Validate a YAML file quickly in the browser. - [YAML to JSON](https://codebeautify.org/yaml-to-json-xml-csv) - Convert YAML to JSON. - [YAMLine](https://yamline.com/) - Collection of YAML tools: Formatter, Validator, Comparator, and Converter. + +## Read next + +- [YAML Introduction](./introduction.md) - Review the syntax and common YAML patterns. +- [Learning Resources](./learning-resources.md) - Continue with tutorials and reference material. diff --git a/package.json b/package.json index 0a3dfa8..a34e8be 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,8 @@ "name": "devops", "version": "2.6.2", "scripts": { + "check:content-quality": "node scripts/check-content-quality.mjs", + "check:doc-links": "node scripts/check-doc-links.mjs", "check:readme-links": "node scripts/check-readme-links.mjs", "docusaurus": "docusaurus", "start": "docusaurus start", diff --git a/scripts/check-content-quality.mjs b/scripts/check-content-quality.mjs new file mode 100644 index 0000000..3b8ba13 --- /dev/null +++ b/scripts/check-content-quality.mjs @@ -0,0 +1,93 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const rootDir = process.cwd(); +const supportedExtensions = new Set(['.md', '.mdx']); +const scanRoots = [ + path.join(rootDir, 'README.md'), + path.join(rootDir, 'docs'), +]; + +const checks = [ + {regex: /Here are list of/g, message: 'Use "Here are some resources" or similar natural wording.'}, + {regex: /Check the the/g, message: 'Remove repeated words.'}, + {regex: /Wokflow files/g, message: 'Fix "Workflow" spelling.'}, + {regex: /break into seprate/g, message: 'Fix awkward phrasing and spelling.'}, + {regex: /commad name/g, message: 'Fix "command" spelling.'}, + {regex: /Disk usages capcity/g, message: 'Fix "usage/capacity" wording.'}, + {regex: /file-fath/g, message: 'Fix "file-path" spelling.'}, + {regex: /printevnv/g, message: 'Fix the command name or explanation.'}, + {regex: /the the state files/g, message: 'Remove repeated words.'}, + {regex: /\bkube exec\b/g, message: 'Use "kubectl exec" in examples.'}, + {regex: /\bkube describe\b/g, message: 'Use "kubectl describe" in examples.'}, + {regex: /\bmyngix\b/g, message: 'Fix the sample resource name typo.'}, + {regex: /\bvesrion\b/g, message: 'Fix "version" spelling.'}, + {regex: /\benvirnoment\b/g, message: 'Fix "environment" spelling.'}, + {regex: /\bavilable\b/g, message: 'Fix "available" spelling.'}, + {regex: /\bcertian\b/g, message: 'Fix "certain" spelling.'}, + {regex: /\bcareted\b/g, message: 'Fix "created" spelling.'}, + {regex: /\bchnages\b/g, message: 'Fix "changes" spelling.'}, + {regex: /\bdry nun\b/g, message: 'Fix "dry run" wording.'}, + {regex: /other Resources/g, message: 'Use consistent title casing.'}, + {regex: /^\s*docker-compose\s+/gm, message: 'Use the modern "docker compose" CLI in commands.'}, + {regex: /^\s*::set-output/gm, message: 'Use GITHUB_OUTPUT instead of ::set-output.'}, +]; + +function walk(targetPath) { + const stats = fs.statSync(targetPath); + + if (stats.isFile()) { + return supportedExtensions.has(path.extname(targetPath)) ? [targetPath] : []; + } + + const entries = fs.readdirSync(targetPath, {withFileTypes: true}); + const files = []; + + for (const entry of entries) { + const fullPath = path.join(targetPath, entry.name); + + if (entry.isDirectory()) { + files.push(...walk(fullPath)); + continue; + } + + if (supportedExtensions.has(path.extname(entry.name))) { + files.push(fullPath); + } + } + + return files; +} + +const findings = []; + +for (const scanRoot of scanRoots) { + for (const filePath of walk(scanRoot)) { + const content = fs.readFileSync(filePath, 'utf8'); + + for (const check of checks) { + for (const match of content.matchAll(check.regex)) { + const line = content.slice(0, match.index).split('\n').length; + findings.push({ + filePath, + line, + snippet: match[0], + message: check.message, + }); + } + } + } +} + +if (findings.length > 0) { + console.error('Content quality checks found issues:\n'); + + for (const finding of findings) { + const relativeFile = path.relative(rootDir, finding.filePath); + console.error(`- ${relativeFile}:${finding.line} -> "${finding.snippet}" (${finding.message})`); + } + + process.exit(1); +} + +console.log('Content quality checks passed.'); diff --git a/scripts/check-doc-links.mjs b/scripts/check-doc-links.mjs new file mode 100644 index 0000000..18f1159 --- /dev/null +++ b/scripts/check-doc-links.mjs @@ -0,0 +1,99 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const rootDir = process.cwd(); +const docsDir = path.join(rootDir, 'docs'); +const supportedExtensions = new Set(['.md', '.mdx']); +const ignoredPrefixes = ['http://', 'https://', 'mailto:', 'tel:', 'data:', '#', '/']; + +function walk(dirPath) { + const entries = fs.readdirSync(dirPath, {withFileTypes: true}); + const files = []; + + for (const entry of entries) { + const fullPath = path.join(dirPath, entry.name); + + if (entry.isDirectory()) { + files.push(...walk(fullPath)); + continue; + } + + if (supportedExtensions.has(path.extname(entry.name))) { + files.push(fullPath); + } + } + + return files; +} + +function extractLinks(content) { + const markdownLinks = [...content.matchAll(/\[[^\]]+\]\(([^)]+)\)/g)].map((match) => match[1]); + const htmlLinks = [...content.matchAll(/(?:href|src)="([^"]+)"/g)].map((match) => match[1]); + return [...new Set([...markdownLinks, ...htmlLinks])]; +} + +function normalizeTarget(target) { + return decodeURIComponent(target.split('#')[0].split('?')[0].trim().replace(/^<|>$/g, '')); +} + +function targetExists(fromFile, target) { + const resolvedPath = path.resolve(path.dirname(fromFile), target); + + if (fs.existsSync(resolvedPath)) { + return resolvedPath; + } + + if (path.extname(resolvedPath)) { + return null; + } + + const candidates = [ + `${resolvedPath}.md`, + `${resolvedPath}.mdx`, + path.join(resolvedPath, 'index.md'), + path.join(resolvedPath, 'index.mdx'), + ]; + + return candidates.find((candidate) => fs.existsSync(candidate)) ?? null; +} + +const brokenLinks = []; + +for (const filePath of walk(docsDir)) { + const content = fs.readFileSync(filePath, 'utf8'); + + for (const rawLink of extractLinks(content)) { + if (ignoredPrefixes.some((prefix) => rawLink.startsWith(prefix))) { + continue; + } + + const target = normalizeTarget(rawLink); + + if (!target) { + continue; + } + + const resolvedTarget = targetExists(filePath, target); + + if (!resolvedTarget) { + brokenLinks.push({ + filePath, + rawLink, + targetPath: path.resolve(path.dirname(filePath), target), + }); + } + } +} + +if (brokenLinks.length > 0) { + console.error('Docs contain broken local links:\n'); + + for (const entry of brokenLinks) { + const relativeFile = path.relative(rootDir, entry.filePath); + console.error(`- ${relativeFile}: ${entry.rawLink} -> ${entry.targetPath}`); + } + + process.exit(1); +} + +console.log('Docs local links look good.'); From 6c70b6fa0645a5f8ddf6c37f1ff4b1ce5586c926 Mon Sep 17 00:00:00 2001 From: Pradumna Saraf Date: Fri, 3 Apr 2026 20:57:02 +0530 Subject: [PATCH 5/5] chore: remove showLastUpdateTime option from Docusaurus configuration --- docusaurus.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 6dd6126..899ea3f 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -34,7 +34,6 @@ const config = { docs: { sidebarPath: './sidebars.js', routeBasePath: '/', - showLastUpdateTime: true, editUrl: 'https://github.com/Pradumnasaraf/DevOps/edit/main/', },