Урок курса

Управление пакетами 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: HTTP
  • Protocol: TCP
  • Host IP: 127.0.0.1
  • Host Port: 18000
  • Guest 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.

Связка браузера Windows, правила NAT и Python app.py в venv
Запрос к Python-сервису через NAT

Вернитесь в окно терминала виртуальной машины и снова нажмите 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 и как это повлияет на сервис?

Выберите один вариант
Без регистрации · результат не сохраняется

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку