From bc81921bd7e0b7ad3b0d477bde350692f91baedd Mon Sep 17 00:00:00 2001 From: Ivaylo Novakov Date: Tue, 19 Jan 2021 17:58:08 +0100 Subject: [PATCH] Cockroach backups. Still defunct. Restore to come (or be manual). --- docker-compose.yml | 24 ++++++++++++++-- docker/cockroach-backup/scripts/serve.py | 35 ++++++++++++++++++++++++ scripts/crdb_backup.sh | 10 +++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 docker/cockroach-backup/scripts/serve.py create mode 100644 scripts/crdb_backup.sh diff --git a/docker-compose.yml b/docker-compose.yml index 04b14e17..2f9985e1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -294,7 +294,7 @@ services: ipv4_address: 10.10.10.83 cockroach: - image: cockroachdb/cockroach:v20.1.10 + image: cockroachdb/cockroach:v20.2.3 container_name: cockroach env_file: - .env @@ -303,8 +303,28 @@ services: - ./docker/data/cockroach/sqlite:/cockroach/cockroach-data - ./docker/cockroach/certs:/certs ports: - - "4080:8080" + - "4080:8080" # TODO Remove this once the setup is finalized. - "26257:26257" networks: shared: ipv4_address: 10.10.10.84 + + # This container starts a simple unsecured file server, so cockroach can write + # its backups to it. By default, python's http-server doesn't support PUT, + # see https://gist.github.com/mildred/67d22d7289ae8f16cae7 for the script + # used here. + cockroach-backup: + image: python:3.9-buster + container_name: cockroach-backup + command: python /scripts/serve.py --bind=0.0.0.0:3000 + volumes: + - ./docker/cockroach-backup/scripts:/scripts + - ./docker/data/cockroach/sqlite:/cockroach + expose: + - 3000 + networks: + shared: + ipv4_address: 10.10.10.85 + + +# TODO https://www.cockroachlabs.com/docs/v20.2/create-schedule-for-backup diff --git a/docker/cockroach-backup/scripts/serve.py b/docker/cockroach-backup/scripts/serve.py new file mode 100644 index 00000000..ed8adda2 --- /dev/null +++ b/docker/cockroach-backup/scripts/serve.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +import argparse +import http.server +import os + +class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): + def do_PUT(self): + path = self.translate_path(self.path) + if path.endswith('/'): + self.send_response(405, "Method Not Allowed") + self.wfile.write("PUT not allowed on a directory\n".encode()) + return + else: + try: + os.makedirs(os.path.dirname(path)) + except FileExistsError: pass + length = int(self.headers['Content-Length']) + with open(path, 'wb') as f: + f.write(self.rfile.read(length)) + self.send_response(201, "Created") + self.end_headers() + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--bind', '-b', default='0.0.0.0', metavar='ADDRESS', + help='Specify alternate bind address ' + '[default: all interfaces]') + parser.add_argument('port', action='store', + default=3000, type=int, + nargs='?', + help='Specify alternate port [default: 3000]') + args = parser.parse_args() + + http.server.test(HandlerClass=HTTPRequestHandler, port=args.port, bind=args.bind) diff --git a/scripts/crdb_backup.sh b/scripts/crdb_backup.sh new file mode 100644 index 00000000..8679aa34 --- /dev/null +++ b/scripts/crdb_backup.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Take the current datetime: +DT=`date +%Y-%m-%d` +# Create the backup: +docker exec cockroach \ + cockroach sql \ + --host cockroach:26257 \ + --certs-dir=/certs \ + --execute="BACKUP TO 'http://cockroach-backup:3000/cockroach/backups/$DT';"