ZC Buildout recipes for ZODB
项目描述
用于处理ZODB的食谱。
变更
3.0 (2023-02-07)
添加对Python 3.7、3.8、3.9、3.10、3.11的支持。
停止对Python < 3.7的支持。
2.0.0 (2014-02-12)
- 此版本不向后兼容
它使用ZODB,而不是ZODB3。
添加Python 3支持
从ZODB3更改为ZODB。
0.6.2 (2012-10-31)
已修复的bug
将“zope.testing”需求从安装更改为测试需求。
0.6.1 (2010-05-25)
已修复的bug
为未在存储配置中命名的存储空间生成的打包脚本不正确。
0.6.0 (2009-12-03)
新功能
现在可以通过提供值为“false”的logrotate选项来禁用日志轮转配置的生成。
增加了关于eggs选项的文档以及为什么通常不应该使用它的原因。
改进了错误处理。
已修复的bug
当使用eggs选项时,没有正确处理。
0.5.0 (2008-11-03)
新功能
您现在可以在服务器部分中指定一个名称选项,使安装的文件使用与部分名称不同的名称。
已修复的bug
在删除或重命名部分时,未删除打包的crontab文件。
0.4 (2008-02-18)
新功能
服务器配方现在尊重部署名称选项。
0.3.1 (2008-01-03)
已修复的bug
使用su的shell脚本生成不正确。
0.3 (2008-01-03)
新功能
您现在可以在打包的crontab文件中指定一个电子邮件地址,以控制错误发送的位置。
如果您使用zdaemon部分安装通用的ZEO脚本
[zdaemon] recipe = zc.recipe.egg:script eggs = zdaemon
您可以请求生成使用通用zdaemon脚本的shell脚本。这可以使更新已部署系统的软件更容易,因为特定实例的脚本不依赖于可能更改的路径,如egg名称。
已修复的bug
ZODB3及其大部分需求是配方中的虚假依赖项。这导致ZODB3使用运行buildout的Python进行安装,在某些情况下引起问题。
0.2.1 (2007-04-23)
已修复的bug
crontab和logrotate配置文件生成不正确。
0.2 (2007-04-17)
增加了对%import指令的处理。
0.1 (2007-04-13)
初始版本。
详细文档
定义ZEO存储服务器
可以使用zc.zodbrecipes:server配方来定义ZEO存储服务器。要定义存储服务器,您为服务器定义一个部分并指定配置数据。
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = server ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %import foo ... <foo> ... path /databases/Data.fs ... </foo> ... ''')
这里我们使用一个“foo”存储指定了一个最小配置。我们可以使用任何我们想要的存储类型。这里我们使用导入语句来导入定义foo部分的模式定义。任何导入都被简单地复制到生成的配置文件中。当我们运行buildout
>>> print(system(buildout), end='') # doctest: +NORMALIZE_WHITESPACE Installing server. zc.zodbrecipes: A runzeo script couldn't be found at: <BLANKLINE> '/sample-buildout/bin/runzeo' <BLANKLINE> You may need to generate a runzeo script using the zc.recipe.eggs:script recipe and the ZEO egg, or you may need to specify the location of a script using the runzeo option. <BLANKLINE> Generated script '/sample-buildout/bin/server'.
我们得到了一个警告,因为配方期望存在runzeo脚本,但我们还没有创建它。这是使用zc.recipe.egg:script配方完成的
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %import foo ... <foo> ... path /databases/Data.fs ... </foo> ... ''')>>> print(system(buildout), end='') # doctest: +ELLIPSIS Installing zodb... Generated script '/sample-buildout/bin/runzeo'... Updating server.
我们得到了两样东西。我们在parts目录中得到了一个包含ZEO和zdaemon配置文件的目录
>>> ls('parts', 'server') - zdaemon.conf - zeo.conf
让我们看看配置文件
>>> cat('parts', 'server', 'zeo.conf') %import foo <BLANKLINE> <zeo> address 8100 monitor-address 8101 transaction-timeout 300 </zeo> <BLANKLINE> <foo> path /databases/Data.fs </foo> <BLANKLINE> <eventlog> <logfile> path STDOUT </logfile> </eventlog>
我们看到我们输入的相同数据,以及添加了一个将日志记录到标准输出的eventlog部分。在生产环境中,我们将使用zdaemon的transacript日志来捕获此日志输出到一个文件中。如果我们愿意,我们可以指定自己的日志文件
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %import foo ... <foo> ... path /databases/Data.fs ... </foo> ... <eventlog> ... <logfile> ... path /var/log/zeo.log ... </logfile> ... </eventlog> ... ''')>>> print(system(buildout), end='') Uninstalling server. Updating zodb. Installing server. Generated script '/sample-buildout/bin/server'.>>> cat('parts', 'server', 'zeo.conf') %import foo <BLANKLINE> <zeo> address 8100 monitor-address 8101 transaction-timeout 300 </zeo> <BLANKLINE> <foo> path /databases/Data.fs </foo> <BLANKLINE> <eventlog> <logfile> path /var/log/zeo.log </logfile> </eventlog>
但我们还是使用默认设置
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %import foo ... <foo> ... path /databases/Data.fs ... </foo> ... ''')>>> print(system(buildout), end='') Uninstalling server. Updating zodb. Installing server. Generated script '/sample-buildout/bin/server'.
让我们看看zdaemon日志文件
>>> cat('parts', 'server', 'zdaemon.conf') <runner> daemon on directory /sample-buildout/parts/server program /sample-buildout/bin/runzeo -C /sample-buildout/parts/server/zeo.conf socket-name /sample-buildout/parts/server/zdaemon.sock transcript /sample-buildout/parts/server/zeo.log </runner> <BLANKLINE> <eventlog> <logfile> path /sample-buildout/parts/server/zeo.log </logfile> </eventlog>
我们使用zeo.conf文件运行runzeo脚本。日志和运行时文件放置在服务器部分目录中。我们使用transcript日志提供ZEO服务器日志。我喜欢使用transcript日志,因为它可以捕获程序输出,例如启动异常,这些异常不会在程序日志中捕获。
并且我们在bin目录中生成了一个控制脚本
>>> cat('bin', 'server') # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS #!/usr/local/bin/python2.4 <BLANKLINE> import sys sys.path[0:0] = [...] <BLANKLINE> <BLANKLINE> import zdaemon.zdctl <BLANKLINE> if __name__ == '__main__': sys.exit(zdaemon.zdctl.main([ '-C', '/sample-buildout/parts/server/zdaemon.conf', ]+sys.argv[1:] ))
这是一个zdaemon脚本。我们可以使用它来控制ZEO服务器进程。
指定额外的egg
您可以指定额外的eggs以供zdaemon脚本使用
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... eggs = zope.event ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %import foo ... <foo> ... path /databases/Data.fs ... </foo> ... ''')>>> print(system(buildout), end='') Uninstalling server. Updating zodb. Installing server. Generated script '/sample-buildout/bin/server'.
我们可以看到zope.event egg出现在我们bin目录中生成的控制脚本中
>>> cat('bin', 'server') # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS #!/usr/local/bin/python2.4 <BLANKLINE> import sys sys.path[0:0] = [...] <BLANKLINE> import zdaemon.zdctl <BLANKLINE> if __name__ == '__main__': sys.exit(zdaemon.zdctl.main([ '-C', '/sample-buildout/parts/server/zdaemon.conf', ]+sys.argv[1:] ))
- 注意:这是一个zdaemon脚本。如果您的ZEO服务器需要额外的eggs,例如
提供额外的存储类型或日志处理程序,它们应出现在上面的例子中的[zodb]部分,而不是[server]部分!
Unix部署支持
服务器配方与zc.recipe.deployment一起工作。特别是,如果指定了部署选项,则命名一个定义以下选项的部分或部分
- crontab-directory
crontab文件的目录。
- etc-directory
配置文件的目录。
- log-directory
日志文件的目录。
- logrotate-directory
logrotate配置文件的目录。
- rc-directory
运行控制脚本的目录。
- 运行目录
用于运行时文件的目录。
- 用户
服务器进程应该以哪个用户身份运行
让我们创建一些目录并在我们的构建配置中添加一个部署部分
>>> for d in 'cron', 'etc', 'log', 'rotate', 'rc', 'run': ... mkdir(d) ... globals()[d] = join(sample_buildout, d)>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %%import foo ... <foo> ... path /databases/Data.fs ... </foo> ... deployment = demo ... ... [demo] ... crontab-directory = %(cron)s ... etc-directory = %(etc)s ... log-directory = %(log)s ... logrotate-directory = %(rotate)s ... rc-directory = %(rc)s ... run-directory = %(run)s ... user = bob ... ''' % globals())>>> print(system(buildout), end='') Uninstalling server. Updating zodb. Installing server. Generated script '/sample-buildout/rc/demo-server'.
现在,部分目录和控制脚本将不再存在
>>> import os >>> os.path.exists(join('parts', 'server')) False >>> os.path.exists(join('bin', 'server')) False
相反,控制脚本将在rc目录中
>>> cat('rc', 'demo-server') # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS #!/usr/local/bin/python2.4 <BLANKLINE> import sys sys.path[0:0] = [...] <BLANKLINE> import zdaemon.zdctl <BLANKLINE> if __name__ == '__main__': sys.exit(zdaemon.zdctl.main([ '-C', '/sample-buildout/etc/server-zdaemon.conf', ]+sys.argv[1:] ))
运行控制脚本名称现在结合了部署名称和脚本名称。
而配置文件将在etc目录中
>>> ls('etc') - server-zdaemon.conf - server-zeo.conf
日志轮转
如果使用部署,我们还会得到一个logrotate配置文件
>>> cat('rotate', 'demo-server') /sample-buildout/log/server-zeo.log { rotate 5 weekly postrotate /sample-buildout/rc/demo-server -C /sample-buildout/etc/server-zdaemon.conf reopen_transcript endscript }
这将每周旋转一次zeo日志文件。
如果我们查看zdaemon配置文件,我们可以看到它反映了部署位置
>>> cat('etc', 'server-zdaemon.conf') <runner> daemon on directory /sample-buildout/run program /sample-buildout/bin/runzeo -C /sample-buildout/etc/server-zeo.conf socket-name /sample-buildout/run/server-zdaemon.sock transcript /sample-buildout/log/server-zeo.log user bob </runner> <BLANKLINE> <eventlog> <logfile> path /sample-buildout/log/server-zeo.log </logfile> </eventlog>
注意,使用了不同的文件名。由于部署可能(通常也是)由多个部分共享,文件名前缀为它们的部分名称。另外,请注意,部署用户已在zdaemon配置中设置。
如果您想管理自己的日志轮转,您可以在部署部分中放置“logrotate = false”以防止生成logrotate配置
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %%import foo ... <foo> ... path /databases/Data.fs ... </foo> ... deployment = demo ... ... [demo] ... logrotate = false ... crontab-directory = %(cron)s ... etc-directory = %(etc)s ... log-directory = %(log)s ... logrotate-directory = %(rotate)s ... rc-directory = %(rc)s ... run-directory = %(run)s ... user = bob ... ''' % globals())>>> print(system(buildout), end='') Uninstalling server. Updating zodb. Installing server. Generated script '/sample-buildout/rc/demo-server'.
logrotate配置文件不存在,但rc脚本仍然存在
>>> ls('rotate') >>> ls('rc') - demo-server
如果更方便的话,这可以放在[服务器]部分中
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %%import foo ... <foo> ... path /databases/Data.fs ... </foo> ... deployment = demo ... logrotate = false ... ... [demo] ... crontab-directory = %(cron)s ... etc-directory = %(etc)s ... log-directory = %(log)s ... logrotate-directory = %(rotate)s ... rc-directory = %(rc)s ... run-directory = %(run)s ... user = bob ... ''' % globals())>>> print(system(buildout), end='') Updating zodb. Updating server.
logrotate配置文件不存在,但rc脚本仍然存在
>>> ls('rotate') >>> ls('rc') - demo-server
打包cron作业
我们可以通过指定pack选项来请求定义一个cron作业来打包数据库。此选项接受5到7个值。前5个值是Unix crontab文件中定义的时间和日期字段。第六个字段是要打包的过去天数,默认为1。
让我们添加一个pack选项
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %%import foo ... <foo> ... path /databases/Data.fs ... </foo> ... deployment = demo ... pack = 1 1 * * 0 3 ... ... [demo] ... crontab-directory = %(cron)s ... etc-directory = %(etc)s ... log-directory = %(log)s ... logrotate-directory = %(rotate)s ... rc-directory = %(rc)s ... run-directory = %(run)s ... user = bob ... ''' % globals())>>> print(system(buildout+' -D'), end='') Uninstalling server. Updating zodb. Installing server. Generated script '/sample-buildout/rc/demo-server'.
现在,我们将得到一个crontab文件
>>> cat(cron, 'pack-demo-server') 1 1 * * 0 bob /sample-buildout/bin/zeopack -p 8100 -S 1 -d 3
在这个例子中,我们将每周日1:01到3天内打包数据库。
我们可以在pack选项中添加电子邮件地址。如果我们这样做,那么将在cron文件中添加一个MAILTO变量
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %%import foo ... <foo> ... path /databases/Data.fs ... </foo> ... deployment = demo ... pack = 1 1 * * 0 3 jim@zope.com ... ... [demo] ... crontab-directory = %(cron)s ... etc-directory = %(etc)s ... log-directory = %(log)s ... logrotate-directory = %(rotate)s ... rc-directory = %(rc)s ... run-directory = %(run)s ... user = bob ... ''' % globals())>>> print(system(buildout+' -D'), end='') Uninstalling server. Updating zodb. Installing server. Generated script '/sample-buildout/rc/demo-server'.>>> cat(cron, 'pack-demo-server') MAILTO=jim@zope.com 1 1 * * 0 bob /sample-buildout/bin/zeopack -p 8100 -S 1 -d 3
这会导致将电子邮件发送到指定的地址,而不是发送到crontab文件中指定的用户。
shell启动脚本
默认情况下,启动脚本是由使用zdaemon模块的Python脚本生成的。有时这很麻烦。特别是当部署软件时,生成的Python脚本可能在软件更新后损坏,因为它们包含对软件egg的引用。我们可以请求调用通用zdaemon脚本的shell脚本。shell脚本只依赖于zdaemon脚本的路径,这在更新软件时通常不会改变。
要请求shell脚本,请添加一个shell-script选项并设置为true。我们还需要生成zdaemon脚本
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb zdaemon server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [zdaemon] ... recipe = zc.recipe.egg:script ... eggs = zdaemon ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %%import foo ... <foo> ... path /databases/Data.fs ... </foo> ... deployment = demo ... pack = 1 1 * * 0 3 jim@zope.com ... shell-script = true ... ... [demo] ... crontab-directory = %(cron)s ... etc-directory = %(etc)s ... log-directory = %(log)s ... logrotate-directory = %(rotate)s ... rc-directory = %(rc)s ... run-directory = %(run)s ... user = bob ... ''' % globals())>>> print(system(buildout+' -D'), end='') Uninstalling server. Updating zodb. Installing zdaemon. Generated script '/sample-buildout/bin/zdaemon'. Installing server. zc.zodbrecipes: Generated shell script '/sample-buildout/rc/demo-server'.>>> cat('rc', 'demo-server') #!/bin/sh su bob -c \ "/sample-buildout/bin/zdaemon -C '/sample-buildout/etc/server-zdaemon.conf' $*"
名称
可以为部署和单个服务器部分指定名称。这些名称决定了生成文件的名称。
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb zdaemon server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [zdaemon] ... recipe = zc.recipe.egg:script ... eggs = zdaemon ... ... [server] ... name = Server ... recipe = zc.zodbrecipes:server ... zeo.conf = ... <zeo> ... address 8100 ... monitor-address 8101 ... transaction-timeout 300 ... </zeo> ... %%import foo ... <foo> ... path /databases/Data.fs ... </foo> ... deployment = demo ... pack = 1 1 * * 0 3 jim@zope.com ... shell-script = true ... ... [demo] ... name = Demo ... crontab-directory = %(cron)s ... etc-directory = %(etc)s ... log-directory = %(log)s ... logrotate-directory = %(rotate)s ... rc-directory = %(rc)s ... run-directory = %(run)s ... user = bob ... ''' % globals())>>> print(system(buildout+' -D'), end='') Uninstalling server. Updating zodb. Updating zdaemon. Installing server. zc.zodbrecipes: Generated shell script '/sample-buildout/rc/Demo-Server'.>>> ls(cron) - pack-Demo-Server>>> ls(etc) - Server-zdaemon.conf - Server-zeo.conf>>> ls(rotate) - Demo-Server>>> ls(rc) - Demo-Server
当您犯错误时的反馈
如果您在zeo.conf中犯了一个错误,某些错误将导致返回一个简单、有信息量的消息
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = ... nothing useful ... ''')>>> print(system(buildout+' -q'), end='') Couldn't clean up '/sample-buildout/bin/server'. While: Installing server. Error: No zeo section was defined.
如果您的zeo.conf有语法错误,您将看到有问题的文本和错误消息
>>> write('buildout.cfg', ... ''' ... [buildout] ... parts = zodb server ... ... [zodb] ... recipe = zc.recipe.egg:script ... eggs = ZEO ... ... [server] ... recipe = zc.zodbrecipes:server ... zeo.conf = <bad ... ''')>>> print(system(buildout+' -q'), end='') Couldn't clean up '/sample-buildout/bin/server'. While: Installing server. Error: malformed section start (line 1) in: <bad <BLANKLINE>
下载
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分发
zc.zodbrecipes-3.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c65111b3a9a1ef2a4f34c2af5575727eedba200241a9c24251e2d79aa9bbd699 |
|
MD5 | 0c107c4def5d1151a3d7ff676e816729 |
|
BLAKE2b-256 | e57702aeee960d582f798928d9c54cd20619206fe1f35abfaa91b7504149d7e6 |
zc.zodbrecipes-3.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5aeaef749a9fb2549e890e8f5ed4a2601fb2c01ccfbf49d7073c5444a82febd2 |
|
MD5 | 588145c427adacc744d03d90d64ee255 |
|
BLAKE2b-256 | 7210de049d9129140339b15641e14c73c3f8388ce2eaaa7a2654fbefa3fb0659 |