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}