From 81e8ecd28939b39aea2e88577db30debdcd7edc5 Mon Sep 17 00:00:00 2001 From: Glenn Date: Mon, 8 Jul 2024 22:29:41 +0200 Subject: [PATCH] fix: parse env variables --- Dockerfile | 7 ++-- README.md | 89 ++++++++++++++++++++++++++++++++----------- docker-compose.yml | 56 ++++++++++++++++----------- entrypoint-wrapper.sh | 25 ++++++------ parse-database-url.sh | 35 +++++++++++++++++ 5 files changed, 152 insertions(+), 60 deletions(-) mode change 100644 => 100755 entrypoint-wrapper.sh create mode 100755 parse-database-url.sh diff --git a/Dockerfile b/Dockerfile index abe93c6..5b36659 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,9 @@ FROM wallabag/wallabag:2.6.9 # Copy custom entrypoint script -COPY --chown=wallabag:wallabag --chmod=755 entrypoint-wrapper.sh /entrypoint-wrapper.sh +COPY --chown=root:root --chmod=755 parse-database-url.sh /usr/local/bin/parse-database-url.sh +COPY --chown=root:root --chmod=755 entrypoint-wrapper.sh /usr/local/bin/entrypoint-wrapper.sh # Set the custom entrypoint -ENTRYPOINT ["/entrypoint-wrapper.sh"] - +ENTRYPOINT ["/usr/local/bin/entrypoint-wrapper.sh"] +CMD ["wallabag"] diff --git a/README.md b/README.md index 3bd1029..23b60ec 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,71 @@ +[![Build Status](https://cicd.apps.glenux.net/api/badges/glenux-opencontainers/service-wallabag/status.svg)](https://cicd.apps.glenux.net/glenux-opencontainers/service-wallabag) + +# Wallabag + +## Setup on Dokku + +Create app + + export APP=wallabag + dokku apps:create $APP + +Setup network and domains + +Setup storage + + mkdir -p /home/data/$APP.wallabag/images + dokku storage:mount $APP /home/data/$APP.wallabag/images:/var/www/wallabag/web/assets/images + +Setup database + + dokku postgres:create $APP + dokku postgres:link $APP $APP + +Setup cache + + dokku redis:create $APP + dokku redis:link $APP $APP + +Setup configuration + + dokku config:set --no-restart $APP SYMFONY__ENV__DATABASE_DRIVER=pdo_pgsql + dokku config:set --no-restart $APP DATABASE_URL=postgresql://wallabag:wallapass@db:5432/wallabag + dokku config:set --no-restart $APP SYMFONY__ENV__DATABASE_TABLE_PREFIX="wallabag_" + dokku config:set --no-restart $APP SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1 + dokku config:set --no-restart $APP SYMFONY__ENV__FROM_EMAIL=$APP@example.com + dokku config:set --no-restart $APP SYMFONY__ENV__DOMAIN_NAME=https://your-$APP-instance.$APP.org + dokku config:set --no-restart $APP SYMFONY__ENV__SERVER_NAME="Your $APP instance" + +Setup letsencrypt + + dokku letsencrypt:set $APP email $APP@example.com + dokku letsencrypt:enable $APP + +Deploy + + git remote add dokku dokku@example.com:$APP + git push + +## Post-install + + docker compose run $APP -- exec su -c "bin/console list --env=prod" -s /bin/sh nobody + + docker compose exec $APP su -c "bin/console fos:user:create --super --env=prod" -s /bin/sh nobody + docker compose exec $APP su -c "bin/console fos:user:promote --super --env=prod" -s /bin/sh nobody + +## Setup on host -dokku apps:create wallabag + +Add cronjobs + + FROM wallabag/wallabag + +The end and, hopefully, success. + +## Reference + +* https://doc.wallabag.org/fr/developer/docker +* https://hub.docker.com/r/wallabag/wallabag/ -dokku mariadb:create wallabag_db -dokku mariadb:link wallabag_db wallabag -dokku redis:create wallabag_redis -dokku redis:link wallabag_redis wallabag -dokku config:set wallabag MYSQL_ROOT_PASSWORD=wallaroot -dokku config:set wallabag SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql -dokku config:set wallabag SYMFONY__ENV__DATABASE_HOST=$(dokku mariadb:info wallabag_db --dsn | grep '^Host=' | cut -d= -f2) -dokku config:set wallabag SYMFONY__ENV__DATABASE_PORT=3306 -dokku config:set wallabag SYMFONY__ENV__DATABASE_NAME=wallabag -dokku config:set wallabag SYMFONY__ENV__DATABASE_USER=wallabag -dokku config:set wallabag SYMFONY__ENV__DATABASE_PASSWORD=wallapass -dokku config:set wallabag SYMFONY__ENV__DATABASE_CHARSET=utf8mb4 -dokku config:set wallabag SYMFONY__ENV__DATABASE_TABLE_PREFIX="wallabag_" -dokku config:set wallabag SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1 -dokku config:set wallabag SYMFONY__ENV__FROM_EMAIL=wallabag@example.com -dokku config:set wallabag SYMFONY__ENV__DOMAIN_NAME=https://your-wallabag-instance.wallabag.org -dokku config:set wallabag SYMFONY__ENV__SERVER_NAME="Your wallabag instance" -mkdir -p /opt/wallabag/images -dokku storage:mount wallabag /opt/wallabag/images:/var/www/wallabag/web/assets/images -FROM wallabag/wallabag - diff --git a/docker-compose.yml b/docker-compose.yml index e3741b4..8a49fff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,45 +1,55 @@ +--- version: '3' + services: wallabag: - image: wallabag/wallabag + build: . + image: glenux/service-wallabag environment: - - MYSQL_ROOT_PASSWORD=wallaroot - - SYMFONY__ENV__DATABASE_DRIVER=pdo_mysql - - SYMFONY__ENV__DATABASE_HOST=db - - SYMFONY__ENV__DATABASE_PORT=3306 - - SYMFONY__ENV__DATABASE_NAME=wallabag - - SYMFONY__ENV__DATABASE_USER=wallabag - - SYMFONY__ENV__DATABASE_PASSWORD=wallapass - - SYMFONY__ENV__DATABASE_CHARSET=utf8mb4 - - SYMFONY__ENV__DATABASE_TABLE_PREFIX="wallabag_" - - SYMFONY__ENV__MAILER_DSN=smtp://127.0.0.1 - - SYMFONY__ENV__FROM_EMAIL=wallabag@example.com - - SYMFONY__ENV__DOMAIN_NAME=https://your-wallabag-instance.wallabag.org - - SYMFONY__ENV__SERVER_NAME="Your wallabag instance" + SYMFONY__ENV__DATABASE_DRIVER: pdo_pgsql + DATABASE_URL: postgresql://wallabag:wallapass@db:5432/wallabag + # SYMFONY__ENV__DATABASE_NAME: wallabag + # SYMFONY__ENV__DATABASE_USER: wallabag + # SYMFONY__ENV__DATABASE_PASSWORD: wallapass + SYMFONY__ENV__DATABASE_TABLE_PREFIX: "wallabag_" + SYMFONY__ENV__MAILER_DSN: smtp://127.0.0.1 + SYMFONY__ENV__FROM_EMAIL: wallabag@example.com + SYMFONY__ENV__DOMAIN_NAME: http://localhost:8080 + SYMFONY__ENV__FOSUSER_REGISTRATION: true + SYMFONY__ENV__FOSUSER_CONFIRMATION: false + # your-wallabag-instance.wallabag.org + SYMFONY__ENV__SERVER_NAME: "Your wallabag instance" ports: - - "80" + - "8080:80" volumes: - - /opt/wallabag/images:/var/www/wallabag/web/assets/images + - images_data:/var/www/wallabag/web/assets/images healthcheck: test: ["CMD", "wget" ,"--no-verbose", "--tries=1", "--spider", "http://localhost"] interval: 1m timeout: 3s - depends_on: - - db - - redis + db: - image: mariadb + image: postgres:latest environment: - - MYSQL_ROOT_PASSWORD=wallaroot + POSTGRES_PASSWORD: wallapass + POSTGRES_USER: wallabag + POSTGRES_DB: wallabag + volumes: - - /opt/wallabag/data:/var/lib/mysql + - db_data:/var/lib/postgresql/data healthcheck: - test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 20s timeout: 3s + redis: image: redis:alpine healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 20s timeout: 3s + +volumes: + db_data: + images_data: + diff --git a/entrypoint-wrapper.sh b/entrypoint-wrapper.sh old mode 100644 new mode 100755 index 0dfa0b7..fc85454 --- a/entrypoint-wrapper.sh +++ b/entrypoint-wrapper.sh @@ -1,16 +1,17 @@ -#!/bin/bash +#!/bin/sh +# vim: set ts=2 sw=2 et ft=bash: -# Parse DATABASE_URL -if [ -n "$DATABASE_URL" ]; then - export SYMFONY__ENV__DATABASE_DRIVER=$(echo $DATABASE_URL | sed -e 's,^\(.*\)://.*,\\1,g') - export SYMFONY__ENV__DATABASE_USER=$(echo $DATABASE_URL | sed -e 's,.*://\([^:]*\):.*,\1,g') - export SYMFONY__ENV__DATABASE_PASSWORD=$(echo $DATABASE_URL | sed -e 's,.*:.\([^@]*\)@.*,\\1,g') - export SYMFONY__ENV__DATABASE_HOST=$(echo $DATABASE_URL | sed -e 's,.*@\([^:]*\):.*,\\1,g') - export SYMFONY__ENV__DATABASE_PORT=$(echo $DATABASE_URL | sed -e 's,.*:\([^/]*\)/.*,\\1,g') - export SYMFONY__ENV__DATABASE_NAME=$(echo $DATABASE_URL | sed -e 's,.*\/\([^?]*\).*,\\1,g') -fi +eval "$(/usr/local/bin/parse-database-url.sh "${DATABASE_URL:-}" SYMFONY__ENV__DATABASE |sed -e 's/^/export /')" -# Call the original entrypoint -exec docker-php-entrypoint "$@" +# Rename variables +SYMFONY__ENV__DATABASE_PASSWORD="$SYMFONY__ENV__DATABASE_PASS" +export SYMFONY__ENV__DATABASE_PASSWORD +env +echo "=== entrypoint" +cat /entrypoint.sh + +echo "changing entrypoint..." +echo /entrypoint.sh # "$@" +exec /entrypoint.sh "$@" diff --git a/parse-database-url.sh b/parse-database-url.sh new file mode 100755 index 0000000..b0e87a0 --- /dev/null +++ b/parse-database-url.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# Referenced and tweaked from http://stackoverflow.com/questions/6174220/parse-url-in-shell-script#6174447 + +url="$1" +prefix="$2" +proto="$(echo "$url" | grep :// | sed -e 's,^\(.*\)://.*,\1,g')" +# remove the protocol +workurl="$(echo "$url" |sed -e "s,^$proto://,,")" +# extract the user (if any) +userpass="$(echo "$workurl" | grep @ | cut -d@ -f1)" +pass="$(echo "$userpass"| grep : | cut -d: -f2)" +if [ -n "$pass" ]; then + user="$(echo "$userpass" | grep : | cut -d: -f1)" +else + user="$userpass" +fi + +# extract the host +hostport="$(echo "$workurl" |sed -e "s,$userpass@,," | cut -d/ -f1)" +# by request - try to extract the port +port="$(echo "$hostport" | sed -e 's,^.*:,:,g' -e 's,.*:\([0-9]*\).*,\1,g' -e 's,[^0-9],,g')" +host="$(echo "$hostport" | cut -d: -f1)" +# extract the path (if any) +path="/$(echo "$workurl" | grep / | cut -d/ -f2-)" +name="$(echo "$workurl" | grep / | cut -d/ -f2-)" + +echo "${prefix}_URL=\"$url\"" +echo "${prefix}_PROTO=\"$proto\"" +echo "${prefix}_USER=\"$user\"" +echo "${prefix}_PASS=\"$pass\"" +echo "${prefix}_HOST=\"$host\"" +echo "${prefix}_PORT=\"$port\"" +echo "${prefix}_PATH=\"$path\"" +echo "${prefix}_NAME=\"$name\"" +