{"id":15187243,"url":"https://github.com/zhashkevych/spacer","last_synced_at":"2025-10-27T05:30:56.171Z","repository":{"id":57620805,"uuid":"321425586","full_name":"zhashkevych/spacer","owner":"zhashkevych","description":"🚀 Golang library \u0026 CLI tool that helps you export encrypted database dumps to S3-compatible storages","archived":false,"fork":false,"pushed_at":"2020-12-18T14:26:37.000Z","size":89,"stargazers_count":11,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-02-01T02:04:33.582Z","etag":null,"topics":["cli","cli-app","digitalocean","digitalocean-spaces","dump","golang","golang-library","pgdump","pgrestore","postgres","postgres-dump","psql","s3","s3-bucket","s3-storage"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhashkevych.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-12-14T17:38:16.000Z","updated_at":"2024-11-20T12:12:47.000Z","dependencies_parsed_at":"2022-09-18T05:35:55.492Z","dependency_job_id":null,"html_url":"https://github.com/zhashkevych/spacer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhashkevych%2Fspacer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhashkevych%2Fspacer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhashkevych%2Fspacer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhashkevych%2Fspacer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhashkevych","download_url":"https://codeload.github.com/zhashkevych/spacer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238437599,"owners_count":19472441,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cli-app","digitalocean","digitalocean-spaces","dump","golang","golang-library","pgdump","pgrestore","postgres","postgres-dump","psql","s3","s3-bucket","s3-storage"],"created_at":"2024-09-27T18:05:46.945Z","updated_at":"2025-10-27T05:30:50.878Z","avatar_url":"https://github.com/zhashkevych.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![alt text](./logo.png)\n# Spacer is the Golang library \u0026 CLI tool that helps you manage Database dumping/restoring with ease\nSpacer provides functionality to dump Postgres database, encrypt and export it to S3-compatible object storage.\n\nAlso, it can restore Database using latest saved dump file.\n\nSpacer uses symmetric-key encryption (AES/GCM). You can generate secrey key using keygen, simply run `make keygen`.\n\nExample (dump, encrypt \u0026 save):\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"github.com/zhashkevych/spacer/pkg\"\n    \"log\"\n    \"time\"\n    \"io/ioutil\"\n)\n\nfunc main() {\n    // Create DB client\n    postgres, err := spacer.NewPostgres(\"localhost\", \"5432\", \"postgres\", \"qwerty\", \"postgres\")\n    if err != nil {\n        log.Fatalf(\"failed to create Postgres: %s\", err.Error())\n    }\n\n    // Create dump\n    ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)\n    defer cancel()\n\n    if err := postgres.Dump(ctx, \"test_dump.sql\"); err != nil {\n        log.Fatalf(\"failed to create dump: %s\", err.Error())\n    }\n\n    // OR use File to create files using following scheme \u003cprefix\u003e.dump_\u003ccurrent_date\u003e.sql\n    dumpFile, err := spacer.NewDumpFile(\"local\")\n    if err != nil {\n        log.Fatalf(\"failed to create dump file: %s\", err.Error())\n    }\n\n    if err := postgres.Dump(ctx, dumpFile.Name()); err != nil {\n        log.Fatalf(\"failed to create dump: %s\", err.Error())\n    }\n\n    // Now you can do anything you want\n    // For example, encrypt and save it to Object Storage\n    encryptor, err := spacer.NewEncryptor([]byte(\"your-key-should-have-32-bytes!!!\"))\n    if err != nil {\n        log.Fatalf(\"failed to create Encryptor: %s\", err.Error())\n    }\n\n    // encrypt file\n    fileData, err := ioutil.ReadAll(dumpFile.Reader())\n    if err != nil {\n        log.Fatalf(\"failed to read dump file: %s\", err.Error())\n    }\n\n    encrypted, err := encryptor.Encrypt(fileData)\n    if err != nil {\n        log.Fatalf(\"failed to encrypt: %s\", err.Error())\n    }\n\n    if err := dumpFile.Write(encrypted); err != nil {\n        log.Fatalf(\"failed to rewrite encrypted data to file: %s\", err.Error())\n    }\n\n    // and save\n    storage, err := spacer.NewSpacesStorage(\"ams3.digitaloceanspaces.com\", \"test-bucket\", \"your-access-key\", \"your-secret-key\")\n    if err != nil {\n        log.Fatalf(\"failed to create SpacesStorage: %s\", err.Error())\n    }\n\n    url, err := storage.Save(ctx, dumpFile, \"dumps\")\n    if err != nil {\n        log.Fatalf(\"failed to save dump file: %s\", err.Error())\n    }\n\n    log.Println(\"Dump exported to\", url)\n}\n```\n\nRestore:\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"github.com/zhashkevych/spacer/pkg\"\n\t\"log\"\n)\n\nfunc main() {\n    postgres, err := spacer.NewPostgres(\"localhost\", \"5432\", \"postgres\", \"qwerty\", \"postgres\")\n    if err != nil {\n        log.Fatalf(\"failed to create Postgres: %s\", err.Error())\n    }\n\n    storage, err := spacer.NewSpacesStorage(\"ams3.digitaloceanspaces.com\", \"test-bucket\", \"your-access-key\", \"your-secret-key\")\n    if err != nil {\n        log.Fatalf(\"failed to create SpacesStorage: %s\", err.Error())\n    }\n\n    ctx := context.Background()\n\n    dumpFile, err := storage.GetLatest(ctx, \"dumps\", \"local\")\n    if err != nil {\n        log.Fatalf(\"failed to get latest dump file: %s\", err.Error())\n    }\n\n    if err := postgres.Restore(ctx, dumpFile.Name()); err != nil {\n        log.Fatalf(\"failed to restore latest dump: %s\", err.Error())\n    }\n}\n``` \n\n### Use it in your command line:\nPrerequisites:\n- go 1.15\n- psql \u0026 pg_dump installed\n\nSteps:\n1) Run `make keygen` to generate encryption key\n2) Set connection info variables in .env file (look at .env.example)\n3) Run `make build` to create binaries\n4) Run `./.bin/spacer export -p \u003cfilename prefix\u003e -f \u003cfolder name\u003e` to create dump and export it to storage OR `./bin/spacer restore` to restore DB from latest dump in your storage bucket\n\nExample:\n```shell script\n❯ ./.bin/spacer                                                                                                               spacer/git/main\nNAME:\n   CLI tool that helps you export encrypted Postgres dumps to DigitalOcean Spaces - A new cli application\n\nUSAGE:\n   spacer [global options] command [command options] [arguments...]\n\nCOMMANDS:\n   export, e   create and export dump\n   restore, r  restore from latest dump\n   help, h     Shows a list of commands or help for one command\n\nGLOBAL OPTIONS:\n   --help, -h  show help (default: false)\n❯ ./.bin/spacer export -p local -f dumps                                                                                      spacer/git/main\n2020/12/18 16:22:45 Starting export\n2020/12/18 16:22:47 dump successfully exported to https://\u003cbucket\u003e.ams3.digitaloceanspaces.com/dumps/local.dump_1608301365.tar.gz\n❯ ./.bin/spacer restore -p local -f dumps                                                                                     spacer/git/main\n2020/12/18 16:24:29 Starting restore\n2020/12/18 16:24:30 DB successfully restored from latest dump\n```\n\n## TODO\n- Implement dump files compression\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhashkevych%2Fspacer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhashkevych%2Fspacer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhashkevych%2Fspacer/lists"}