如何使用Systemd部署和管理Python应用程序
什么是使用Systemd的部署和进程生命周期管理?
一个Python应用程序就是一个可以执行的Python脚本,它可能还依赖于一些本地的Python模块或包中的共享Python代码。
要部署一个应用程序(不一定是Python的应用),我们通常会运行某种构建过程,然后把构建的结果复制到目标机器上的一个预定目录。这个目标机器可以是我们正在开发应用的同一台机器。
如果我们这样做,就可以很方便地用systemd来管理我们的进程。我们可以写一个服务文件,里面引用一个已知位置的可执行文件。
使用venv的Python开发过程是什么?
venv
是Python 3自带的。我一直在用它来管理Python虚拟环境,作为开发过程的一部分。它有两个主要功能:
- 将一个项目所需的库安装与其他项目和操作系统隔离开来
- 提供一种方式,让我可以构建包含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-process
和cron-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-process
和bin/cron-download-process
中的库代码也应该打包成wheel吗? - 我需要在目标位置
/opt/my-python-project
中再创建一个venv
或合适的替代品吗? - 我的方法是否根本上有问题,因为项目目录结构设置有缺陷?关于目录结构和
venv
的使用,是否有更好的方法?
0 个回答
暂无回答