diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..6d84080f6 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,16 @@ +## Goal +Выполнение Lab 1 + +## Changes +- submissions/lab1.md +- .github/pull_request_template.md +- SSH signing configured + +## Testing +- go run ./app +- curl http://localhost:8080/health + +## Checklist +- [x] Title is a clear sentence +- [x] Commits are signed +- [x] submissions/lab1.md updated \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1c0a1e94b..c01e5a038 100644 --- a/.gitignore +++ b/.gitignore @@ -53,11 +53,13 @@ Thumbs.db .claude/ # NOTE: deliberately NOT ignored, because students commit them as lab evidence: -# submissions/labN.md (lab reports) -# .github/workflows/*.yml (Lab 3 CI) + submissions/labN.md (lab reports) + .github/workflows/*.yml (Lab 3 CI) # Dockerfile, compose.yaml (Lab 6) # ansible/ (Lab 7) # monitoring/ (Lab 8) # *.sbom.cdx.json, zap-*.html/json, trivy-*.txt (Lab 9 scan evidence) # flake.nix, flake.lock (Lab 11) # wasm/main.go, spin.toml, go.sum (Lab 12) + +.vagrant/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..6ef837e56 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM golang:1.24-alpine AS builder +WORKDIR /app +COPY app/ . +RUN go mod download && go build -o /tmp/qn . + +FROM alpine:latest +COPY --from=builder /tmp/qn /usr/local/bin/qn +EXPOSE 8080 +CMD ["/usr/local/bin/qn"] \ No newline at end of file diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 000000000..0bd3ee05f --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,42 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| + # Box: Ubuntu 24.04 LTS + # config.vm.box = "ubuntu/noble64" + config.vm.box = "ubuntu/jammy64" + + # Hostname + config.vm.hostname = "quicknotes-dev" + + # Port forwarding: host 18080 -> guest 8080, only localhost + config.vm.network "forwarded_port", guest: 8080, host: 18080, host_ip: "127.0.0.1" + + # Synced folder: ./app -> /home/vagrant/app + # config.vm.synced_folder "./app", "/home/vagrant/app" + config.vm.synced_folder "./app", "/home/vagrant/app", type: "rsync", rsync__auto: true, rsync__exclude: [".git/", ".vagrant/"] + + # Resources: 2 vCPU, 1024 MB RAM + config.vm.provider "virtualbox" do |vb| + vb.memory = "1024" + vb.cpus = 2 + end + + # Provisioning: install Go 1.24.x + config.vm.provision "shell", inline: <<-SHELL + apt-get update + apt-get install -y wget git + + # Install Go 1.24.4 (фиксированная версия) + wget -q https://go.dev/dl/go1.24.4.linux-amd64.tar.gz + tar -C /usr/local -xzf go1.24.4.linux-amd64.tar.gz + rm go1.24.4.linux-amd64.tar.gz + + # Add Go to PATH + echo 'export PATH=$PATH:/usr/local/go/bin' >> /home/vagrant/.bashrc + echo 'export PATH=$PATH:/usr/local/go/bin' >> /root/.bashrc + + # Verify Go installation + /usr/local/go/bin/go version + SHELL +end \ No newline at end of file diff --git a/demo.txt b/demo.txt new file mode 100644 index 000000000..ae9de80a6 --- /dev/null +++ b/demo.txt @@ -0,0 +1 @@ +NEW CHANGE FOR DEMO diff --git a/submissions/image-1.png b/submissions/image-1.png new file mode 100644 index 000000000..5dab19a5d Binary files /dev/null and b/submissions/image-1.png differ diff --git a/submissions/image-10.png b/submissions/image-10.png new file mode 100644 index 000000000..823a23cf6 Binary files /dev/null and b/submissions/image-10.png differ diff --git a/submissions/image-11.png b/submissions/image-11.png new file mode 100644 index 000000000..d454b37bd Binary files /dev/null and b/submissions/image-11.png differ diff --git a/submissions/image-12.png b/submissions/image-12.png new file mode 100644 index 000000000..d16444caa Binary files /dev/null and b/submissions/image-12.png differ diff --git a/submissions/image-13.png b/submissions/image-13.png new file mode 100644 index 000000000..546100dfb Binary files /dev/null and b/submissions/image-13.png differ diff --git a/submissions/image-14.png b/submissions/image-14.png new file mode 100644 index 000000000..177057ead Binary files /dev/null and b/submissions/image-14.png differ diff --git a/submissions/image-15.png b/submissions/image-15.png new file mode 100644 index 000000000..ac950ca71 Binary files /dev/null and b/submissions/image-15.png differ diff --git a/submissions/image-16.png b/submissions/image-16.png new file mode 100644 index 000000000..1084e9e98 Binary files /dev/null and b/submissions/image-16.png differ diff --git a/submissions/image-17.png b/submissions/image-17.png new file mode 100644 index 000000000..eca1ec8c8 Binary files /dev/null and b/submissions/image-17.png differ diff --git a/submissions/image-18.png b/submissions/image-18.png new file mode 100644 index 000000000..071039b17 Binary files /dev/null and b/submissions/image-18.png differ diff --git a/submissions/image-19.png b/submissions/image-19.png new file mode 100644 index 000000000..fd4be91c4 Binary files /dev/null and b/submissions/image-19.png differ diff --git a/submissions/image-2.png b/submissions/image-2.png new file mode 100644 index 000000000..b399189af Binary files /dev/null and b/submissions/image-2.png differ diff --git a/submissions/image-3.png b/submissions/image-3.png new file mode 100644 index 000000000..bb8e57600 Binary files /dev/null and b/submissions/image-3.png differ diff --git a/submissions/image-4.png b/submissions/image-4.png new file mode 100644 index 000000000..e08483721 Binary files /dev/null and b/submissions/image-4.png differ diff --git a/submissions/image-5.png b/submissions/image-5.png new file mode 100644 index 000000000..f06ed060b Binary files /dev/null and b/submissions/image-5.png differ diff --git a/submissions/image-6.png b/submissions/image-6.png new file mode 100644 index 000000000..ce104be0d Binary files /dev/null and b/submissions/image-6.png differ diff --git a/submissions/image-7.png b/submissions/image-7.png new file mode 100644 index 000000000..7ce499254 Binary files /dev/null and b/submissions/image-7.png differ diff --git a/submissions/image-8.png b/submissions/image-8.png new file mode 100644 index 000000000..2f6edcfbf Binary files /dev/null and b/submissions/image-8.png differ diff --git a/submissions/image-9.png b/submissions/image-9.png new file mode 100644 index 000000000..73ba8a22a Binary files /dev/null and b/submissions/image-9.png differ diff --git a/submissions/image.png b/submissions/image.png new file mode 100644 index 000000000..0d0959e1d Binary files /dev/null and b/submissions/image.png differ diff --git a/submissions/lab5.md b/submissions/lab5.md new file mode 100644 index 000000000..28b05eb6b --- /dev/null +++ b/submissions/lab5.md @@ -0,0 +1,176 @@ +# 5 lab + +Frolova AI, M25RO-01 + +a.frolova@innopolis.university + +Ссылка на PR: https://github.com/inno-devops-labs/DevOps-Intro/pull/1213 + +## Task1 - Vagrant Up + Run QuickNotes Inside + +### Vagrantfile + +Ссылка на файл: https://github.com/kicchhi/DevOps-Intro/blob/feature/lab5/Vagrantfile + +### Скриншоты + +1. vagrant ssh + +![alt text](image.png) + +2. go version + +![alt text](image-1.png) + +3. внутри виртуалки: + +![alt text](image-2.png) + +4. c хоста: + +![alt text](image-3.png) + +вместо `vagrant ssh -c 'cd /path/to/synced/app && go build -o /tmp/qn && /tmp/qn &' &` запустила внутри виртуальной машины `go run .` + +### Фрагмент vagrant up: + +![alt text](image-4.png) + +### Ответы на вопросы + +> Q: Синхронизированные папки: Vagrant поддерживает типы монтирования nfs, rsync, virtualbox и smb . Какой из них вы выбрали и почему? В чем компромисс? + +> A: Мной был выбран virtualbox, потому что на win он работает из коробки без дополнительных настроек. Другие типы монтирования требуют дополнительных заморочек в настройке и запуске. + +--- + +> Q: NAT, Bridged или Host-only: какой сетевой режим вы используете (по умолчанию используется Bridged, но укажите, какой именно)? Почему переадресация портов 127.0.0.1-bound безопаснее, чем использование интерфейса Bridged для выполнения задания? + +> A: Я использовала режим NAT, который позволяет хосту не видеть виртуальную машину напрямую, но при этом осуществлять связь. Переадресация портов 127.0.0.1-bound безопаснее, так как 127.0.0.1 - это локальный адрес, то есть сервер доступен только с этого компьютера, а не всей сети, и как раз это исключает какой-либо доступ извне. Bridgе (мост) это связь напрямую между двумя хостами. + +--- + +> Q: Варианты подготовки: Vagrant поддерживает shell, ansible, ansible_local, puppet, chef, … какой из них вы выбрали для установки Go и почему? + +> A: я выбрала shell, так как, опять же, это один из самых простых вариантов для меня. Я описала в vagrantfile все, что нужно скачать и установить, что заняло всего несколько строчек кода, без необходимости создавать дополнительные файлы или погружаться в изучение новых языков. + +--- + +> Q: Почему Go привязан к конкретной версии (1.24.5) вместо 1.24? + +> A: Ссылаться на конкретную версию - более надежный вариант, исключающий ситуацию, когда версия обновилась, и окружение уже не будет таким же, как и до этого, хотя настройки были практически идентичные. Это гарантия того, что мой код заработает у другого человека, а также избавляет от багов из-за конфликтов версий. + +## Task2 - Vagrant Up + Run QuickNotes Inside + +### 2.1 Ломаем и восстанавливаем VM + +1. VM работает (`vagrant status`): + +![alt text](image-5.png) +![alt text](image-6.png) + +2. Делаем snapshot (`vagrant snapshot save working`): + +![alt text](image-7.png) + +3. Ломаем VM (`vagrant ssh -c 'sudo rm -rf /usr/local/go'`): + +![alt text](image-8.png) + +4. Проверяем, что не работает (`vagrant ssh -c 'go version'`): + +![alt text](image-9.png) + +5. Восстанавливаю из snapshot (`vagrant snapshot restore working`): + +![alt text](image-10.png) + +6. Проверяю, что работает. + +![alt text](image-11.png) + +### 2.3 Вопросы + +> Q: Снимки состояния не являются резервными копиями. Объясните в 2–3 предложениях, почему снимки состояния бесполезны при сбоях. + +> A: Snapshot фиксирует состояние системы в момент времени и хранится на том же диске, что и сама система. Если случится такое, что диск повредится, или виртуальная машина будет случайно удалена, снимок так же удалится, и восстановить машину не удастся. + +--- + +> Q: Копирование при записи: в VirtualBox снимки состояния в Vagrant создаются с копированием при записи. Что это значит с точки зрения использования диска, если вы делаете 10 снимков состояния вместо одного? + +> A: Новый снимок сохраняет только изменения относительно предыдущей версии системы, но не полную ее копию. Если мы делаем 10 снимков состояний, это займет конечно гораздо меньше места, чем полная копия состояния системы, но все еще больше, чем сгтмлк одного состояния. + +--- + +> Q: В каких случаях создание снимков состояния является антипаттерном? (Подсказка: длинные цепочки.) + +> A: Snapshot является антипаттерном, так как длинные цепочки (такими можно считать уже длиной более трёх), во первых, занимают много пространстваю, что сильно замедляет работу и увеличивает время восстановления. К тому же, если один снимок в цепочке повредится, то можно считать поврежденной всю цепочку, и она будет непригодна для использования. Поэтому лучше все же делать нормальные бекапы. + + +## Bonus + +## 1 Часть - запуск Virtual Box + +### 1.1 Время холодной загрузки + +![alt text](image-12.png) + +### 1.2 Оперативная память VM в простое + +![alt text](image-13.png) + +### 1.3 Количество процессов + +![alt text](image-14.png) + +### 1.4 Объем памяти + +![alt text](image-15.png) + +## 2 Часть - Docker + +### 2.1 Время загрузки + +![alt text](image-16.png) + +### 2.2 RAM + +![alt text](image-17.png) + +### 2.3 Количество процессов + +![alt text](image-18.png) + +### 2.4 Размер образа + +![alt text](image-19.png) + +--- + +## Сравнительная таблица + +| Dimension | Vagrant VM | Docker container | +|-----------|-----------|------------------| +| Cold start | 5m17s | 0.733s | +| Idle RAM | 163Mi | 2.734MiB | +| On-disk size | 3.3G | 26.5MB | +| Process count | 105 | 2 | + +## Ответы на вопросы + +> Q: Какие цифры вас удивили? + +> A: Меня сильно удивила разница во времени запуска, Vagrant поднимался очень долго, в сравнении с Docker. По сравнительной таблице видно, что Docker оказался лучше по показателям, однако, учитывая, сколько времени я потратила на то, чтобы устранить ошибки docker, wsl и ubuntu (которые не устанавливались, пока я не перебрала кучу системных настроек), работа с Vagrant VM была менее болезненной. + +--- + +> Q: Для каких рабочих нагрузок подходит та или иная модель? + +> A: VM подходит для тяжелых приложений по типу баз данных, систем с жесткими требованиями к изоляции, а также приложений, которым нужно свое ядро или какие-то особенные драйверы. Контейнеры хорошо подойдут для микросервисов, CI-CD пайплайнов, которые должны запускаться за секунды (а мы уже увидели, что docker выигрывает) + +--- + +> Q: Что говорят эти данные о том, почему в эпоху 2014–2020 годов контейнеры стали лучшим решением для микросервисов без сохранения состояния? + +> A: Ключевое преимущество контейнеров в том, что они легче, быстрее и экономичнее. В эпоху микросервисов и облачных платформ скорость развёртывания и масштабирования стала критически важной. Контейнеры позволяют запускать сотни экземпляров приложения на одном хосте, тогда как VM в этом проигрывают. Именно эта эффективность сделала контейнеры стандартом для stateless приложений.