diff options
| -rw-r--r-- | Dockerfile | 32 | ||||
| -rw-r--r-- | README.md | 45 | ||||
| -rwxr-xr-x | docker-run.sh | 62 | ||||
| -rw-r--r-- | examples/docker/email-transport.sh | 5 | ||||
| -rw-r--r-- | examples/docker/travelynx.conf | 26 | 
5 files changed, 88 insertions, 82 deletions
| @@ -1,6 +1,27 @@ -FROM debian:stretch-slim +FROM debian:buster-slim as files + +ARG travelynx_version=git + +COPY docker-run.sh /app/ +COPY index.pl /app/ +COPY lib/ /app/lib/ +COPY public/ /app/public/ +COPY templates/ /app/templates/ +COPY share/ /app/share/ + +WORKDIR /app + +RUN ln -sf ../local/imprint.html.ep templates && \ +	ln -sf ../local/privacy.html.ep templates && \ +	ln -sf ../local/travelynx.conf + +RUN sed -i "s/qx{git describe --dirty}/'${travelynx_version}'/" lib/Travelynx/Controller/Static.pm +RUN sed -i "s/\$self->plugin('Config');/\$self->plugin('Config'); \$self->config->{version} = '${travelynx_version}';/" lib/Travelynx.pm + +FROM perl:5.30-slim  ARG DEBIAN_FRONTEND=noninteractive +ARG APT_LISTCHANGES_FRONTEND=none  COPY cpanfile* /app/  WORKDIR /app @@ -32,8 +53,11 @@ RUN apt-get update && apt-get install --no-install-recommends -y \  	libxml2-dev \  	make \  	zlib1g-dev \ -	&& apt-get autoremove -y +	&& apt-get autoremove -y \ +	&& rm -rf /var/cache/apt/* /var/lib/apt/lists/* + +COPY --from=files /app/ /app/ -COPY . /app +EXPOSE 8093 -CMD ["/app/docker-run.sh"] +ENTRYPOINT ["/app/docker-run.sh"] @@ -7,6 +7,10 @@ annotated with real-time delays and service messages. At the moment, it only  supports german railways and trains which are exposed by the Deutsche Bahn  [IRIS Interface](https://finalrewind.org/projects/Travel-Status-DE-IRIS/). +You can use the public instance on [travelynx.de](https://travelynx.de) or +host your own via carton/cpanminus. Experimental Docker images are also +available. See the Setup notes below. +  Dependencies  --- @@ -14,9 +18,10 @@ Dependencies   * carton or cpanminus   * build-essential   * libpq-dev + * libxml2-dev   * git -Perl Dependencies +Installation  ---  travelynx depends on a set of Perl modules which are documented in `cpanfile`. @@ -103,6 +108,44 @@ updates automatically in the future. If you used carton for installation,  use `carton exec perl ...` in the snippet above; if you used cpanm, export  `PERL5LIB=.../local/lib/perl5`. +Setup with Docker +--- + +Note that travelynx Docker support is experimental and, in its current form, +far from best practices. Pull requests are appreciated. + +First, you need to set up a PostgreSQL database so that travelynx can store +user accounts and journeys. It must be at least version 9.4 and must use a +UTF-8 locale. See above (or `examples/docker/postgres-init.sh`) for database +initialization. You do not need to perform the `database migrate` step. + +Next, you need to prepare three files that will be mounted into the travelynx +container: travelynx configuration, e-mail configuration, and imprint and +privacy policy. For the sake of this readme, we assume that you are using the +`local/` directory to store these + +* `mkdir local` +* copy examples/travelynx.conf to local/travelynx.conf and configure it. +* copy examples/docker/email-transport.sh to local/email-transport.sh and configure it. +  The travelynx container does not contain a mail server, so it needs a +  separate SMTP server to send mail. It does not receive mail. +* create local/imprint.html.ep and enter imprint as well as privacy policy data. +* Configure your web server to reverse-provy requests to the travelynx +  instance. See `examples/nginx-site` for an nginx config. + +travelynx consists of two runtimes: the web application and a background +worker. Your service supervisor (or docker compose / docker stack / kubernetes +setup) should orchestrate them somewhere along these lines. + +* `docker pull derfnull/travelynx:latest` +* Start web application: `docker run -p 8093:8093 -v ${PWD}/local:/local:ro travelynx:latest` +* Wait until localhost:8093 responds to requests +* Start worker: `docker run -v ${PWD}/local:/local:ro travelynx:latest worker` + +To install an update: stop worker and web application, update the travelynx +image, and start them again. Database migrations will be performed +automatically. Note that downgrades are not supported. +  Usage  --- diff --git a/docker-run.sh b/docker-run.sh index c6746c3..a75d5a0 100755 --- a/docker-run.sh +++ b/docker-run.sh @@ -1,62 +1,22 @@ -#!/bin/bash +#!/bin/sh  #  # Copyright (C) Markus Witt +# Copyright (C) Daniel Friesel  #  # SPDX-License-Identifier: CC0-1.0 -set -eu -WAIT_DB_HOST=${TRAVELYNX_DB_HOST} -WAIT_DB_PORT=5432 +set -e -check_config() { -	if [ ! -f travelynx.conf ] -	then -		echo "The configuration file is missing" -		exit 1 -	fi	 -} - -wait_for_db() { -	set +e -	for i in $(seq 1 ${WAIT_DB_TIMEOUT:-5}) -	do -		(echo >/dev/tcp/${WAIT_DB_HOST}/${WAIT_DB_PORT}) &>/dev/null -		if [ $? -eq 0 ]; then -		    break -		else -			echo "Can't reach DB @ ${WAIT_DB_HOST}:${WAIT_DB_PORT}" -		fi -		sleep 1 -	done -	set -e -} - -run_app() { -	if [ \ -		"${TRAVELYNX_MAIL_DISABLE:-0}" -eq 0 \ -		-a "${TRAVELYNX_MAIL_HOST:-unset}" != "unset" \ -	] -	then -		export EMAIL_SENDER_TRANSPORT=SMTP -		export EMAIL_SENDER_TRANSPORT_HOST=${TRAVELYNX_MAIL_HOST} -		export EMAIL_SENDER_TRANSPORT_PORT=${TRAVELYNX_MAIL_PORT:-25} -	fi - -	perl index.pl database migrate +if ! [ -r travelynx.conf ]; then +	echo "Configuration file (travelynx.conf) is missing. Did you set up the '/local' mountpoint?" +	exit 1 +fi -	exec /usr/local/bin/hypnotoad -f index.pl -} +. local/email-transport.sh -run_cron() { +if [ "$1" = worker ]; then  	exec perl index.pl worker -} - -check_config -wait_for_db - -if [ "${CRON:-0}" -ne "0" ] -then -	run_cron  fi -run_app +perl index.pl database migrate +exec hypnotoad -f index.pl diff --git a/examples/docker/email-transport.sh b/examples/docker/email-transport.sh new file mode 100644 index 0000000..c04f187 --- /dev/null +++ b/examples/docker/email-transport.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +export EMAIL_SENDER_TRANSPORT=SMTP +export EMAIL_SENDER_TRANSPORT_HOST=smtp.example.com +export EMAIL_SENDER_TRANSPORT_PORT=25 diff --git a/examples/docker/travelynx.conf b/examples/docker/travelynx.conf deleted file mode 100644 index b3dc003..0000000 --- a/examples/docker/travelynx.conf +++ /dev/null @@ -1,26 +0,0 @@ -{ -	cache => { -		schedule => $ENV{TRAVELYNX_IRIS_CACHE} // '/var/cache/travelynx/iris', -		realtime => $ENV{TRAVELYNX_IRISRT_CACHE} // '/var/cache/travelynx/iris-rt', -	}, -	db => { -		host => $ENV{TRAVELYNX_DB_HOST} // die("Please set TRAVELYNX_DB_HOST"), -		database => $ENV{TRAVELYNX_DB_NAME} // 'travelynx', -		user => $ENV{TRAVELYNX_DB_USERNAME} // 'travelynx', -		password => $ENV{TRAVELYNX_DB_PASSWORD} // die("Please set TRAVELYNX_DB_PASSWORD"), -	}, -	hypnotoad => { -		accepts  => $ENV{TRAVELYNX_HYPNOTOAD_ACCEPTS} // 100, -		clients  => $ENV{TRAVELYNX_HYPNOTOAD_CLIENTS} // 10, -		listen   => [ $ENV{TRALELYNX_HYPNOTOAD_LISTEN} // 'http://*:8093' ], -		pid_file => '/tmp/travelynx.pid', -		workers  => $ENV{TRAVELYNX_HYPNOTOAD_WORKERS} // 2, -		spare    => $ENV{TRAVELYNX_HYPNOTOAD_SPARE} // 2, -	}, -	mail => { -		disabled => $ENV{TRAVELYNX_MAIL_DISABLE} // 0, -	}, -	secrets => [ -		$ENV{TRAVELYNX_SECRET} // die("Please set TRAVELYNX_SECRET"), -	], -}; | 
