如何使用Systemd部署和管理Python应用程序

-5 投票
0 回答
45 浏览
提问于 2025-04-11 23:26

什么是使用Systemd的部署和进程生命周期管理?

一个Python应用程序就是一个可以执行的Python脚本,它可能还依赖于一些本地的Python模块或包中的共享Python代码。

要部署一个应用程序(不一定是Python的应用),我们通常会运行某种构建过程,然后把构建的结果复制到目标机器上的一个预定目录。这个目标机器可以是我们正在开发应用的同一台机器。

如果我们这样做,就可以很方便地用systemd来管理我们的进程。我们可以写一个服务文件,里面引用一个已知位置的可执行文件。

使用venv的Python开发过程是什么?

venv是Python 3自带的。我一直在用它来管理Python虚拟环境,作为开发过程的一部分。它有两个主要功能:

  1. 将一个项目所需的库安装与其他项目和操作系统隔离开来
  2. 提供一种方式,让我可以构建包含Python代码的共享库,这些代码应该在同一个项目的多个可执行进程之间共享

如果我展示我的项目目录结构,(2.)会更容易理解:

my-python-project/
  bin/
    webscraper-processes/
      webscraper.py
      html_processor.py
      feature_extractor.py
      database_uploader.py
      local_library/
        __init__.py
        ... other files ...
    cron-download-process/
      pycron-download-trigger.py
      downloader.py
      data-processor.py
      database_uploader_2.py
      lib_cron_download/
        __init__.py
        ... other files ...
  src/
    lib_database/
      __init__.py
      ... other files ...
    lib_kafka/
      __init__.py
      ... other files ...
  test/
    ... tests ...
  .venv/
    bin/activate
    ... other files ...
  pyproject.toml

请原谅这些稍显傻乎乎的名字,希望这个结构能让你明白我为什么这样组织项目。

  • 有多个“组”的可执行文件。每个可执行文件都是一个微服务,执行某个功能。一个可执行文件的组就是一组微服务。每组微服务执行一系列相关的操作,它们一起完成某个更高级的过程或操作。不同组的可执行文件是独立的。
  • 虽然webscraper-processcron-download-process这两个组是独立的,但它们确实共享一些公共代码。这些公共代码放在src目录下的一个或多个共享库中。
  • 任何一个组共享的代码,但不在多个组之间共享的代码,放在一个“本地”共享库中。(我并不完全相信这是个好主意,也许它也应该放在src中。)

venv有两个用途:

  • 管理和本地安装外部依赖。这包括confluent-kafka,Confluent的Kafka Python库和sqlalchemy
  • 提供一种机制,让可执行的Python脚本能够“看到”位于src目录中的共享库代码。否则,解释器只能看到当前工作目录中的代码,包括“本地”库,但看不到在两个组之间共享的“共享”库。

如果有比我现在使用的更好的方法,请告诉我。

我最近也尝试过Poetry,如果我理解正确的话,它提供了一个更方便的界面来管理虚拟环境。如果有更简单的方式来管理部署,我愿意使用其他工具,而不是venv

如何部署这个?

我还不完全明白如何部署这个并用systemd管理进程生命周期。

  • 我知道我需要选择一个部署目标。一个固定的位置,systemd可以在我为它写的服务文件中引用。
  • 我们选择/opt/my-python-project/,这个位置看起来很合理。

剩下的问题包括:

  • 我应该如何将代码“部署”到这个位置?
  • 一个简单的方法是复制cp -r my-python-project/bin /opt/my-python-project/
  • 但这并不包括src下的共享库代码。
  • 我怀疑共享库代码应该打包成一个wheel,然后将这个wheel复制到/opt/my-python-project/dist/,然后安装到/opt/my-python-project/中的某个venv里?
  • bin/webscraper-processbin/cron-download-process中的库代码也应该打包成wheel吗?
  • 我需要在目标位置/opt/my-python-project中再创建一个venv或合适的替代品吗?
  • 我的方法是否根本上有问题,因为项目目录结构设置有缺陷?关于目录结构和venv的使用,是否有更好的方法?

0 个回答

暂无回答

撰写回答