Урок курса
Управление пакетами apt и запуск Python HTTP-сервиса в venv
DevOps-инженер с нуля: полный курсВ прошлом уроке мы использовали sudo, чтобы менять системные права файлов от имени администратора. Теперь эти привилегии понадобятся для установки программ в операционную систему.
1. Установка Python и вспомогательных утилит через apt
В Ubuntu программы устанавливаются и обновляются через пакетный менеджер apt. Он берёт готовые пакеты из сетевых хранилищ — репозиториев.
Перед тем как устанавливать новую программу, нужно запросить у репозиториев актуальный каталог. Для этого выполняется команда обновления списка доступных версий:
sudo apt update
Команда apt update только скачивает свежий текстовый индекс с серверов Ubuntu. Она не меняет файлы уже установленных программ и ничего не обновляет на диске сама по себе. Если пропустить этот шаг на свежей системе, apt попробует скачать устаревшие версии файлов по адресам, которых на сервере уже может не быть, и завершится с ошибкой.
Когда индекс обновлён, нужные пакеты можно установить одной командой:
sudo apt install python3 python3-venv git
Здесь перечислены три конкретных компонента:
python3— сам интерпретатор языка Python;python3-venv— системный модуль для создания изолированных сред;git— утилита контроля версий, которая понадобится для получения и отслеживания кода.
Команда apt install обращается к правам суперпользователя через sudo, запрашивает подтверждение занимаемого места на диске, скачивает нужные архивы и раскладывает исполняемые файлы по системным каталогам.
2. Изолированное виртуальное окружение venv
Если устанавливать библиотеки Python прямо в систему, со временем разные проекты начнут требовать конфликтующие версии одних и тех же файлов. Чтобы этого избежать, каждый проект запускают в изолированном виртуальном окружении — venv. Это отдельный каталог, куда копируется интерпретатор и куда устанавливаются только нужные текущему приложению зависимости.
Сначала создадим рабочую директорию проекта в домашнем каталоге и перейдём в неё:
mkdir ~/devops-demo cd ~/devops-demo
Символ ~ обозначает домашний каталог текущего пользователя, поэтому путь указывает на /home/student/devops-demo независимо от того, где именно вы находились в терминале.
Теперь создадим внутри окружение с именем .venv:
python3 -m venv .venv
Флаг -m указывает Python выполнить стандартный модуль venv как программу, а аргумент .venv задаёт имя каталога. Точка в начале делает каталог скрытым для обычного вывода ls.
Проверим, что внутри каталога появились свои исполняемые файлы:
ls -l .venv/bin
В списке будет находиться отдельный исполняемый файл python. Чтобы использовать именно его, не нужно менять настройки оболочки — достаточно запустить его по точному относительному пути .venv/bin/python.
Создадим файл приложения app.py в редакторе nano:
nano app.py
Вставьте в него предоставленный готовый код сервиса:
import argparse
import json
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/health":
status, payload = 200, {"status": "ok"}
elif self.path == "/":
status, payload = 200, {"service": "devops-demo", "version": "v1"}
else:
status, payload = 404, {"error": "not found"}
body = json.dumps(payload).encode()
self.send_response(status)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
if self.command != "HEAD":
self.wfile.write(body)
def do_HEAD(self):
self.do_GET()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--host", default="127.0.0.1")
parser.add_argument("--port", type=int, default=8000)
args = parser.parse_args()
server = ThreadingHTTPServer((args.host, args.port), Handler)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.server_close()
Сохраните файл комбинацией Ctrl+O, подтвердите имя клавишей Enter и выйдите через Ctrl+X.
Для запуска скрипта передадим его путь изолированному интерпретатору:
.venv/bin/python app.py
Такой вызов гарантирует, что программа запускается именно внутри подготовленного окружения .venv, не затрагивая системные пакеты операционной системы.
3. Сетевой интерфейс 0.0.0.0 и проброс порта
Посмотрим на терминал после предыдущей команды: курсор замер на пустой строке, а привычное приглашение ввода student@devops-lab:~$ не появляется. Наша программа перешла в режим переднего плана (foreground) и заблокировала терминал — она непрерывно ожидает сетевых подключений.
По умолчанию наш скрипт слушает адрес 127.0.0.1. Это внутренний сетевой интерфейс самой виртуальной машины (loopback). Программа с такой настройкой принимает запросы только от соседних процессов внутри этой же Ubuntu. Снаружи, через адаптер VirtualBox, к ней не достучаться: пакеты от сетевой карты гостя будут отбрасываться.
Сначала остановим текущий процесс. Нажмите сочетание клавиш Ctrl+C. Терминал сразу вернёт приглашение ввода команд.
Чтобы сервер принимал соединения с любого доступного сетевого интерфейса виртуальной машины, его нужно привязать к специальному адресу 0.0.0.0. Запустим скрипт с явными флагами адреса и порта:
.venv/bin/python app.py --host 0.0.0.0 --port 8000
Терминал снова перешёл в режим ожидания. Теперь нужно связать гостевой порт с портом вашего основного компьютера (хоста).
Не закрывая окно виртуальной машины, откройте её параметры в окне VirtualBox: выберите виртуальную машину, нажмите Settings (Настроить) → вкладка Network (Сеть) → проверьте, что выбран Adapter 1 с типом NAT, и раскройте блок Advanced (Дополнительно). Нажмите кнопку Port Forwarding (Проброс портов). Добавьте новое правило кнопкой + со следующими полями:
Name:HTTPProtocol:TCPHost IP:127.0.0.1Host Port:18000Guest IP: оставьте поле пустым (для автоматического приёма по DHCP)Guest Port:8000
Нажмите OK в окне правил и затем OK в окне настроек машины.
Теперь проверим работу сервиса. Откройте браузер на основном компьютере (в Windows) и перейдите по адресу:
http://127.0.0.1:18000/health
Браузер покажет ответ:
{"status": "ok"}
Запрос от браузера пришёл на порт 18000 хоста, VirtualBox перенаправил его через NAT на виртуальный интерфейс Ubuntu к порту 8000, а процесс Python принял его благодаря привязке к 0.0.0.0.

Вернитесь в окно терминала виртуальной машины и снова нажмите Ctrl+C. Процесс корректно завершит работу и освободит сетевой порт.
Задача 1
На новой установке Ubuntu Server команда sudo apt install python3-venv завершилась ошибкой E: Unable to locate package python3-venv. Какое действие нужно выполнить перед повторной установкой?
Задача 2
В каталоге /home/student/devops-demo создано окружение командой python3 -m venv .venv. Какой командой запустить файл app.py интерпретатором из этого окружения без активации через source?
Задача 3
В VirtualBox настроен проброс NAT 127.0.0.1:18000 -> 8000. Внутри гостевой ОС сервер запущен с аргументами --host 127.0.0.1 --port 8000. Почему при открытии http://127.0.0.1:18000/health в браузере хоста возникает ошибка соединения?
Задача 4
Сервер запущен в консоли виртуальной машины командой .venv/bin/python app.py --host 0.0.0.0 --port 8000 и блокирует терминал. Какое действие вернет управление в оболочку Bash и как это повлияет на сервис?
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
