diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9f0bc4464d7310b56d6037b7844c471836eedc8e
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,2 @@
+include: "https://git.autistici.org/ai3/build-container/raw/master/common.yml"
+
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..2aa8c0daa36193d1f2417f531dfc0b74b5d18492
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,11 @@
+FROM registry.git.autistici.org/ai3/docker/chaperone-base:master
+
+RUN apt-get -q update && \
+    env DEBIAN_FRONTEND=noninteractive apt-get -qy install --no-install-recommends \
+        python3-flask python3-sqlalchemy python3-flask-sqlalchemy python3-flask-script
+
+ADD . /tmp/src
+WORKDIR /tmp/src
+RUN python3 setup.py install
+
+COPY conf/ /etc/
diff --git a/conf/chaperone.d/feedbackloop.conf b/conf/chaperone.d/feedbackloop.conf
new file mode 100644
index 0000000000000000000000000000000000000000..66293865823aa9b3065ee1167451fb5373acfc99
--- /dev/null
+++ b/conf/chaperone.d/feedbackloop.conf
@@ -0,0 +1,16 @@
+feedbackloop.service: {
+    command: "/bin/sh -c '/usr/local/bin/feedbackloop server --port=${PORT:-4099} --addr=${ADDR:-0.0.0.0}'",
+    exit_kills: true,
+}
+
+ingest.service: {
+    type: cron,
+    interval: "44 * * * *",
+    command: "/usr/local/bin/feedbackloop ingest",
+}
+
+expire.service: {
+    type: cron,
+    interval: "39 5 * * *",
+    command: "/usr/local/bin/feedbackloop expire --days=30",
+}