mirror of
https://github.com/senaite/senaite.docker.git
synced 2024-09-20 06:56:03 +08:00
first commit
This commit is contained in:
commit
2fa54216bf
68
1.3.1/Dockerfile
Normal file
68
1.3.1/Dockerfile
Normal file
|
@ -0,0 +1,68 @@
|
|||
# Use an official Python runtime as a parent image
|
||||
FROM python:2.7-stretch
|
||||
|
||||
# Set one or more individual labels
|
||||
LABEL maintainer="Ramon Bartl"
|
||||
LABEL email="rb@ridingbytes.com"
|
||||
LABEL senaite.core.version="1.3.1"
|
||||
|
||||
# Set environment variables
|
||||
ENV PLONE_MAJOR=4.3 \
|
||||
PLONE_VERSION=4.3.18 \
|
||||
PLONE_MD5=c9932e919254a2799b0e340b2ecbda9b \
|
||||
SENAITE_HOME=/home/senaite \
|
||||
SENAITE_USER=senaite \
|
||||
SENAITE_INSTANCE_HOME=/home/senaite/senaitelims \
|
||||
SENAITE_DATA=/data \
|
||||
SENAITE_FILESTORAGE=/data/filestorage \
|
||||
SENAITE_BLOBSTORAGE=/data/blobstorage
|
||||
|
||||
# Create the senaite user
|
||||
RUN useradd --system -m -d $SENAITE_HOME -U -u 500 $SENAITE_USER
|
||||
|
||||
# Create direcotries
|
||||
RUN mkdir -p $SENAITE_INSTANCE_HOME $SENAITE_FILESTORAGE $SENAITE_BLOBSTORAGE
|
||||
|
||||
# Copy the package config
|
||||
COPY packages.txt /
|
||||
|
||||
# Install package dependencies
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends $(grep -vE "^\s*#" /packages.txt | tr "\n" " ")
|
||||
|
||||
# Fetch unified installer
|
||||
RUN wget -O Plone.tgz https://launchpad.net/plone/$PLONE_MAJOR/$PLONE_VERSION/+download/Plone-$PLONE_VERSION-UnifiedInstaller.tgz \
|
||||
&& echo "$PLONE_MD5 Plone.tgz" | md5sum -c - \
|
||||
&& tar -xzf Plone.tgz \
|
||||
&& cp -rv /Plone-$PLONE_VERSION-UnifiedInstaller/base_skeleton/* $SENAITE_INSTANCE_HOME \
|
||||
&& cp -v /Plone-$PLONE_VERSION-UnifiedInstaller/buildout_templates/buildout.cfg $SENAITE_INSTANCE_HOME/buildout-base.cfg \
|
||||
&& cd $SENAITE_INSTANCE_HOME \
|
||||
&& tar -xjf /Plone-$PLONE_VERSION-UnifiedInstaller/packages/buildout-cache.tar.bz2
|
||||
|
||||
# Change working directory
|
||||
WORKDIR $SENAITE_INSTANCE_HOME
|
||||
|
||||
# Copy Buildout
|
||||
COPY bootstrap.py buildout.cfg ./
|
||||
|
||||
# Bootstrap and buildout
|
||||
RUN python bootstrap.py \
|
||||
&& bin/buildout \
|
||||
&& ln -s $SENAITE_FILESTORAGE/ var/filestorage \
|
||||
&& ln -s $SENAITE_BLOBSTORAGE/ var/blobstorage \
|
||||
&& chown -R senaite:senaite $SENAITE_HOME $SENAITE_DATA
|
||||
|
||||
# Mount external volume
|
||||
VOLUME /data
|
||||
|
||||
# Copy startup scripts
|
||||
COPY docker-initialize.py docker-entrypoint.sh /
|
||||
|
||||
# Expose instance port
|
||||
EXPOSE 8080
|
||||
|
||||
# Add instance healthcheck
|
||||
HEALTHCHECK --interval=1m --timeout=5s --start-period=1m \
|
||||
CMD nc -z -w5 127.0.0.1 8080 || exit 1
|
||||
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||
CMD ["start"]
|
210
1.3.1/bootstrap.py
Normal file
210
1.3.1/bootstrap.py
Normal file
|
@ -0,0 +1,210 @@
|
|||
##############################################################################
|
||||
#
|
||||
# Copyright (c) 2006 Zope Foundation and Contributors.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# This software is subject to the provisions of the Zope Public License,
|
||||
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
|
||||
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
|
||||
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE.
|
||||
#
|
||||
##############################################################################
|
||||
"""Bootstrap a buildout-based project
|
||||
|
||||
Simply run this script in a directory containing a buildout.cfg.
|
||||
The script accepts buildout command-line options, so you can
|
||||
use the -c option to specify an alternate configuration file.
|
||||
"""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
from optparse import OptionParser
|
||||
|
||||
__version__ = '2015-07-01'
|
||||
# See zc.buildout's changelog if this version is up to date.
|
||||
|
||||
tmpeggs = tempfile.mkdtemp(prefix='bootstrap-')
|
||||
|
||||
usage = '''\
|
||||
[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
|
||||
|
||||
Bootstraps a buildout-based project.
|
||||
|
||||
Simply run this script in a directory containing a buildout.cfg, using the
|
||||
Python that you want bin/buildout to use.
|
||||
|
||||
Note that by using --find-links to point to local resources, you can keep
|
||||
this script from going over the network.
|
||||
'''
|
||||
|
||||
parser = OptionParser(usage=usage)
|
||||
parser.add_option("--version",
|
||||
action="store_true", default=False,
|
||||
help=("Return bootstrap.py version."))
|
||||
parser.add_option("-t", "--accept-buildout-test-releases",
|
||||
dest='accept_buildout_test_releases',
|
||||
action="store_true", default=False,
|
||||
help=("Normally, if you do not specify a --version, the "
|
||||
"bootstrap script and buildout gets the newest "
|
||||
"*final* versions of zc.buildout and its recipes and "
|
||||
"extensions for you. If you use this flag, "
|
||||
"bootstrap and buildout will get the newest releases "
|
||||
"even if they are alphas or betas."))
|
||||
parser.add_option("-c", "--config-file",
|
||||
help=("Specify the path to the buildout configuration "
|
||||
"file to be used."))
|
||||
parser.add_option("-f", "--find-links",
|
||||
help=("Specify a URL to search for buildout releases"))
|
||||
parser.add_option("--allow-site-packages",
|
||||
action="store_true", default=False,
|
||||
help=("Let bootstrap.py use existing site packages"))
|
||||
parser.add_option("--buildout-version",
|
||||
help="Use a specific zc.buildout version")
|
||||
parser.add_option("--setuptools-version",
|
||||
help="Use a specific setuptools version")
|
||||
parser.add_option("--setuptools-to-dir",
|
||||
help=("Allow for re-use of existing directory of "
|
||||
"setuptools versions"))
|
||||
|
||||
options, args = parser.parse_args()
|
||||
if options.version:
|
||||
print("bootstrap.py version %s" % __version__)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
######################################################################
|
||||
# load/install setuptools
|
||||
|
||||
try:
|
||||
from urllib.request import urlopen
|
||||
except ImportError:
|
||||
from urllib2 import urlopen
|
||||
|
||||
ez = {}
|
||||
if os.path.exists('ez_setup.py'):
|
||||
exec(open('ez_setup.py').read(), ez)
|
||||
else:
|
||||
exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
|
||||
|
||||
if not options.allow_site_packages:
|
||||
# ez_setup imports site, which adds site packages
|
||||
# this will remove them from the path to ensure that incompatible versions
|
||||
# of setuptools are not in the path
|
||||
import site
|
||||
# inside a virtualenv, there is no 'getsitepackages'.
|
||||
# We can't remove these reliably
|
||||
if hasattr(site, 'getsitepackages'):
|
||||
for sitepackage_path in site.getsitepackages():
|
||||
# Strip all site-packages directories from sys.path that
|
||||
# are not sys.prefix; this is because on Windows
|
||||
# sys.prefix is a site-package directory.
|
||||
if sitepackage_path != sys.prefix:
|
||||
sys.path[:] = [x for x in sys.path
|
||||
if sitepackage_path not in x]
|
||||
|
||||
setup_args = dict(to_dir=tmpeggs, download_delay=0)
|
||||
|
||||
if options.setuptools_version is not None:
|
||||
setup_args['version'] = options.setuptools_version
|
||||
if options.setuptools_to_dir is not None:
|
||||
setup_args['to_dir'] = options.setuptools_to_dir
|
||||
|
||||
ez['use_setuptools'](**setup_args)
|
||||
import setuptools
|
||||
import pkg_resources
|
||||
|
||||
# This does not (always?) update the default working set. We will
|
||||
# do it.
|
||||
for path in sys.path:
|
||||
if path not in pkg_resources.working_set.entries:
|
||||
pkg_resources.working_set.add_entry(path)
|
||||
|
||||
######################################################################
|
||||
# Install buildout
|
||||
|
||||
ws = pkg_resources.working_set
|
||||
|
||||
setuptools_path = ws.find(
|
||||
pkg_resources.Requirement.parse('setuptools')).location
|
||||
|
||||
# Fix sys.path here as easy_install.pth added before PYTHONPATH
|
||||
cmd = [sys.executable, '-c',
|
||||
'import sys; sys.path[0:0] = [%r]; ' % setuptools_path +
|
||||
'from setuptools.command.easy_install import main; main()',
|
||||
'-mZqNxd', tmpeggs]
|
||||
|
||||
find_links = os.environ.get(
|
||||
'bootstrap-testing-find-links',
|
||||
options.find_links or
|
||||
('http://downloads.buildout.org/'
|
||||
if options.accept_buildout_test_releases else None)
|
||||
)
|
||||
if find_links:
|
||||
cmd.extend(['-f', find_links])
|
||||
|
||||
requirement = 'zc.buildout'
|
||||
version = options.buildout_version
|
||||
if version is None and not options.accept_buildout_test_releases:
|
||||
# Figure out the most recent final version of zc.buildout.
|
||||
import setuptools.package_index
|
||||
_final_parts = '*final-', '*final'
|
||||
|
||||
def _final_version(parsed_version):
|
||||
try:
|
||||
return not parsed_version.is_prerelease
|
||||
except AttributeError:
|
||||
# Older setuptools
|
||||
for part in parsed_version:
|
||||
if (part[:1] == '*') and (part not in _final_parts):
|
||||
return False
|
||||
return True
|
||||
|
||||
index = setuptools.package_index.PackageIndex(
|
||||
search_path=[setuptools_path])
|
||||
if find_links:
|
||||
index.add_find_links((find_links,))
|
||||
req = pkg_resources.Requirement.parse(requirement)
|
||||
if index.obtain(req) is not None:
|
||||
best = []
|
||||
bestv = None
|
||||
for dist in index[req.project_name]:
|
||||
distv = dist.parsed_version
|
||||
if _final_version(distv):
|
||||
if bestv is None or distv > bestv:
|
||||
best = [dist]
|
||||
bestv = distv
|
||||
elif distv == bestv:
|
||||
best.append(dist)
|
||||
if best:
|
||||
best.sort()
|
||||
version = best[-1].version
|
||||
if version:
|
||||
requirement = '=='.join((requirement, version))
|
||||
cmd.append(requirement)
|
||||
|
||||
import subprocess
|
||||
if subprocess.call(cmd) != 0:
|
||||
raise Exception(
|
||||
"Failed to execute command:\n%s" % repr(cmd)[1:-1])
|
||||
|
||||
######################################################################
|
||||
# Import and run buildout
|
||||
|
||||
ws.add_entry(tmpeggs)
|
||||
ws.require(requirement)
|
||||
import zc.buildout.buildout
|
||||
|
||||
if not [a for a in args if '=' not in a]:
|
||||
args.append('bootstrap')
|
||||
|
||||
# if -c was provided, we push it back into args for buildout' main function
|
||||
if options.config_file is not None:
|
||||
args[0:0] = ['-c', options.config_file]
|
||||
|
||||
zc.buildout.buildout.main(args)
|
||||
shutil.rmtree(tmpeggs)
|
118
1.3.1/buildout.cfg
Normal file
118
1.3.1/buildout.cfg
Normal file
|
@ -0,0 +1,118 @@
|
|||
[buildout]
|
||||
extends =
|
||||
buildout-base.cfg
|
||||
|
||||
extensions =
|
||||
|
||||
index = https://pypi.python.org/simple/
|
||||
|
||||
var-dir=/data
|
||||
user=admin:admin
|
||||
|
||||
effective-user = senaite
|
||||
buildout-user = senaite
|
||||
|
||||
eggs-directory = ${buildout:directory}/eggs
|
||||
download-cache=${buildout:directory}/downloads
|
||||
|
||||
parts +=
|
||||
zeo
|
||||
|
||||
eggs +=
|
||||
senaite.lims
|
||||
|
||||
[client1]
|
||||
recipe =
|
||||
|
||||
[zeo]
|
||||
<= zeoserver_base
|
||||
recipe = plone.recipe.zeoserver
|
||||
zeo-address = 8080
|
||||
|
||||
[versions]
|
||||
setuptools=
|
||||
zc.buildout=
|
||||
senaite.lims=1.3.1
|
||||
|
||||
# Picked versions
|
||||
Chameleon = 3.6.2
|
||||
Products.ATExtensions = 1.1
|
||||
Pyphen = 0.9.5
|
||||
Werkzeug = 0.15.5
|
||||
backports.functools-lru-cache = 1.5
|
||||
cairocffi = 0.9.0
|
||||
cffi = 1.12.3
|
||||
cssselect2 = 0.2.1
|
||||
html5lib = 1.0.1
|
||||
pdfrw = 0.4
|
||||
plone.recipe.command = 1.1
|
||||
plone.recipe.precompiler = 0.7.1
|
||||
senaite.core = 1.3.1
|
||||
senaite.core.listing = 1.2.0
|
||||
senaite.core.supermodel = 1.2.1
|
||||
senaite.impress = 1.2.1
|
||||
soupsieve = 1.9.2
|
||||
sourcecodegen = 0.6.14
|
||||
tinycss2 = 0.6.1
|
||||
webencodings = 0.5.1
|
||||
z3c.pt = 3.2.0
|
||||
|
||||
# Required by:
|
||||
# senaite.core==1.3.1
|
||||
Products.DataGridField = 1.9.6
|
||||
|
||||
# Required by:
|
||||
# senaite.core==1.3.1
|
||||
Products.TextIndexNG3 = 3.4.14
|
||||
|
||||
# Required by:
|
||||
# senaite.impress==1.2.1
|
||||
beautifulsoup4 = 4.8.0
|
||||
|
||||
# Required by:
|
||||
# senaite.core==1.3.1
|
||||
collective.progressbar = 0.5
|
||||
|
||||
# Required by:
|
||||
# plone.jsonapi.core==0.6
|
||||
dicttoxml = 1.7.4
|
||||
|
||||
# Required by:
|
||||
# senaite.core==1.3.1
|
||||
jarn.jsi18n = 1.1
|
||||
|
||||
# Required by:
|
||||
# senaite.core==1.3.1
|
||||
magnitude = 0.9.4
|
||||
|
||||
# Required by:
|
||||
# senaite.core==1.3.1
|
||||
plone.jsonapi.core = 0.6
|
||||
|
||||
# Required by:
|
||||
# cffi==1.12.3
|
||||
pycparser = 2.19
|
||||
|
||||
# Required by:
|
||||
# senaite.jsonapi==1.2.0
|
||||
# senaite.lims==1.3.1
|
||||
senaite.api = 1.2.3.post2
|
||||
|
||||
# Required by:
|
||||
# senaite.lims==1.3.1
|
||||
senaite.jsonapi = 1.2.0
|
||||
|
||||
# Required by:
|
||||
# senaite.core==1.3.1
|
||||
z3c.jbot = 0.8
|
||||
|
||||
# Required by:
|
||||
# plone.recipe.unifiedinstaller==4.3.2
|
||||
# plone.recipe.zeoserver==1.3.1
|
||||
# plone.recipe.zope2instance==4.4.0
|
||||
# z3c.autoinclude==0.3.7
|
||||
zc.buildout = 2.13.2
|
||||
|
||||
# Required by:
|
||||
# Products.TextIndexNG3==3.4.14
|
||||
zopyx.txng3.core = 3.6.2
|
11
1.3.1/docker-compose.yml
Normal file
11
1.3.1/docker-compose.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
version: "2"
|
||||
services:
|
||||
senaite:
|
||||
image: senaite
|
||||
volumes:
|
||||
- data:/data
|
||||
ports:
|
||||
- "8080:8080"
|
||||
|
||||
volumes:
|
||||
data:
|
56
1.3.1/docker-entrypoint.sh
Executable file
56
1.3.1/docker-entrypoint.sh
Executable file
|
@ -0,0 +1,56 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
COMMANDS="debug help logtail show stop adduser fg kill quit run wait console foreground logreopen reload shell status"
|
||||
START="start restart zeoserver"
|
||||
CMD="bin/instance"
|
||||
|
||||
gosu senaite python /docker-initialize.py
|
||||
|
||||
if [ -e "custom.cfg" ]; then
|
||||
if [ ! -e "bin/develop" ]; then
|
||||
gosu senaite buildout -c custom.cfg
|
||||
gosu senaite python /docker-initialize.py
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$1" == "zeo"* ]]; then
|
||||
CMD="bin/$1"
|
||||
fi
|
||||
|
||||
if [ -z "$HEALTH_CHECK_TIMEOUT" ]; then
|
||||
HEALTH_CHECK_TIMEOUT=1
|
||||
fi
|
||||
|
||||
if [ -z "$HEALTH_CHECK_INTERVAL" ]; then
|
||||
HEALTH_CHECK_INTERVAL=1
|
||||
fi
|
||||
|
||||
if [[ $START == *"$1"* ]]; then
|
||||
_stop() {
|
||||
gosu senaite $CMD stop
|
||||
kill -TERM $child 2>/dev/null
|
||||
}
|
||||
|
||||
trap _stop SIGTERM SIGINT
|
||||
gosu senaite $CMD start
|
||||
gosu senaite $CMD logtail &
|
||||
child=$!
|
||||
|
||||
pid=`$CMD status | sed 's/[^0-9]*//g'`
|
||||
if [ ! -z "$pid" ]; then
|
||||
echo "Application running on pid=$pid"
|
||||
sleep "$HEALTH_CHECK_TIMEOUT"
|
||||
while kill -0 "$pid" 2> /dev/null; do
|
||||
sleep "$HEALTH_CHECK_INTERVAL"
|
||||
done
|
||||
else
|
||||
echo "Application didn't start normally. Shutting down!"
|
||||
_stop
|
||||
fi
|
||||
else
|
||||
if [[ $COMMANDS == *"$1"* ]]; then
|
||||
exec gosu senaite bin/instance "$@"
|
||||
fi
|
||||
exec "$@"
|
||||
fi
|
184
1.3.1/docker-initialize.py
Executable file
184
1.3.1/docker-initialize.py
Executable file
|
@ -0,0 +1,184 @@
|
|||
#!/usr/local/bin/python
|
||||
|
||||
import re
|
||||
import os
|
||||
import warnings
|
||||
warnings.simplefilter('always', DeprecationWarning)
|
||||
|
||||
|
||||
class Environment(object):
|
||||
""" Configure container via environment variables
|
||||
"""
|
||||
def __init__(
|
||||
self,
|
||||
env=os.environ,
|
||||
zope_conf="/home/senaite/senaitelims/parts/instance/etc/zope.conf",
|
||||
custom_conf="/home/senaite/senaitelims/custom.cfg",
|
||||
zeopack_conf="/home/senaite/senaitelims/bin/zeopack",
|
||||
zeoserver_conf="/home/senaite/senaitelims/parts/zeoserver/etc/zeo.conf"):
|
||||
self.env = env
|
||||
self.zope_conf = zope_conf
|
||||
self.custom_conf = custom_conf
|
||||
self.zeopack_conf = zeopack_conf
|
||||
self.zeoserver_conf = zeoserver_conf
|
||||
|
||||
def zeoclient(self):
|
||||
""" ZEO Client
|
||||
"""
|
||||
server = self.env.get("ZEO_ADDRESS", None)
|
||||
if not server:
|
||||
return
|
||||
|
||||
config = ""
|
||||
with open(self.zope_conf, "r") as cfile:
|
||||
config = cfile.read()
|
||||
|
||||
# Already initialized
|
||||
if "<blobstorage>" not in config:
|
||||
return
|
||||
|
||||
read_only = self.env.get("ZEO_READ_ONLY", "false")
|
||||
zeo_ro_fallback = self.env.get("ZEO_CLIENT_READ_ONLY_FALLBACK", "false")
|
||||
shared_blob_dir = self.env.get("ZEO_SHARED_BLOB_DIR", "off")
|
||||
zeo_storage = self.env.get("ZEO_STORAGE", "1")
|
||||
zeo_client_cache_size = self.env.get("ZEO_CLIENT_CACHE_SIZE", "128MB")
|
||||
zeo_conf = ZEO_TEMPLATE.format(
|
||||
zeo_address=server,
|
||||
read_only=read_only,
|
||||
zeo_client_read_only_fallback=zeo_ro_fallback,
|
||||
shared_blob_dir=shared_blob_dir,
|
||||
zeo_storage=zeo_storage,
|
||||
zeo_client_cache_size=zeo_client_cache_size
|
||||
)
|
||||
|
||||
pattern = re.compile(r"<blobstorage>.+</blobstorage>", re.DOTALL)
|
||||
config = re.sub(pattern, zeo_conf, config)
|
||||
|
||||
with open(self.zope_conf, "w") as cfile:
|
||||
cfile.write(config)
|
||||
|
||||
def zeopack(self):
|
||||
""" ZEO Pack
|
||||
"""
|
||||
server = self.env.get("ZEO_ADDRESS", None)
|
||||
if not server:
|
||||
return
|
||||
|
||||
if ":" in server:
|
||||
host, port = server.split(":")
|
||||
else:
|
||||
host, port = (server, "8100")
|
||||
|
||||
with open(self.zeopack_conf, 'r') as cfile:
|
||||
text = cfile.read()
|
||||
text = text.replace('address = "8100"', 'address = "%s"' % server)
|
||||
text = text.replace('host = "127.0.0.1"', 'host = "%s"' % host)
|
||||
text = text.replace('port = "8100"', 'port = "%s"' % port)
|
||||
|
||||
with open(self.zeopack_conf, 'w') as cfile:
|
||||
cfile.write(text)
|
||||
|
||||
def zeoserver(self):
|
||||
""" ZEO Server
|
||||
"""
|
||||
pack_keep_old = self.env.get("ZEO_PACK_KEEP_OLD", '')
|
||||
if pack_keep_old.lower() in ("false", "no", "0", "n", "f"):
|
||||
with open(self.zeoserver_conf, 'r') as cfile:
|
||||
text = cfile.read()
|
||||
if 'pack-keep-old' not in text:
|
||||
text = text.replace(
|
||||
'</filestorage>',
|
||||
' pack-keep-old false\n</filestorage>'
|
||||
)
|
||||
|
||||
with open(self.zeoserver_conf, 'w') as cfile:
|
||||
cfile.write(text)
|
||||
|
||||
def buildout(self):
|
||||
""" Buildout from environment variables
|
||||
"""
|
||||
# Already configured
|
||||
if os.path.exists(self.custom_conf):
|
||||
return
|
||||
|
||||
eggs = self.env.get("PLONE_ADDONS",
|
||||
self.env.get("ADDONS", "")).strip().split()
|
||||
if not eggs:
|
||||
eggs = self.env.get("BUILDOUT_EGGS", "").strip().split()
|
||||
if eggs:
|
||||
warnings.warn(
|
||||
"BUILDOUT_EGGS is deprecated. Please use "
|
||||
"PLONE_ADDONS instead !!!", DeprecationWarning)
|
||||
|
||||
zcml = self.env.get("PLONE_ZCML",
|
||||
self.env.get("ZCML", "")).strip().split()
|
||||
if not zcml:
|
||||
zcml = self.env.get("BUILDOUT_ZCML", "").strip().split()
|
||||
if zcml:
|
||||
warnings.warn(
|
||||
"BUILDOUT_ZCML is deprecated. Please use "
|
||||
"PLONE_ZCML instead !!!", DeprecationWarning)
|
||||
|
||||
develop = self.env.get("PLONE_DEVELOP",
|
||||
self.env.get("DEVELOP", "")).strip().split()
|
||||
if not develop:
|
||||
develop = self.env.get("BUILDOUT_DEVELOP", "").strip().split()
|
||||
if develop:
|
||||
warnings.warn(
|
||||
"BUILDOUT_DEVELOP is deprecated. Please use "
|
||||
"PLONE_DEVELOP instead !!!", DeprecationWarning)
|
||||
|
||||
if not (eggs or zcml or develop):
|
||||
return
|
||||
|
||||
buildout = BUILDOUT_TEMPLATE.format(
|
||||
eggs="\n\t".join(eggs),
|
||||
zcml="\n\t".join(zcml),
|
||||
develop="\n\t".join(develop)
|
||||
)
|
||||
|
||||
with open(self.custom_conf, 'w') as cfile:
|
||||
cfile.write(buildout)
|
||||
|
||||
def setup(self, **kwargs):
|
||||
self.buildout()
|
||||
self.zeoclient()
|
||||
self.zeopack()
|
||||
self.zeoserver()
|
||||
|
||||
__call__ = setup
|
||||
|
||||
|
||||
ZEO_TEMPLATE = """
|
||||
<zeoclient>
|
||||
read-only {read_only}
|
||||
read-only-fallback {zeo_client_read_only_fallback}
|
||||
blob-dir /data/blobstorage
|
||||
shared-blob-dir {shared_blob_dir}
|
||||
server {zeo_address}
|
||||
storage {zeo_storage}
|
||||
name zeostorage
|
||||
var /home/senaite/senaitelims/parts/instance/var
|
||||
cache-size {zeo_client_cache_size}
|
||||
</zeoclient>
|
||||
""".strip()
|
||||
|
||||
|
||||
BUILDOUT_TEMPLATE = """
|
||||
[buildout]
|
||||
extends = develop.cfg
|
||||
develop += {develop}
|
||||
eggs += {eggs}
|
||||
zcml += {zcml}
|
||||
"""
|
||||
|
||||
|
||||
def initialize():
|
||||
""" Configure Plone instance as ZEO Client
|
||||
"""
|
||||
environment = Environment()
|
||||
environment.setup()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
initialize()
|
28
1.3.1/packages.txt
Normal file
28
1.3.1/packages.txt
Normal file
|
@ -0,0 +1,28 @@
|
|||
dpkg-dev
|
||||
gcc
|
||||
gosu
|
||||
libbz2-dev
|
||||
libc6-dev
|
||||
libcairo2
|
||||
libffi-dev
|
||||
libgdk-pixbuf2.0-0
|
||||
libjpeg62
|
||||
libjpeg62-turbo-dev
|
||||
libopenjp2-7
|
||||
libopenjp2-7-dev
|
||||
libpango-1.0-0
|
||||
libpangocairo-1.0-0
|
||||
libpcre3-dev
|
||||
libssl-dev
|
||||
libtiff5
|
||||
libtiff5-dev
|
||||
libxml2
|
||||
libxml2-dev
|
||||
libxslt1-dev
|
||||
libxslt1.1
|
||||
lynx
|
||||
netcat
|
||||
rsync
|
||||
wget
|
||||
wv
|
||||
zlib1g-dev
|
339
LICENSE.txt
Normal file
339
LICENSE.txt
Normal file
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{description}
|
||||
Copyright (C) {year} {fullname}
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
{signature of Ty Coon}, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
109
README.md
Normal file
109
README.md
Normal file
|
@ -0,0 +1,109 @@
|
|||
# SENAITE Docker
|
||||
|
||||
[SENAITE](https://www.senaite.com) is a free and open source LIMS built on top of
|
||||
[Plone](https://plone.org) and the [Zope application server](https://www.zope.org).
|
||||
|
||||
This repository is based [plone.docker](https://github.com/plone/plone.docker) –
|
||||
Thanks to the great work of @avoinea and the other contributors.
|
||||
|
||||
### Try SENAITE
|
||||
|
||||
Click the _Try in PWD_ button below to get 4 hours to try SENAITE LIMS:
|
||||
|
||||
NOTE: A [DockerHub](https://hub.docker.com/) account is needed.
|
||||
|
||||
**Authentication: `admin:admin`**
|
||||
|
||||
[![Try in PWD](https://cdn.rawgit.com/play-with-docker/stacks/cff22438/assets/images/button.png)](http://play-with-docker.com?stack=https://raw.githubusercontent.com/senaite/senaite.docker/master/stack.yml)
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
Choose either single Plone instance or ZEO cluster.
|
||||
|
||||
**It is inadvisable to use following configurations for production.**
|
||||
|
||||
|
||||
### Standalone SENAITE Instance
|
||||
|
||||
Standalone instances are best suited for testing SENAITE and development.
|
||||
|
||||
Download and start the latest SENAITE container, based on [Debian](https://www.debian.org/).
|
||||
|
||||
```console
|
||||
$ docker run -p 8080:8080 senaite
|
||||
```
|
||||
|
||||
This image exposes the TCP Port `8080` via `EXPOSE 8080`, so standard container
|
||||
linking will make it automatically available to the linked containers.
|
||||
|
||||
Now you can add a SENAITE Site at http://localhost:8080 - default user and
|
||||
password are **`admin/admin`**.
|
||||
|
||||
|
||||
### ZEO Cluster
|
||||
|
||||
ZEO cluster are best suited for production setups, you will **need** a loadbalancer.
|
||||
|
||||
Start ZEO server in the background
|
||||
|
||||
```console
|
||||
$ docker run -d --name=zeo senait zeo
|
||||
```
|
||||
|
||||
Start 2 SENAITE clients (also in the background)
|
||||
|
||||
```console
|
||||
$ docker run -d --name=instance1 --link=zeo -e ZEO_ADDRESS=zeo:8080 -p 8081:8080 senaite
|
||||
$ docker run -d --name=instance2 --link=zeo -e ZEO_ADDRESS=zeo:8080 -p 8082:8080 senaite
|
||||
```
|
||||
|
||||
### Start SENAITE In Debug Mode
|
||||
|
||||
You can also start Plone in debug mode (`fg`) by running
|
||||
|
||||
```console
|
||||
$ docker run -p 8080:8080 senaite fg
|
||||
```
|
||||
|
||||
Debug mode may also be used with ZEO
|
||||
|
||||
```console
|
||||
$ docker run --link=zeo -e ZEO_ADDRESS=zeo:8080 -p 8080:8080 senaite fg
|
||||
```
|
||||
|
||||
For more information on how to extend this image with your own custom settings, adding more add-ons, building it or mounting volumes, please refer to our [documentation](https://docs.plone.org/manage/docker/docs/index.html).
|
||||
|
||||
|
||||
## Supported Environment Variables
|
||||
|
||||
The Plone image uses several environment variable that allow to specify a more specific setup.
|
||||
|
||||
### For Basic Usage
|
||||
|
||||
* `ADDONS` - Customize SENAITE via Plone add-ons using this environment variable
|
||||
* `ZEO_ADDRESS` - This environment variable allows you to run Plone image as a ZEO client.
|
||||
|
||||
Run Plone with ZEO and install two addons (PloneFormGen and collective.roster)
|
||||
|
||||
```console
|
||||
$ docker run --name=instance1 --link=zeo -e ZEO_ADDRESS=zeo:8080 -p 8080:8080 \
|
||||
-e ADDONS="Products.PloneFormGen collective.roster" plone
|
||||
```
|
||||
|
||||
To use specific add-ons versions:
|
||||
|
||||
```console
|
||||
-e ADDONS="Products.PloneFormGen==1.8.5 collective.roster==2.3.1"
|
||||
```
|
||||
|
||||
### For Advanced Usage
|
||||
|
||||
* `PLONE_ZCML`, `ZCML` - Include custom Plone add-ons ZCML files (former `BUILDOUT_ZCML`)
|
||||
* `PLONE_DEVELOP`, `DEVELOP` - Develop new or existing Plone add-ons (former `BUILDOUT_DEVELOP`)
|
||||
* `ZEO_READ_ONLY` - Run Plone as a read-only ZEO client. Defaults to `off`.
|
||||
* `ZEO_CLIENT_READ_ONLY_FALLBACK` - A flag indicating whether a read-only remote storage should be acceptable as a fallback when no writable storages are available. Defaults to `false`.
|
||||
* `ZEO_SHARED_BLOB_DIR` - Set this to on if the ZEO server and the instance have access to the same directory. Defaults to `off`.
|
||||
* `ZEO_STORAGE` - Set the storage number of the ZEO storage. Defaults to `1`.
|
||||
* `ZEO_CLIENT_CACHE_SIZE` - Set the size of the ZEO client cache. Defaults to `128MB`.
|
||||
* `ZEO_PACK_KEEP_OLD` - Can be set to false to disable the creation of *.fs.old files before the pack is run. Defaults to true.
|
29
stack.yml
Normal file
29
stack.yml
Normal file
|
@ -0,0 +1,29 @@
|
|||
version: "3"
|
||||
services:
|
||||
senaite:
|
||||
image: ramonski/senaite:latest
|
||||
deploy:
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
resources:
|
||||
limits:
|
||||
cpus: "1"
|
||||
memory: 2G
|
||||
ports:
|
||||
- "8080:8080"
|
||||
networks:
|
||||
- webnet
|
||||
visualizer:
|
||||
image: dockersamples/visualizer:stable
|
||||
ports:
|
||||
- "8000:8080"
|
||||
volumes:
|
||||
- "/var/run/docker.sock:/var/run/docker.sock"
|
||||
deploy:
|
||||
placement:
|
||||
constraints: [node.role == manager]
|
||||
networks:
|
||||
- webnet
|
||||
networks:
|
||||
webnet:
|
Loading…
Reference in a new issue