diff --git a/Dockerfile b/Dockerfile
index 2445f5cd9725c43a7a5a0c1f5f43eb3a1871486f..6960fb1d740605872dd384e118533744a48d232e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,7 +4,6 @@ RUN cd /src && \
     go build -ldflags="-extldflags=-static" -tags "sqlite_omit_load_extension netgo" -o tabacco ./cmd/tabacco && \
     strip tabacco
 
-FROM scratch
-COPY --from=build /src/tabacco /tabacco
-ENTRYPOINT ["/tabacco", "metadb"]
-
+FROM registry.git.autistici.org/ai3/docker/s6-base:master
+COPY --from=build /src/tabacco /usr/bin/tabacco
+COPY metadb/docker/etc/ /etc/
diff --git a/cmd/tabacco/metadb.go b/cmd/tabacco/metadb.go
index a8ea10309ca619811333d6d8c51d615af0c51ff5..dcaa1b299d8c09f1ca67b676ea22ddb03bafe5e3 100644
--- a/cmd/tabacco/metadb.go
+++ b/cmd/tabacco/metadb.go
@@ -3,6 +3,7 @@ package main
 import (
 	"context"
 	"flag"
+	"fmt"
 	"io/ioutil"
 	"log"
 
@@ -77,6 +78,50 @@ func (c *metadbCommand) Execute(ctx context.Context, f *flag.FlagSet, args ...in
 	return subcommands.ExitSuccess
 }
 
+type metadbConfigCommand struct {
+	configPath string
+}
+
+func (c *metadbConfigCommand) Name() string     { return "metadb-config" }
+func (c *metadbConfigCommand) Synopsis() string { return "print metadb configuration parameters" }
+func (c *metadbConfigCommand) Usage() string {
+	return `metadb-config [<flags>] <param>:
+	Print metadb configuration parameters, loaded from the configuration file.
+
+	The only supported parameter at the moment is "db-uri", the path to the
+	sqlite3 database.
+
+`
+}
+
+func (c *metadbConfigCommand) SetFlags(f *flag.FlagSet) {
+	f.StringVar(&c.configPath, "config", "/etc/tabacco/metadb.yml", "configuration `file`")
+}
+
+func (c *metadbConfigCommand) Execute(ctx context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus {
+	if f.NArg() != 1 {
+		log.Printf("error: wrong number of arguments")
+		return subcommands.ExitUsageError
+	}
+
+	config, err := loadMetadbConfig(c.configPath)
+	if err != nil {
+		log.Printf("configuration error: %v", err)
+		return subcommands.ExitFailure
+	}
+
+	switch f.Arg(0) {
+	case "db-uri":
+		fmt.Println(config.DBURI)
+	default:
+		log.Printf("unknown configuration parameter '%s'", f.Arg(0))
+		return subcommands.ExitFailure
+	}
+
+	return subcommands.ExitSuccess
+}
+
 func init() {
 	subcommands.Register(&metadbCommand{}, "")
+	subcommands.Register(&metadbConfigCommand{}, "")
 }
diff --git a/metadb/docker/etc/cont-init.d/10litestream b/metadb/docker/etc/cont-init.d/10litestream
new file mode 100755
index 0000000000000000000000000000000000000000..b62f958bad57e3d6933a1562ac2bdb37e406e4fb
--- /dev/null
+++ b/metadb/docker/etc/cont-init.d/10litestream
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+# Should we even run litestream?
+if [ -n "${LITESTREAM_URL}" ]; then
+
+   # Query the tabacco configuration to obtain the database path.
+   db_path=$(tabacco metadb-config --config=${TABACCO_CONF:-/etc/tabacco/metadb.yml} db-uri)
+
+   if [ ! -e "${db_path}" ]; then
+       echo "Database is missing, attempting restore..." >&2
+
+       litestream restore --if-replica-exists -o "${db_path}" "${LITESTREAM_URL}"
+       if [ $? -gt 0 ]; then
+           echo "Restore failed!" >&2
+           exit 1
+       fi
+   fi
+
+else
+    # Prevent the litestream service from running.
+    rm -fr /var/run/s6/etc/services.d/litestream
+fi
+
+exit 0
diff --git a/metadb/docker/etc/services.d/litestream/run b/metadb/docker/etc/services.d/litestream/run
new file mode 100755
index 0000000000000000000000000000000000000000..885840e00548fb6965ec390d3677456aa883a9e1
--- /dev/null
+++ b/metadb/docker/etc/services.d/litestream/run
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+db_path=$(tabacco metadb-config --config=${TABACCO_CONF:-/etc/tabacco/metadb.yml} db-uri)
+
+exec litestream replicate "${db_path}" "${LITESTREAM_URL}"
diff --git a/metadb/docker/etc/services.d/tabacco-metadb/finish b/metadb/docker/etc/services.d/tabacco-metadb/finish
new file mode 100755
index 0000000000000000000000000000000000000000..b6531b3ca574205c9e78650dbd7c38718683e57c
--- /dev/null
+++ b/metadb/docker/etc/services.d/tabacco-metadb/finish
@@ -0,0 +1,3 @@
+#!/usr/bin/execlineb -S0
+
+s6-svscanctl -t /var/run/s6/services
diff --git a/metadb/docker/etc/services.d/tabacco-metadb/run b/metadb/docker/etc/services.d/tabacco-metadb/run
new file mode 100755
index 0000000000000000000000000000000000000000..444a96f9c53beb7611f0a1d9d3971f18baef3247
--- /dev/null
+++ b/metadb/docker/etc/services.d/tabacco-metadb/run
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec /usr/bin/tabacco metadb --config=${TABACCO_CONF:-/etc/tabacco/metadb.yml}