diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..33d1a6a82 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +## Goal What does this PR accomplish? + +## Changes What was modified? + +## Testing How was it verified? + +## Checklist + +- [ ] Clear, descriptive PR title + +- [ ] Documentation/README updated (if needed) + +- [ ] No secrets or large temporary files committed diff --git a/.github/workflows/github-actions-demo.yml b/.github/workflows/github-actions-demo.yml new file mode 100644 index 000000000..395342cc2 --- /dev/null +++ b/.github/workflows/github-actions-demo.yml @@ -0,0 +1,34 @@ +name: GitHub Actions Demo +run-name: ${{ github.actor }} is testing out GitHub Actions 🚀 +on: + push: + workflow_dispatch: +jobs: + Explore-GitHub-Actions: + runs-on: ubuntu-latest + steps: + - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" + - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." + - name: Check out repository code + uses: actions/checkout@v5 + - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." + - run: echo "🖥️ The workflow is now ready to test your code on the runner." + - name: List files in the repository + run: | + ls ${{ github.workspace }} + - run: echo "🍏 This job's status is ${{ job.status }}." + + - name: Show system information + run: | + echo "===== SYSTEM INFO =====" + uname -a + echo "" + echo "CPU Info:" + lscpu + echo "" + echo "Memory Info:" + free -h + echo "" + echo "Disk Info:" + df -h \ No newline at end of file diff --git a/12-1.png b/12-1.png new file mode 100644 index 000000000..85046dcd3 Binary files /dev/null and b/12-1.png differ diff --git a/12-2.png b/12-2.png new file mode 100644 index 000000000..9778357b8 Binary files /dev/null and b/12-2.png differ diff --git a/9-1.png b/9-1.png new file mode 100644 index 000000000..3f535182f Binary files /dev/null and b/9-1.png differ diff --git a/9-2.png b/9-2.png new file mode 100644 index 000000000..4e075aa0c Binary files /dev/null and b/9-2.png differ diff --git a/9-3.png b/9-3.png new file mode 100644 index 000000000..6e35c9fbf Binary files /dev/null and b/9-3.png differ diff --git a/Pasted image 20260205132920.png b/Pasted image 20260205132920.png new file mode 100644 index 000000000..8aaf83fd1 Binary files /dev/null and b/Pasted image 20260205132920.png differ diff --git a/Pasted image 20260205140322.png b/Pasted image 20260205140322.png new file mode 100644 index 000000000..ac6cb473d Binary files /dev/null and b/Pasted image 20260205140322.png differ diff --git a/Pasted image 20260205140431.png b/Pasted image 20260205140431.png new file mode 100644 index 000000000..f4bf8fe78 Binary files /dev/null and b/Pasted image 20260205140431.png differ diff --git a/Pasted image 20260205141238.png b/Pasted image 20260205141238.png new file mode 100644 index 000000000..e5684a266 Binary files /dev/null and b/Pasted image 20260205141238.png differ diff --git a/Pasted image 20260211222017.png b/Pasted image 20260211222017.png new file mode 100644 index 000000000..4d74049d5 Binary files /dev/null and b/Pasted image 20260211222017.png differ diff --git a/Pasted image 20260211222338.png b/Pasted image 20260211222338.png new file mode 100644 index 000000000..956ba5442 Binary files /dev/null and b/Pasted image 20260211222338.png differ diff --git a/Pasted image 20260211225921.png b/Pasted image 20260211225921.png new file mode 100644 index 000000000..319391886 Binary files /dev/null and b/Pasted image 20260211225921.png differ diff --git a/Pasted image 20260211230058.png b/Pasted image 20260211230058.png new file mode 100644 index 000000000..bf8b60013 Binary files /dev/null and b/Pasted image 20260211230058.png differ diff --git a/Pasted image 20260211232004.png b/Pasted image 20260211232004.png new file mode 100644 index 000000000..4355425e3 Binary files /dev/null and b/Pasted image 20260211232004.png differ diff --git a/Pasted image 20260211233130.png b/Pasted image 20260211233130.png new file mode 100644 index 000000000..80b88fa8b Binary files /dev/null and b/Pasted image 20260211233130.png differ diff --git a/Pasted image 20260212003931.png b/Pasted image 20260212003931.png new file mode 100644 index 000000000..8b873d8c5 Binary files /dev/null and b/Pasted image 20260212003931.png differ diff --git a/Pasted image 20260212004755.png b/Pasted image 20260212004755.png new file mode 100644 index 000000000..548d657d6 Binary files /dev/null and b/Pasted image 20260212004755.png differ diff --git a/Pasted image 20260212011430.png b/Pasted image 20260212011430.png new file mode 100644 index 000000000..90e5e772c Binary files /dev/null and b/Pasted image 20260212011430.png differ diff --git a/Pasted image 20260219012754.png b/Pasted image 20260219012754.png new file mode 100644 index 000000000..1f94f826f Binary files /dev/null and b/Pasted image 20260219012754.png differ diff --git a/browser.png b/browser.png new file mode 100644 index 000000000..2d1f0f82b Binary files /dev/null and b/browser.png differ diff --git a/check.png b/check.png new file mode 100644 index 000000000..f5189ff0f Binary files /dev/null and b/check.png differ diff --git a/cpu.png.png b/cpu.png.png new file mode 100644 index 000000000..a4805db62 Binary files /dev/null and b/cpu.png.png differ diff --git a/demo.txt b/demo.txt new file mode 100644 index 000000000..d2940f49d Binary files /dev/null and b/demo.txt differ diff --git a/demo1.txt b/demo1.txt new file mode 100644 index 000000000..d2940f49d Binary files /dev/null and b/demo1.txt differ diff --git a/file.txt b/file.txt new file mode 100644 index 000000000..3d106c644 Binary files /dev/null and b/file.txt differ diff --git a/history.txt b/history.txt new file mode 100644 index 000000000..310734123 Binary files /dev/null and b/history.txt differ diff --git a/io.png.png b/io.png.png new file mode 100644 index 000000000..c0b8750ad Binary files /dev/null and b/io.png.png differ diff --git a/lab6_1.png b/lab6_1.png new file mode 100644 index 000000000..10d5f6e93 Binary files /dev/null and b/lab6_1.png differ diff --git a/lab6_2.png b/lab6_2.png new file mode 100644 index 000000000..8e11f5e3f Binary files /dev/null and b/lab6_2.png differ diff --git a/lab7_1.png b/lab7_1.png new file mode 100644 index 000000000..7c51f8503 Binary files /dev/null and b/lab7_1.png differ diff --git a/labs/lab11/app/Dockerfile b/labs/lab11/app/Dockerfile new file mode 100644 index 000000000..42c566756 --- /dev/null +++ b/labs/lab11/app/Dockerfile @@ -0,0 +1,4 @@ +FROM golang:1.22 +WORKDIR /app +COPY main.go . +RUN go build -o app main.go diff --git a/labs/lab11/app/Dockerfile.traditional b/labs/lab11/app/Dockerfile.traditional new file mode 100644 index 000000000..071de12f7 --- /dev/null +++ b/labs/lab11/app/Dockerfile.traditional @@ -0,0 +1,9 @@ + +FROM golang:1.22 AS builder +WORKDIR /build +COPY main.go . +RUN go build -o app main.go + +FROM scratch +COPY --from=builder /build/app /app +ENTRYPOINT ["/app"] diff --git a/labs/lab11/app/default.nix b/labs/lab11/app/default.nix new file mode 100644 index 000000000..92061064e --- /dev/null +++ b/labs/lab11/app/default.nix @@ -0,0 +1,22 @@ +{ pkgs ? import {} }: + +pkgs.stdenv.mkDerivation { + pname = "app"; + version = "1.0"; + + src = ./.; + + buildInputs = [ pkgs.go ]; + + buildPhase = '' + export HOME=$TMPDIR + export GOCACHE=$TMPDIR/go-cache + + go build -o app main.go + ''; + + installPhase = '' + mkdir -p $out/bin + cp app $out/bin/ + ''; +} \ No newline at end of file diff --git a/labs/lab11/app/docker.nix b/labs/lab11/app/docker.nix new file mode 100644 index 000000000..763522927 --- /dev/null +++ b/labs/lab11/app/docker.nix @@ -0,0 +1,19 @@ +{ pkgs ? import {} }: + +let + appBin = pkgs.runCommand "app-bin" { buildInputs = [ pkgs.go ]; } '' + mkdir -p $out/bin + cp ${./main.go} main.go + go build -ldflags="-s -w" -o app main.go + cp app $out/bin/ + ''; +in + pkgs.dockerTools.buildLayeredImage { + name = "nix-reproducible-app"; + tag = "latest"; + contents = [ appBin ]; + config = { + Cmd = [ "/bin/app" ]; + Env = [ "NIX_REPRODUCIBLE=1" ]; + }; + } diff --git a/labs/lab11/app/index.html b/labs/lab11/app/index.html deleted file mode 100644 index ece7bac66..000000000 --- a/labs/lab11/app/index.html +++ /dev/null @@ -1,545 +0,0 @@ - - - - - - DevOps Introduction - - - - - - - - -
- -
- -
-

DevOps Introduction

-

Master modern DevOps practices through hands-on labs covering Git, CI/CD, Containers, Kubernetes, Cloud & WASM

-
-
- 12 - Hands-on Labs -
-
- 10 - Core Topics -
-
- 15 - Weeks -
-
-
- View Course Repository → -
- -
-

Course Overview

-

This comprehensive course provides a solid foundation in modern DevOps practices through practical, hands-on experience. You'll learn industry-standard tools and workflows used by leading tech companies.

- -
-
- 📝 -

Hands-On Learning

-

Every concept is reinforced through practical labs. Build real projects and submit them via GitHub Pull Requests for review.

- 12 Comprehensive Labs -
-
- 🔧 -

Industry Tools

-

Work with production-grade tools: Docker, Kubernetes, GitHub Actions, Terraform, Ansible, Prometheus, and more.

- 15+ Technologies -
-
- 🚀 -

Modern Practices

-

Learn GitOps, Progressive Delivery, SRE principles, Infrastructure as Code, and emerging technologies like WebAssembly.

- Cutting-Edge Topics -
-
-
- -
-

What You'll Learn

-

Master DevOps through 12 progressive hands-on labs, each building real-world skills with production-grade tools.

- -
-
- 🔀 -

Lab 1: Git Workflows

-

Master Git branching strategies, collaborative workflows, pull requests, and version control best practices.

-
-
- ⚙️ -

Lab 2: GitHub Actions

-

Build automated CI/CD pipelines with GitHub Actions for testing, building, and deploying applications.

-
-
- 🐳 -

Lab 3: Docker Basics

-

Learn Docker containerization, write Dockerfiles, and implement multi-stage builds for optimized images.

-
-
- 🔗 -

Lab 4: Docker Compose

-

Orchestrate multi-container applications with Docker Compose, manage networks and volumes.

-
-
- ☸️ -

Lab 5: Kubernetes Basics

-

Deploy applications to Kubernetes, work with pods, services, and ingress controllers.

-
-
- 🎛️ -

Lab 6: K8s Advanced

-

Master ConfigMaps, Secrets, Helm charts, and advanced Kubernetes resource management.

-
-
- 🏗️ -

Lab 7: Terraform IaC

-

Implement Infrastructure as Code with Terraform, manage cloud resources declaratively.

-
-
- 🤖 -

Lab 8: Ansible Automation

-

Automate configuration management with Ansible playbooks, roles, and inventory management.

-
-
- 📊 -

Lab 9: Monitoring Stack

-

Set up observability with Prometheus for metrics collection and Grafana for visualization.

-
-
- 🔄 -

Lab 10: GitOps with ArgoCD

-

Implement GitOps workflows using ArgoCD for declarative, Git-based application delivery.

-
-
- 🔒 -

Lab 11: DevSecOps

-

Integrate security scanning, vulnerability detection, and automated security testing into CI/CD.

-
-
- 🚀 -

Lab 12: WASM vs Docker

-

Compare WebAssembly containers with traditional Docker, deploy to Spin Cloud for serverless WASM.

-
-
-
- -
-

Lab Assignments

-

Each lab is designed to build practical skills through real-world scenarios. Submit your work via Pull Requests for instructor review and feedback.

-
    -
  1. Git Workflow & Branching Strategies
  2. -
  3. GitHub Actions CI/CD Pipeline
  4. -
  5. Docker Containerization & Multi-Stage Builds
  6. -
  7. Docker Compose & Container Orchestration
  8. -
  9. Kubernetes Deployment & Services
  10. -
  11. Kubernetes ConfigMaps, Secrets & Helm
  12. -
  13. Infrastructure as Code with Terraform
  14. -
  15. Configuration Management with Ansible
  16. -
  17. Monitoring with Prometheus & Grafana
  18. -
  19. GitOps with ArgoCD
  20. -
  21. Security Scanning & DevSecOps
  22. -
  23. WebAssembly Containers vs Traditional (Spin Cloud)
  24. -
-
- -
-

Course Resources

-

All course materials, lab instructions, and submission guidelines are available on GitHub.

- -
-

Ready to Start Your DevOps Journey?

-

- Fork the repository, follow the lab instructions, and submit your work via Pull Requests. Get hands-on experience with industry-standard DevOps practices. -

- - 📚 - Access Course Repository - -
- -
-
- 📖 -

Lab Instructions

-

Detailed step-by-step guides for each lab with acceptance criteria and submission guidelines.

-
-
- 💬 -

Course Communication

-

Use GitHub Issues for questions and Discussions for course-related conversations.

-
-
- 🎯 -

Grading & Feedback

-

Receive detailed feedback on your Pull Requests and track your progress through the course.

-
-
-
- - - - diff --git a/labs/lab11/app/main.go b/labs/lab11/app/main.go new file mode 100644 index 000000000..c0ded1f3e --- /dev/null +++ b/labs/lab11/app/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "fmt" + "time" +) + +func main() { + fmt.Printf("Built with Nix at compile time\n") + fmt.Printf("Running at: %s\n", time.Now().Format(time.RFC3339)) +} \ No newline at end of file diff --git a/labs/submission 10.md b/labs/submission 10.md new file mode 100644 index 000000000..55f790298 --- /dev/null +++ b/labs/submission 10.md @@ -0,0 +1,39 @@ +## Task 1. Artifact Registries + +- AWS → Amazon Elastic Container Registry +- GCP → Google Artifact Registry +- Azure → Azure Container Registry + +### Сравнительная таблица + +| Параметр | AWS ECR | GCP Artifact Registry | Azure ACR | +| ---------- | ------------------------------------------- | -------------------------------------------- | ------------------------------------- | +| Типы | Docker (фактически OCI) | Мульти (npm, Maven и др.) | Docker + OCI | +| Security | + | + | + | +| Интеграции | AWS | GCP | Azure/GitHub | +| Pricing | Pay-as-you-go (хранение + исходящий трафик) | Pay-as-you-go (хранение + операции + трафик) | Tier-based (Basic, Standard, Premium) | + +Лучший выбор - **GCP Artifact Registry**, так как поддерживает разные типы артефактов + +--- +## Task 2. Serverless + +- AWS → AWS Lambda +- GCP → Google Cloud Run / Functions +- Azure → Azure Functions + +### Сравнительная таблица + +| Параметр | AWS Lambda | GCP Cloud Run | Azure Functions | +| ---------- | ---------- | ------------------------- | ------------------- | +| Модель | Event | Контейнеры | Event | +| Языки | Много | Любые (т.к. в контейнере) | Много | +| Max time | 15 мин | до 60 мин | до 60 мин (Premium) | +| Cold start | Средний | Низкий | Выше | +| Гибкость | Средняя | Высокая | Средняя | + +Лучший выбор - **GCP Cloud Run**, так как имеет меньшие ограничения + +Преимущества serverless, в том, что мы платим разумную цену за то, чем реально пользуемся. В случае, если нам не требуются какие-то ресурсы, мы за них не платим и они нам не предоставляются автоматически. + +--- diff --git a/labs/submission1.md b/labs/submission1.md new file mode 100644 index 000000000..e2bbae60f --- /dev/null +++ b/labs/submission1.md @@ -0,0 +1,22 @@ +# Лабораторная работа 1. +Подпись коммитов действительно важна, поскольку она подтверждает авторство программиста, что повышает безопасность при работе в команде. +Если коммит или тег имеет криптографически проверяемую подпись GPG, SSH или S/MIME, GitHub помечает коммит или тег как «Verified». + +![[Pasted image 20260205132920.png]] + +--- + +![[Pasted image 20260205140322.png]] + +--- + +![[Pasted image 20260205140431.png]] + +--- + +PR ускоряет работу программистов в команде, так как сразу видно что и где изменено, что позволяет быстрее анализировать работу коллег. +Проблем не возникло. + +--- + +![[Pasted image 20260205141238.png]] diff --git a/labs/submission11.md b/labs/submission11.md new file mode 100644 index 000000000..b31176807 --- /dev/null +++ b/labs/submission11.md @@ -0,0 +1,62 @@ +3## Task 1. + +#### Nix + +``` +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ readlink result + +/nix/store/51fh8ygld87p6dkcvjxf0cnsqq6hbfhi-app-1.0 +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ sha256sum result/bin/app + +0332eafc08f95ac61cbdca39b4046acc7ae16b258ef0e5285186e95eda316976 result/bin/app + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ rm result + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ nix-build + +/nix/store/51fh8ygld87p6dkcvjxf0cnsqq6hbfhi-app-1.0 +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ readlink result + +/nix/store/51fh8ygld87p6dkcvjxf0cnsqq6hbfhi-app-1.0 +``` + +**Сборки Nix воспроизводимы, потому что:** + Все зависимости имеют адресацию по содержимому + Сборки выполняются в изолированной среде + Одни и те же входные данные всегда дают идентичные выходные данные +#### Docker +``` +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ docker images | grep test-app + + +test-app latest 8b6ba877aecd 4 days ago 1.25GB + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ docker images | grep test-app + + +test-app latest 05712571ae04 4 days ago 1.25GB +``` + +**Сборки Docker не воспроизводятся по следующим причинам:** + Базовые образы могут меняться со временем + Процесс сборки не является полностью детерминированным + +## Task 2. + +``` +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ docker images | grep -E "nix-reproducible|traditional-app" +traditional-app latest 10884065c937 10 seconds ago 3.26MB +nix-reproducible-app latest f35d9224bbe9 56 years ago 598MB +``` +Почему образ Nix такой большой? +Приложение, использующее Nix-деривацию, включает в себя весь компилятор Go и другие зависимости времени сборки, поскольку Nix не может автоматически различать зависимости времени сборки и времени выполнения для статически скомпилированных бинарных файлов Go. В результате dockerTools.buildImage упаковывает все пакеты, на которые ссылается замыкание, включая go-1.26.1, bash, glibc и т.д. + +``` +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ docker history nix-reproducible-app:latest +IMAGE CREATED CREATED BY SIZE COMMENT +3c5f86e25c1b N/A 310MB +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab11/app$ docker history traditional-app:latest +IMAGE CREATED CREATED BY SIZE COMMENT +10884065c937 11 minutes ago ENTRYPOINT ["/app"] 0B buildkit.dockerfile.v0 + 11 minutes ago COPY /build/app /app # buildkit 2.02MB buildkit.dockerfile.v0 +``` \ No newline at end of file diff --git a/labs/submission2.md b/labs/submission2.md new file mode 100644 index 000000000..e694d1cba --- /dev/null +++ b/labs/submission2.md @@ -0,0 +1,67 @@ +## Task 1. + +1. Commit: по хэшу коммита выдает о нем всю информацию +![[Pasted image 20260211222017.png]] +2. Blobs and tree: хэш дерева переходит в папку, хэш blobs показывает содержимое файла +![[Pasted image 20260211222338.png]] + +--- +## Task 2. + +1. Создал новую ветку - *git switch -c git-reset-practice* +2. Создал три коммита с file.txt с разными названиями - + *echo "First commit" > file.txt && git add file.txt && git commit -m "First commit" + echo "Second commit" >> file.txt && git add file.txt && git commit -m "Second commit" + echo "Third commit" >> file.txt && git add file.txt && git commit -m "Third commit" +3. Перенес HEAD на 1 коммит назад - *git reset --soft HEAD~1* +4. Перенес HEAD на 1 коммит назад, удалив изменения - *git reset --hard HEAD~1 +5. История HEAD - *git reflog* +6. Восстановил шаг 5 - *git reset --hard c94369f* +![[Pasted image 20260211225921.png]] + +![[Pasted image 20260211230058.png]] + +--- +## Task 3. + +Граф позволяет наглядно увидеть где HEAD в истории коммитов, что позволяет проще ориентироваться. + +![[Pasted image 20260211232004.png]] + +___ + +## Task 4. + +Тэги важны, чтобы быстро перемещаться по важным коммитам не через хэш. + +Хэш: +*PS C:\Users\Георгий\DevOps-Intro> git show v1.0.0 --oneline +c94369f (tag: v1.0.0, git-reset-practice) Second commit +*PS C:\Users\Георгий\DevOps-Intro> git show v1.0.0 --oneline +c94369f (tag: v1.0.0, git-reset-practice) Second commit + +![[Pasted image 20260211233130.png]] + +--- +## Task 5. + +switch - создает и переносит в только что созданную ветку. restore - позволяет отменять незакоммиченные изменения, отменять и восстанавливать изменения из другого коммита + +Когда делал по заданию наткнулся на ошибку, переделал с git add и доделал по заданию: +![[Pasted image 20260212004755.png]] + +с восстановлением: + *echo "scratch" >> demo1.txt + git add demo1.txt + git restore --staged demo1.txt + git add demo1.txt + git restore --source=HEAD~1 demo1.txt +![[Pasted image 20260212003931.png]] + +--- + +## Task 6. + +Звезды помогают добавить проекты в закладки для последующего использования. Подписка на разработчиков позволяет следить за их работой и проектами. + +![[Pasted image 20260212011430.png]] diff --git a/labs/submission3.md b/labs/submission3.md new file mode 100644 index 000000000..8fbb99d0b --- /dev/null +++ b/labs/submission3.md @@ -0,0 +1,42 @@ +## Task 1. + +https://github.com/klassgo/DevOps-Intro/actions/runs/22158159618/job/64067666824 - успешный запуск GitHub Actions + +- jobs - задание, которое состоит из набора шагов, которые выполняет runner +- steps - задача внутри задания +- runners - виртуальная машина, которая выполняет workflow +- triggers - запуск (push) + +Workflow был запущен после выполнения `git push`, так как в конфигурации указано on: [push]. + +После push GitHub проверяет workflow файлы и создает виртуальную машину для выполнения шагов в yml файле + +## Task 2. + +https://github.com/klassgo/DevOps-Intro/actions/runs/22159849272/job/64074111651 - успешный ручной запуск + +Добавлено: + + on: +   push: +   workflow_dispatch: +   + +       - name: Show system information +         run: | +           echo "===== SYSTEM INFO =====" +           uname -a +           echo "" +           echo "CPU Info:" +           lscpu +           echo "" +           echo "Memory Info:" +           free -h +           echo "" +           echo "Disk Info:" +           df -h + +![[Pasted image 20260219012754.png]] + +- Автоматический запускается после push и сразу проверяет код, ручной через интерфейс на GitHub Actions, не запускает код сразу, что удобно для деббага в команде +- Среда создается для выполнения кода, после чего сразу удаляется, имеет ограниченные ресурсы. Не имеет связи между запусками \ No newline at end of file diff --git a/labs/submission4.md b/labs/submission4.md new file mode 100644 index 000000000..b566e636c --- /dev/null +++ b/labs/submission4.md @@ -0,0 +1,234 @@ +# Task 1. + +### 1.1 Boot Performance Analysis + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ systemd-analyze** + + Startup finished in 1.431s (userspace) + graphical.target reached after 1.389s in userspace. + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ systemd-analyze blame** + 785ms landscape-client.service + 312ms snapd.seeded.service + 249ms snapd.service + 200ms dev-sde.device + 143ms user@1000.service + 126ms dpkg-db-backup.service + ... (100ms<) + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ uptime** + 23:42:52 up 5 min, 1 user, load average: 0.24, 0.09, 0.02 + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ w** + + 23:42:56 up 5 min, 1 user, load average: 0.22, 0.09, 0.02 + USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT + georgiy pts/1 - 23:40 2:48 0.00s ? -bash + +--- + +### 1.2: Process Forensics + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -n 6** + + PID PPID CMD %MEM %CPU + 234 1 /usr/bin/python3 /usr/share 0.5 0.0 + 41 1 /usr/lib/systemd/systemd-jo 0.4 0.1 + 147 1 /usr/lib/systemd/systemd-re 0.3 0.0 + 1 0 /sbin/init 0.3 0.4 + 436 1 /usr/lib/systemd/systemd -- 0.2 0.0 + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 6** + + PID PPID CMD %MEM %CPU + 1 0 /sbin/init 0.3 0.4 + 41 1 /usr/lib/systemd/systemd-jo 0.4 0.1 + 103 91 (udev-worker) 0.1 0.1 + 91 1 /usr/lib/systemd/systemd-ud 0.1 0.1 + 158 1 @dbus-daemon --system --add 0.1 0.0 + +--- + +### 1.3: Service Dependencies + +**systemctl list-dependencies** + + Выводится большое дерево иерархии целей системы, на вершине которого + default.target + ○ ├─display-manager.service + ○ ├─systemd-update-utmp-runlevel.service + ○ ├─wslg.service + ● └─multi-user.target + ... + +**systemctl list-dependencies multi-user.target** + + Выводит это же иерархическое дерево, но имеет корень в multi-user.target + multi-user.target + ○ ├─apport.service + ● ├─console-setup.service + ● ├─cron.service + ● ├─dbus.service + ○ ├─dmesg.service + ... + +--- +### 1.4: User Sessions + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ who -a** + + system boot 2026-02-25 23:40 + run-level 5 2026-02-25 23:40 + LOGIN tty1 2026-02-25 23:40 200 id=tty1 + LOGIN console 2026-02-25 23:40 184 id=cons + georgiy - pts/1 2026-02-25 23:40 00:08 449 + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ last -n 5** + + reboot system boot 6.6.87.2-microso Wed Feb 25 23:40 still running + reboot system boot 6.6.87.2-microso Thu Feb 5 01:17 still running + reboot system boot 6.6.87.2-microso Thu Feb 5 01:05 still running + + wtmp begins Thu Feb 5 01:05:30 2026 + +--- +### 1.5: Memory Analysis + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ free -h** + total used free shared buff/cache available + Mem: 3.7Gi 399Mi 3.3Gi 3.4Mi 115Mi 3.3Gi + Swap: 1.0Gi 0B 1.0Gi + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ cat /proc/meminfo | grep -e MemTotal -e SwapTotal -e MemAvailable** + MemTotal: 3857620 kB + MemAvailable: 3444180 kB + SwapTotal: 1048576 kB + +--- +- Больше всего памяти использует процесс - /usr/bin/python3 /usr/share - 0.5% +- ЦПУ имеет очень низкую нагрузку +- Малое потребление памяти +- Быстрая загрузка системы +- В системе в основном работают основные службы systemd +- Одна активная пользовательская сессия +--- +# Task 2. + +### 2.1: Network Path Tracing + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ traceroute github.com** + + traceroute to github.com (140.82.121.3), 30 hops max, 60 byte packets + 1 DESKTOP-QL0CRI2.mshome.net (172.22.80.1) 0.936 ms 0.873 ms 0.842 ms + 2 * * * + 3 * * * + 4 1.123.18.84.in-addr.arpa (84.18.123.1) 12.258 ms 12.251 ms 16.122 ms + 5 178.176.191.24 (178.176.191.24) 219.244 ms 219.226 ms 219.034 ms + 6 * * * + 7 * * * + 8 * * * + 9 * * * + 10 83.169.204.78 (83.169.204.78) 67.107 ms 47.023 ms 49.924 ms + 11 netnod-ix-ge-a-sth-1500.inter.link (194.68.123.180) 46.553 ms netnod-ix-ge-b-sth-1500.inter.link (194.68.128.180) 44.856 ms 44.454 ms + 12 * * * + 13 r3-ber1-de.as5405.net (94.103.180.2) 59.508 ms 61.607 ms 61.603 ms + 14 r4-fra1-de.as5405.net (94.103.180.7) 58.939 ms 58.925 ms 61.648 ms + 15 * * * + 16 r3-fra3-de.as5405.net (94.103.180.54) 61.214 ms 58.322 ms 63.886 ms + 17 r1-fra3-de.as5405.net (94.103.180.24) 63.814 ms 63.803 ms 63.771 ms + 18 cust-sid436.fra3-de.as5405.net (45.153.82.37) 63.764 ms cust-sid435.r1-fra3-de.as5405.net (45.153.82.39) 63.755 ms cust-sid436.fra3-de.as5405.net (45.153.82.37) 63.746 ms + 19 - 30 * * * + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ dig github.com** + + ; <<>> DiG 9.18.39-0ubuntu0.24.04.2-Ubuntu <<>> github.com + ;; global options: +cmd + ;; Got answer: + ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32239 + ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 + + ;; OPT PSEUDOSECTION: + ; EDNS: version: 0, flags:; udp: 4096 + ;; QUESTION SECTION: + ;github.com. IN A + + ;; ANSWER SECTION: + github.com. 25 IN A 140.82.121.3 + + ;; Query time: 23 msec + ;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP) + ;; WHEN: Thu Feb 26 00:55:27 MSK 2026 + ;; MSG SIZE rcvd: 55 + +--- +- Сетевой путь до github.com проходит через множество транзитных узлов (среди которых локальный WSL, провайдер, точка обмена трафиком, конечный адрес), часть из которых скрыта (* * * ). Конечный IP совпадает с полученным через DNS. +--- +### 2.2: Packet Capture + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ sudo tcpdump -c 5 -i any port 53 -nn** + + tcpdump: data link type LINUX_SLL2 + tcpdump: verbose output suppressed, use -v[v]... for full protocol decode + listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes + 00:58:17.401051 lo In IP 10.255.255.254.53983 > 10.255.255.254.53: 63136+ [1au] A? google.com. (51) + 00:58:17.433070 lo In IP 10.255.255.254.53 > 10.255.255.254.53983: 63136* 2/0/1 CNAME forcesafesearch.google.com., A 216.239.38.120 (131) + 2 packets captured + 4 packets received by filter + 0 packets dropped by kernel + +--- + Запрос: Клиент `10.255.255.254:53983` - сервер `10.255.255.254:53` - `google.com` с ID 63136. + Ответ: Сервер `10.255.255.254.53` > клиент `10.255.255.254.53983` - `CNAME forcesafesearch.google.com` - безопасный поиск google + +--- +### 2.3: Reverse DNS + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ dig -x 8.8.4.4** + + ; <<>> DiG 9.18.39-0ubuntu0.24.04.2-Ubuntu <<>> -x 8.8.4.4 + ;; global options: +cmd + ;; Got answer: + ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 898 + ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 + + ;; OPT PSEUDOSECTION: + ; EDNS: version: 0, flags:; MBZ: 0x1507, udp: 4096 + ;; QUESTION SECTION: + ;4.4.8.8.in-addr.arpa. IN PTR + + ;; ANSWER SECTION: + 4.4.8.8.in-addr.arpa. 5383 IN PTR dns.google. + + ;; Query time: 39 msec + ;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP) + ;; WHEN: Thu Feb 26 01:00:29 MSK 2026 + ;; MSG SIZE rcvd: 93 + +**georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs$ dig -x 1.1.2.2** + + ;; communications error to 10.255.255.254#53: timed out + ;; communications error to 10.255.255.254#53: timed out + + ; <<>> DiG 9.18.39-0ubuntu0.24.04.2-Ubuntu <<>> -x 1.1.2.2 + ;; global options: +cmd + ;; Got answer: + ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 31350 + ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 + + ;; OPT PSEUDOSECTION: + ; EDNS: version: 0, flags:; MBZ: 0x020e, udp: 4096 + ;; QUESTION SECTION: + ;2.2.1.1.in-addr.arpa. IN PTR + + ;; AUTHORITY SECTION: + 1.in-addr.arpa. 526 IN SOA ns.apnic.net. read-txt-record-of-zone-first-dns-admin.apnic.net. 23597 7200 1800 604800 3600 + + ;; Query time: 2036 msec + ;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP) + ;; WHEN: Thu Feb 26 01:00:50 MSK 2026 + ;; MSG SIZE rcvd: 160 + +--- +- **8.8.4.4** — успешный ответ `dns.google` +- **1.1.2.2** — долгое время ожидания, нет PTR +- --- diff --git a/labs/submission5.md b/labs/submission5.md new file mode 100644 index 000000000..35627cd23 --- /dev/null +++ b/labs/submission5.md @@ -0,0 +1,75 @@ + +## Task 1. + +![[Pasted image 20260305150107.png]] + +**Параллельно идет курс компарча, поэтому VirtualBox был предустановлен.** + + Версия VirtualBox: 7.2.4 + Версия ОС: Windows 11 Pro + Проблем не возникло + +--- + +## Task 2. + +### 2.1 Конфигурация виртуальной машины + +- **RAM:** 4 ГБ +- **Storage:** 25 ГБ +- **CPU cores:** 2 + +--- +### 2.2 Системная информация + +**lscpu** - показывает информацию о процессоре + + Architecture: x86_64 + CPU(s): 2 + Model name: 12th Gen Intel(R) Core(TM) i5-12450H + Core(s) per socket: 2 + Hypervisor vendor: KVM + Virtualization type: full + +**free -h** - показывает использование оперативной памяти + + total used free shared buff/cache available + Mem: 3.8Gi 1.1Gi 1.4Gi 32Mi 1.6Gi 2.7Gi + Swap: 0B 0B 0B + +**ip a** - показывает сетевые интерфейсы и IP-адреса + + 1: lo: + inet 127.0.0.1/8 scope host lo + 2: enp0s3: + inet 10.0.2.15/24 scope global dynamic enp0s3 + inet6 fe80::a00:27ff:fe28:f96e/64 scope link + +**df -h** - показывает использование дискового пространства + + Filesystem Size Used Avail Use% Mounted on + /dev/sda2 25G 5.5G 18G 24% / + tmpfs 392M 1.7M 390M 1% /run + +**lsblk** - показывает структуру дисков и разделов + + NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS + sda 8:0 0 25G 0 disk + ├─sda1 8:1 0 1M 0 part + └─sda2 8:2 0 25G 0 part / + +**lsb_release -a** - показывает информацию о версии Ubuntu + + Distributor ID: Ubuntu + Description: Ubuntu 24.04.4 LTS + Release: 24.04 + Codename: noble + +**uname -a** - показывает информацию о ядре системы + + Linux Intro-DevOps 6.17.0-14-generic #14~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC x86_64 GNU/Linux + +**systemd-detect-virt** - определяет тип виртуализации + + oracle +--- diff --git a/labs/submission6.md b/labs/submission6.md new file mode 100644 index 000000000..f35a5aed8 --- /dev/null +++ b/labs/submission6.md @@ -0,0 +1,94 @@ +## Task 1. + +``` +docker ps -a +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + +docker images ubuntu +REPOSITORY TAG IMAGE ID CREATED SIZE +ubuntu latest d1e2e92c075e 4 weeks ago 117MB + +root@a4231379eded:/# ps aux +USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND +root 1 0.0 0.0 4588 3584 pts/0 Ss 13:01 0:00 /bin/bash +root 10 0.0 0.1 7888 3968 pts/0 R+ 13:02 0:00 ps aux + +ls ubuntu_image.tar +Каталог: C:\Users\Георгий +Mode LastWriteTime Length Name +---- ------------- ------ ---- +-a---- 12.03.2026 16:03 29745152 ubuntu_image.tar + +docker rmi ubuntu:latest +Error response from daemon: conflict: unable to delete ubuntu:latest (must be forced) - container a4231379eded is using its referenced image d1e2e92c075e +``` +Докер не дает удалить образ, так как контейнер от него зависит. Контейнер использует образ в качестве базового слоя файловой системы. Удаление образа приведет к поломке контейнера. + +## Task 2. + +![[lab6_1.png]] +C - изменено +A - добавлено +D - удалено +Делал со второй попытки, поэтому только изменения + +``` +docker diff my_website_container +C /etc +C /etc/nginx +C /etc/nginx/conf.d +C /etc/nginx/conf.d/default.conf +C /run +C /run/nginx.pid +``` + +docker commit - быстрый способ создания образов, невозможно воспроизвести результат, нет контроля версий. +Dockerfile - обеспечивает воспроизводимые сборки и контроль версий. + +## Task 3. + +``` +docker exec container1 ping -c 3 container2 +PING container2 (172.18.0.3): 56 data bytes +64 bytes from 172.18.0.3: seq=0 ttl=64 time=1.374 ms +64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.086 ms +64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.173 ms + +docker exec container1 nslookup container2 +Server: 127.0.0.11 +Address: 127.0.0.11:53 + +Non-authoritative answer: + +Non-authoritative answer: +Name: container2 +Address: 172.18.0.3 + +"Containers": { + "a1bab7011a46cace217e26296a84472767aeedd8725c00073c4161a2f0891344": { + "Name": "container1", + "EndpointID": "f69a4bdd81b2e2147a31bc68f5bd8afb371234d4c34a228ae4f83b677f0c2304", + "MacAddress": "52:28:b8:af:c2:c6", + "IPv4Address": "172.18.0.2/16", + "IPv6Address": "" + }, + "edd771d7d8546d7525829c52f7465dc276db77372aba50829e576824af2dc9d4": { + "Name": "container2", + "EndpointID": "5268a8c494579e9b8cb63956e0666dde02eb9053ac17220259691e415040e28f", + "MacAddress": "fa:3f:61:a5:08:3d", + "IPv4Address": "172.18.0.3/16", + "IPv6Address": "" +``` +Docker предоставляет DNS-сервер для пользовательских сетей. +Преимущества пользовательских мостовых сетей: +- лучшая изоляция контейнеров +- упрощенное обнаружение сервисов + +## Task 4. + +![[lab6_2.png]] + +Docker volumes позволяют хранить данные вне контейнера, поэтому данные сохраняются даже при повторном создании контейнера. +**volumes** - хранятся во внутренних каталогах Docker. +**bind mounts** - связывание каталога хоста с каталогом контейнера. +**container storage** - внутренние хранилище контейнера, удаляется при удалении контейнера. \ No newline at end of file diff --git a/labs/submission7.md b/labs/submission7.md new file mode 100644 index 000000000..6772fa959 --- /dev/null +++ b/labs/submission7.md @@ -0,0 +1,123 @@ +## Task 1. + +``` +/mnt/c/Users/Георгий/gitops-lab7$ ls +current-state.txt desired-state.txt + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/gitops-lab7$ cat desired-state.txt +version: 1.0 +app: myapp +replicas: 3 + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/gitops-lab7$ cat current-state.txt +version: 1.0 +app: myapp +replicas: 3 + +./reconcile.sh +Thu Mar 19 21:57:36 MSK 2026 - ⚠️ DRIFT DETECTED! +Reconciling current state with desired state... +Thu Mar 19 21:57:36 MSK 2026 - ✅ Reconciliation complete +``` + +Цикл согласования непрерывно сравнивает желаемое и текущее состояние. При обнаружении отклонения он автоматически восстанавливает правильную конфигурацию. +Декларативный подход безопаснее, обеспечивает повторяемость и позволяет автоматизировать процессы, подобно самовосстанавливающимся системам. + +![[lab7_1.png]] + +## Task 2. +``` +nano healthcheck.sh + +chmod +x healthcheck.sh + +./healthcheck.sh +Thu Mar 19 22:17:01 MSK 2026 - ✅ OK: States synchronized + +cat health.log +Thu Mar 19 22:17:01 MSK 2026 - ✅ OK: States synchronized + +echo "hack: true" >> current-state.txt + +./healthcheck.sh +Thu Mar 19 22:17:25 MSK 2026 - ❌ CRITICAL: State mismatch detected! + Desired MD5: a15a1a4f965ecd8f9e23a33a6b543155 + Current MD5: d89d00cb648345e04af5f1020f16c49f + +cat health.log +Thu Mar 19 22:17:01 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:17:25 MSK 2026 - ❌ CRITICAL: State mismatch detected! + Desired MD5: a15a1a4f965ecd8f9e23a33a6b543155 + Current MD5: d89d00cb648345e04af5f1020f16c49f + +./reconcile.sh +Thu Mar 19 22:17:40 MSK 2026 - ⚠️ DRIFT DETECTED! +Reconciling current state with desired state... +Thu Mar 19 22:17:40 MSK 2026 - ✅ Reconciliation complete + +./healthcheck.sh +Thu Mar 19 22:17:44 MSK 2026 - ✅ OK: States synchronized + +cat health.log +Thu Mar 19 22:17:01 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:17:25 MSK 2026 - ❌ CRITICAL: State mismatch detected! + Desired MD5: a15a1a4f965ecd8f9e23a33a6b543155 + Current MD5: d89d00cb648345e04af5f1020f16c49f +Thu Mar 19 22:17:44 MSK 2026 - ✅ OK: States synchronized + +nano monitor.sh + +chmod +x monitor.sh + +./monitor.sh +Starting GitOps monitoring... +\n--- Check #1 --- +Thu Mar 19 22:19:39 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:39 MSK 2026 - ✅ States synchronized +\n--- Check #2 --- +Thu Mar 19 22:19:42 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:42 MSK 2026 - ✅ States synchronized +\n--- Check #3 --- +Thu Mar 19 22:19:45 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:45 MSK 2026 - ✅ States synchronized +\n--- Check #4 --- +Thu Mar 19 22:19:48 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:48 MSK 2026 - ✅ States synchronized +\n--- Check #5 --- +Thu Mar 19 22:19:51 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:51 MSK 2026 - ✅ States synchronized +\n--- Check #6 --- +Thu Mar 19 22:19:54 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:54 MSK 2026 - ✅ States synchronized +\n--- Check #7 --- +Thu Mar 19 22:19:57 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:57 MSK 2026 - ✅ States synchronized +\n--- Check #8 --- +Thu Mar 19 22:20:00 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:20:00 MSK 2026 - ✅ States synchronized +\n--- Check #9 --- +Thu Mar 19 22:20:03 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:20:03 MSK 2026 - ✅ States synchronized +\n--- Check #10 --- +Thu Mar 19 22:20:06 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:20:06 MSK 2026 - ✅ States synchronized + +cat health.log +Thu Mar 19 22:17:01 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:17:25 MSK 2026 - ❌ CRITICAL: State mismatch detected! + Desired MD5: a15a1a4f965ecd8f9e23a33a6b543155 + Current MD5: d89d00cb648345e04af5f1020f16c49f +Thu Mar 19 22:17:44 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:39 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:42 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:45 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:48 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:51 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:54 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:19:57 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:20:00 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:20:03 MSK 2026 - ✅ OK: States synchronized +Thu Mar 19 22:20:06 MSK 2026 - ✅ OK: States synchronized +``` +Контрольные суммы MD5 позволяют быстро сравнивать содержимое файлов, что делает обнаружение дрейфа надежным. +Аналогично функции ArgoCD Sync Status, где система сравнивает желаемое состояние Git с состоянием работающего кластера и сообщает о рассинхронизации или синхронизации. diff --git a/labs/submission8.md b/labs/submission8.md new file mode 100644 index 000000000..f8a4bcea1 --- /dev/null +++ b/labs/submission8.md @@ -0,0 +1,54 @@ +## Task 1. + +CPU +![[cpu.png.png]] + +Memory![[io.png.png]] + +I/O +![[memory.png.png]]``` +``` +df -h + +Filesystem Size Used Avail Use% Mounted on +none 1.9G 0 1.9G 0% /usr/lib/modules/6.6.87.2-microsoft-standard-WSL2 +none 1.9G 4.0K 1.9G 1% /mnt/wsl +drivers 117G 113G 3.9G 97% /usr/lib/wsl/drivers +/dev/sdd 1007G 2.0G 954G 1% / +none 1.9G 76K 1.9G 1% /mnt/wslg +none 1.9G 0 1.9G 0% /usr/lib/wsl/lib +rootfs 1.9G 2.7M 1.9G 1% /init +none 1.9G 532K 1.9G 1% /run +none 1.9G 0 1.9G 0% /run/lock +none 1.9G 0 1.9G 0% /run/shm +none 1.9G 76K 1.9G 1% /mnt/wslg/versions.txt +none 1.9G 76K 1.9G 1% /mnt/wslg/doc +C:\ 117G 113G 3.9G 97% /mnt/c +D:\ 10G 7.8G 2.3G 78% /mnt/d +Z:\ 350G 250G 101G 72% /mnt/z +tmpfs 1.9G 16K 1.9G 1% /run/user/1000 + +sudo find /var -type f -exec du -h {} + | sort -rh | head -n 3 + +70M /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_noble_universe_binary-amd64_Packages +60M /var/cache/apt/srcpkgcache.bin +60M /var/cache/apt/pkgcache.bin +``` + +Анализируется wsl, а он не нагружен. Windows процессы не учитываются. +Как оптимизировать: +- лишние процессы +- очистить логи + +--- +## Task 2. + +Выбранный сайт - https://github.com + +![[check.png]] + +![[browser.png]] + +Проверка подтверждает, что главная страница GitHub загружается корректно. +- Проверяет, что заголовок страницы содержит слово "GitHub" +- Проверяет, что кнопка/ссылка "Sign in" видима на странице \ No newline at end of file diff --git a/labs/submission9.md b/labs/submission9.md new file mode 100644 index 000000000..e7af1558d --- /dev/null +++ b/labs/submission9.md @@ -0,0 +1,27 @@ +![[9-1.png]]![[9-2.png]] + +Не определена политика безопасности контента (CSP). Это делает его уязвимым для атак межсайтового скриптинга (XSS), поскольку браузер не ограничивает, какие скрипты могут быть выполнены. +Допускаются небезопасные запросы. +Отсутствуют следующие заголовки: +- Content-Security-Policy +- Cross-Origin-Embedder-Policy +- Правильная конфигурация CORS +Эти заголовки важны, поскольку они защищают от XSS, утечек данных и междоменных атак. + +--- + +## Task 2. + +![[9-3.png]] + +**Уязвимые пакеты:** + crypto-js — CVE-2023-46233 + handlebars — CVE-2026-33937 + +**Наиболее распространенная проблема:** +Устаревшие пакеты с известными CVE + +--- + +Сканирование помогает обнаружить уязвимости до развертывания. +Необходимо сканирование ZAP и Trivy в конвейере для блокировки небезопасных сборок. \ No newline at end of file diff --git a/memory.png.png b/memory.png.png new file mode 100644 index 000000000..12cae7bf1 Binary files /dev/null and b/memory.png.png differ diff --git a/pict_1.png b/pict_1.png new file mode 100644 index 000000000..cb6b07c7c Binary files /dev/null and b/pict_1.png differ diff --git a/submission12.md b/submission12.md new file mode 100644 index 000000000..5300122c5 --- /dev/null +++ b/submission12.md @@ -0,0 +1,48 @@ +## Task 1. + +![[12-1.png]] + +Один и тот же файл main.go работает в трех режимах: +- Режим командной строки (CLI) через MODE=once +- HTTP-сервер (создание локального сайта) +- Режим WAGI (WAGI) через определение REQUEST_METHOD + +## Task 2. + +![[12-2.png]] + +``` +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab12$ docker stats test-traditional --no-stream + +CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS +96b048d87f66 test-traditional 0.00% 1.16MiB / 3.679GiB 0.03% 1.17kB / 126B 0B / 0B 5 +``` + +``` +REPOSITORY TAG IMAGE ID CREATED SIZE +moscow-time-traditional latest 9fcc57c07c20 2 minutes ago 6.79MB + + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab12$ docker image inspect moscow-time-traditional --format '{{.Size}}' | \ + +awk '{print $1/1024/1024 " MB"}' +1.97717 MB + + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab12$ for i in {1..5}; do + /usr/bin/time -f "%e" docker run --rm -e MODE=once moscow-time-traditional 2>&1 | tail -n 1 +done | awk '{sum+=$1; count++} END {print "Average:", sum/count, "seconds"}' + +Average: 0.388 seconds + + +georgiy@DESKTOP-QL0CRI2:/mnt/c/Users/Георгий/DevOps-Intro/labs/lab12$ docker run --rm --name test-traditional -p 8080:8080 moscow-time-traditional +2026/04/26 18:32:11 Server starting on :8080 +``` + + 4.5 mb (moscow-time-traditional) - бинаарный + docker images: 6.79 mb - образ + docker inspect: 1.98 mb - образ + 0.388с время запуска + + 1.16mb - docker stats diff --git a/test.txt b/test.txt new file mode 100644 index 000000000..418a98ced Binary files /dev/null and b/test.txt differ