summaryrefslogtreecommitdiff
path: root/build
diff options
context:
space:
mode:
Diffstat (limited to 'build')
-rw-r--r--build/init/Dockerfile21
-rwxr-xr-xbuild/init/init108
-rw-r--r--build/nginx/Dockerfile21
-rw-r--r--build/php/Dockerfile17
-rw-r--r--build/postgres/Dockerfile21
5 files changed, 188 insertions, 0 deletions
diff --git a/build/init/Dockerfile b/build/init/Dockerfile
new file mode 100644
index 0000000..98eb285
--- /dev/null
+++ b/build/init/Dockerfile
@@ -0,0 +1,21 @@
+FROM alpine:3.19
+
+# install packages
+RUN apk add --no-cache postgresql16-client tini shadow
+RUN rm -fr /var/cache/apk/*
+
+# setup main user
+RUN adduser -D init
+RUN groupmod --gid 1000 init
+RUN usermod --uid 1000 init
+
+# copy scripts
+COPY ./init /usr/local/bin/init
+
+# remove build packages
+RUN apk del shadow
+
+# do the
+USER init
+ENTRYPOINT ["/sbin/tini", "--"]
+CMD ["/usr/local/bin/init"]
diff --git a/build/init/init b/build/init/init
new file mode 100755
index 0000000..a889a8b
--- /dev/null
+++ b/build/init/init
@@ -0,0 +1,108 @@
+#!/bin/sh
+
+errors=$(mktemp)
+
+step() {
+ printf '\x1b[34;1m>> %s\x1b[0m\n' "$*"
+}
+
+error() {
+ {
+ printf '\x1b[31;1merror: \x1b[0m%s\n' "$*";
+ grep -v 'current transaction is aborted' < "$errors";
+ printf "\x1b[31m;1error: \x1b[0mAborting migrations, fix file(s) then restart process.";
+ } 1>&2;
+}
+
+try() {
+ "$@" 2> "$errors";
+ count=$(grep -c 'ERROR' < "$errors")
+ if [ "$count" -eq 0 ]; then
+ return 0;
+ else
+ return 1;
+ fi
+}
+
+export PGPASSWORD="$POSTGRES_PASSWORD"
+
+psql() {
+ /usr/bin/psql \
+ -h db \
+ -p 5432 \
+ -d "$POSTGRES_DB" \
+ -U "$POSTGRES_USER" \
+ "$@"
+}
+
+pg_isready() {
+ /usr/bin/pg_isready \
+ -h db \
+ -p 5432 \
+ -d "$POSTGRES_DB" \
+ -U "$POSTGRES_USER"
+}
+
+curr_revision() {
+ psql -qtAX -f /db/rev.sql;
+}
+
+wait_until_ready() {
+ step 'Checking if the database is ready...';
+ while true; do
+ pg_isready;
+ code=$?;
+ if [ $code -eq 0 ]; then
+ break;
+ fi
+ sleep 3;
+ done
+}
+
+run_migrations() {
+ i="$1"
+ while true; do
+ name=$(printf "%04d" "$i");
+ file="/db/migrations/$name.sql"
+ if [ -f "$file" ]; then
+ if try psql -f "$file"; then
+ i=$((i+1));
+ continue;
+ else
+ error "An error occoured during a migration (rev $name)"
+ return 1;
+ fi
+ else
+ return 0;
+ fi
+ done
+}
+
+init () {
+ # reomve ready status
+ # so php ignores requests
+ rm -f /status/ready
+
+ step 'Waiting for database';
+ # make sure the database is running
+ # before we run any requests
+ wait_until_ready;
+ step 'Database ready';
+
+ step 'Peforming migrations';
+ # get the current revision
+ REV=$(curr_revision);
+ step "Database at revision: $REV"
+ # run each migration that is
+ # higher than our current revision
+ if ! run_migrations "$REV"; then
+ return 1;
+ fi
+
+ step 'Database is initialized'
+ # database is ready
+ touch /status/ready
+}
+
+init
+rm "$errors"
diff --git a/build/nginx/Dockerfile b/build/nginx/Dockerfile
new file mode 100644
index 0000000..6aa4e00
--- /dev/null
+++ b/build/nginx/Dockerfile
@@ -0,0 +1,21 @@
+FROM alpine:3.19
+
+# install packages
+RUN apk add --no-cache nginx shadow tini
+RUN rm -fr /var/cache/apk/*
+
+# update nginx user
+RUN groupmod --gid 1000 nginx
+RUN usermod --uid 1000 nginx
+
+# remove build packages
+RUN apk del shadow
+
+# make log syms
+RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
+ ln -sf /dev/stderr /var/log/nginx/error.log
+
+# do the
+USER nginx
+ENTRYPOINT ["/sbin/tini", "--"]
+CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]
diff --git a/build/php/Dockerfile b/build/php/Dockerfile
new file mode 100644
index 0000000..5f4bdd5
--- /dev/null
+++ b/build/php/Dockerfile
@@ -0,0 +1,17 @@
+FROM php:fpm-alpine
+
+# install packages
+RUN apk add --no-cache postgresql-dev runuser shadow
+RUN rm -fr /var/cache/apk/*
+
+# update php user
+RUN groupmod --gid 1000 www-data
+RUN usermod --uid 1000 www-data
+
+# install php packages
+RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql
+RUN docker-php-ext-install pdo pdo_pgsql
+
+# remove build packages
+RUN apk del shadow
+USER www-data
diff --git a/build/postgres/Dockerfile b/build/postgres/Dockerfile
new file mode 100644
index 0000000..32bca6e
--- /dev/null
+++ b/build/postgres/Dockerfile
@@ -0,0 +1,21 @@
+FROM postgres:16-alpine
+
+# install packages
+RUN apk add --no-cache make git shadow
+RUN rm -fr /var/cache/apk/*
+
+# install pgjwt
+RUN git clone https://github.com/michelp/pgjwt.git /tmp/pgjwt
+WORKDIR /tmp/pgjwt
+RUN make install
+
+# update postgres user
+RUN groupmod --gid 1000 postgres
+RUN usermod --uid 1000 postgres
+
+# remove build packages
+RUN apk del make git shadow
+
+# fix workdir
+WORKDIR /
+USER postgres