Update docker setup. It's simple, and it works, but it's not best practice

Closes #4
This commit is contained in:
Daniel Friesel 2022-02-19 16:32:34 +01:00
parent 4233dd1d73
commit 8ec78343e7
No known key found for this signature in database
GPG key ID: 100D5BFB5166E005
5 changed files with 91 additions and 85 deletions

View file

@ -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 DEBIAN_FRONTEND=noninteractive
ARG APT_LISTCHANGES_FRONTEND=none
COPY cpanfile* /app/ COPY cpanfile* /app/
WORKDIR /app WORKDIR /app
@ -32,8 +53,11 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
libxml2-dev \ libxml2-dev \
make \ make \
zlib1g-dev \ zlib1g-dev \
&& apt-get autoremove -y && apt-get autoremove -y \
&& rm -rf /var/cache/apt/* /var/lib/apt/lists/*
COPY . /app COPY --from=files /app/ /app/
CMD ["/app/docker-run.sh"] EXPOSE 8093
ENTRYPOINT ["/app/docker-run.sh"]

View file

@ -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 supports german railways and trains which are exposed by the Deutsche Bahn
[IRIS Interface](https://finalrewind.org/projects/Travel-Status-DE-IRIS/). [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 Dependencies
--- ---
@ -14,9 +18,10 @@ Dependencies
* carton or cpanminus * carton or cpanminus
* build-essential * build-essential
* libpq-dev * libpq-dev
* libxml2-dev
* git * git
Perl Dependencies Installation
--- ---
travelynx depends on a set of Perl modules which are documented in `cpanfile`. 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 use `carton exec perl ...` in the snippet above; if you used cpanm, export
`PERL5LIB=.../local/lib/perl5`. `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 Usage
--- ---

View file

@ -1,62 +1,22 @@
#!/bin/bash #!/bin/sh
# #
# Copyright (C) Markus Witt # Copyright (C) Markus Witt
# Copyright (C) Daniel Friesel
# #
# SPDX-License-Identifier: CC0-1.0 # SPDX-License-Identifier: CC0-1.0
set -eu
WAIT_DB_HOST=${TRAVELYNX_DB_HOST} set -e
WAIT_DB_PORT=5432
check_config() { if ! [ -r travelynx.conf ]; then
if [ ! -f travelynx.conf ] echo "Configuration file (travelynx.conf) is missing. Did you set up the '/local' mountpoint?"
then
echo "The configuration file is missing"
exit 1 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
exec /usr/local/bin/hypnotoad -f index.pl
}
run_cron() {
exec perl index.pl worker
}
check_config
wait_for_db
if [ "${CRON:-0}" -ne "0" ]
then
run_cron
fi fi
run_app . local/email-transport.sh
if [ "$1" = worker ]; then
exec perl index.pl worker
fi
perl index.pl database migrate
exec hypnotoad -f index.pl

View file

@ -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

View file

@ -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"),
],
};