Yes.
This is a slighty simplified instance script we are running:
[instance]
blob-storage= $(BLOB_STORAGE)
client-home= $(CLIENT_HOME)
debug-mode= off
deprecation-warnings= off
eggs= ftw.raven
munin.plone
munin.zope
psycopg2
python-memcached
RelStorage
relstorage-packer
...
environment-vars= zope_i18n_compile_mo_files true
PYTHON_EGG_CACHE $(CLIENT_HOME)/.python-eggs
MEMCACHED_PDB $(MEMCACHED_CONN_PDB)
MEMCACHED_MEMOIZE $(MEMCACHED_CONN_MEMOIZE)
PDB_HOSTNAME $(PDB_HOSTNAME)
PDB_USERNAME $(PDB_USERNAME)
PDB_PASSWORD $(PDB_PASSWORD)
PDB_DATABASE $(PDB_DATABASE)
SOLR $(SOLR_CONN)
RAVEN_DSN $(RAVEN_DSN)
RAVEN_TAGS {"deployment": "$(RAVEN_DEPLOYMENT)"}
event-log= disable
http-address= 0.0.0.0:$(INSTANCE_PORT)
http-fast-listen= off
http-force-connection-close= on
lock-file= $(CLIENT_HOME)/instance_$(INSTANCE_PORT).lock
pid-file= $(CLIENT_HOME)/instance_$(INSTANCE_PORT).pid
recipe= plone.recipe.zope2instance
rel-storage= type postgresql
dsn $(RELSTORAGE_DSN)
keep-history false
shared-blob-dir true
blob-dir $(BLOB_STORAGE)
blob-cache-size 512mb
cache-local-mb 0
cache-prefix zodb_xxx_website
cache-module-name memcache
cache-servers $(MEMCACHED_CONN_ZODB)
commit-lock-timeout 600
shared-blob= yes
user= admin:admin
verbose-security= off
z2-log= disable
zcml= munin.plone
munin.zope
zeo-client= off
zodb-cache-size= 20000
zope-conf-additional= <zodb_db empty>
# A database to create the catalog
mount-point /empty
cache-size 0
<relstorage>
keep-history false
shared-blob-dir true
blob-dir $(BLOB_STORAGE)
blob-cache-size 512mb
<postgresql>
dsn $(RELSTORAGE_DSN)
</postgresql>
</relstorage>
</zodb_db>
<zodb_db catalog>
# Catalog database
mount-point /Plone/portal_catalog:/empty/Catalog/portal_catalog
cache-size 500000
<relstorage>
keep-history false
shared-blob-dir true
blob-dir $(BLOB_STORAGE)
blob-cache-size 512mb
cache-local-mb 0
cache-prefix zodb_xxx_websitecatalog
cache-module-name memcache
cache-servers $(MEMCACHED_CONN_ZODB_CATALOG)
commit-lock-timeout 600
<postgresql>
dsn $(RELSTORAGE_DSN_CATALOG)
</postgresql>
</relstorage>
</zodb_db>
<product-config xxx.search>
ploneinstance_name Plone
exec-prefix $(INSTANCE_BINDIR)
solr.host $(SOLR_HOST)
solr.port $(SOLR_PORT)
</product-config>
%import collective.zamqp
<amqp-broker-connection>
connection_id super
hostname $(RABBITMQ_HOST)
port $(RABBITMQ_PORT)
username $(RABBITMQ_USERNAME)
password $(RABBITMQ_PASSWORD)
heartbeat 120
prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
connection_id conn_query
hostname $(RABBITMQ_HOST)
port $(RABBITMQ_PORT)
username $(RABBITMQ_USERNAME)
password $(RABBITMQ_PASSWORD)
heartbeat 120
prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
connection_id conn_structure
hostname $(RABBITMQ_HOST)
port $(RABBITMQ_PORT)
username $(RABBITMQ_USERNAME)
password $(RABBITMQ_PASSWORD)
heartbeat 120
prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
connection_id conn_properties
hostname $(RABBITMQ_HOST)
port $(RABBITMQ_PORT)
username $(RABBITMQ_USERNAME)
password $(RABBITMQ_PASSWORD)
heartbeat 120
prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<amqp-broker-connection>
connection_id conn_media
hostname $(RABBITMQ_HOST)
port $(RABBITMQ_PORT)
username $(RABBITMQ_USERNAME)
password $(RABBITMQ_PASSWORD)
heartbeat 120
prefetch_count $(RABBITMQ_PFCOUNT)
</amqp-broker-connection>
<eventlog>
level INFO
<syslog>
address 127.0.0.1:514
facility local3
format %(asctime)s ZopeApp-Server zope[%(process)s]: $(INSTANCE_PORT) [%(levelname)s] %(name)s | %(message)s
dateformat %b %d %H:%M:%S
level INFO
</syslog>
</eventlog>
<product-config munin.zope>
secret $(MUNIN_SECRET)
</product-config>
zserver-threads= ${plone:threads}
I know remember one issue though.
The generated zope.conf file has still one path reference one needs to avoid.
Since I don't run buildout on production but do a pip install dance, I can fix the generated zope.conf file with awk:
cat parts/instance/etc/zope.conf | awk '{$out = NR>1 ? $0 : "%define INSTANCEHOME $(CLIENT_HOME)"; print $out}' > build/etc/instance.xml
This replaces the first line defining a full path with
%define INSTANCEHOME $(CLIENT_HOME)
This could probably be fixed with a new feature in the instance recipe.