diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b3c965996a06d68ca36c9f75a909afd486e423cd
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,30 @@
+image: docker:latest
+
+stages:
+  - build
+  - release
+
+services:
+  - docker:dind
+
+variables:
+  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
+  RELEASE_TAG: $CI_REGISTRY_IMAGE:latest
+
+before_script:
+  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.git.autistici.org
+
+build:
+  stage: build
+  script:
+    - docker build --pull -t $IMAGE_TAG .
+    - docker push $IMAGE_TAG
+
+release:
+  stage: release
+  script:
+    - docker pull $IMAGE_TAG
+    - docker tag $IMAGE_TAG $RELEASE_TAG
+    - docker push $RELEASE_TAG
+  only:
+    - master
diff --git a/repl_manager.sh b/repl_manager.sh
index c2f022703612afbe71cf647d1c70bd127faa27e3..1ca3e7f091ccfe9f543e34bb8043e2276c3c03fb 100755
--- a/repl_manager.sh
+++ b/repl_manager.sh
@@ -1,7 +1,11 @@
 #!/bin/sh
 
 MASTERELECTION_NAME=${MASTERELECTION_NAME:-mariadb}
-PUBLIC_ADDR=${PUBLIC_ADDR:-$(/bin/hostname):3306}
+
+if [ -z "${PUBLIC_ADDR}" ]; then
+    echo "ERROR: PUBLIC_ADDR is undefined" >&2
+    exit 2
+fi
 
 wait_for_mysql() {
     echo "Waiting for MySQL server to start up..." >&2