{"id":13629654,"url":"https://github.com/cabify/couchdb-admin","last_synced_at":"2026-01-14T23:49:07.467Z","repository":{"id":146069402,"uuid":"92821128","full_name":"cabify/couchdb-admin","owner":"cabify","description":"CouchDB admin tooling","archived":true,"fork":false,"pushed_at":"2017-10-02T14:24:10.000Z","size":2373,"stargazers_count":7,"open_issues_count":1,"forks_count":1,"subscribers_count":120,"default_branch":"master","last_synced_at":"2025-04-17T23:07:30.923Z","etag":null,"topics":["administration","couchdb","golang","operations"],"latest_commit_sha":null,"homepage":null,"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/cabify.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,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-05-30T10:19:44.000Z","updated_at":"2024-02-19T03:40:02.000Z","dependencies_parsed_at":"2023-05-10T15:45:33.064Z","dependency_job_id":null,"html_url":"https://github.com/cabify/couchdb-admin","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cabify/couchdb-admin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cabify%2Fcouchdb-admin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cabify%2Fcouchdb-admin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cabify%2Fcouchdb-admin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cabify%2Fcouchdb-admin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cabify","download_url":"https://codeload.github.com/cabify/couchdb-admin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cabify%2Fcouchdb-admin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28439543,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T22:37:52.437Z","status":"ssl_error","status_checked_at":"2026-01-14T22:37:31.496Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["administration","couchdb","golang","operations"],"created_at":"2024-08-01T22:01:15.772Z","updated_at":"2026-01-14T23:49:07.447Z","avatar_url":"https://github.com/cabify.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# CouchDB 2 cluster admin tool [![Build Status](https://travis-ci.org/cabify/couchdb-admin.svg?branch=master)](https://travis-ci.org/cabify/couchdb-admin)\n\nCurrently operating a CouchDB 2 clustered database is a highly manual and error prone task and that's something you definitely should avoid when it comes to databases.\n`couchdb-admin` is a FOSS tool written in [Go](https://golang.org/) that operates your database via the [Oficial REST API](http://docs.couchdb.org/en/2.0.0/api/) in a command-line fashion. Performs sanity checks for you and hides all the REST communication complexities from you.\n\n---\n\n## Features\n\n`couchdb-admin` works at three levels: Cluster, Node and Database:\n\n* Cluster wide management:\n  * Describe cluster: Get an overview of your cluster's current status (nodes joined, ...)\n  * Add nodes: Join a node into the cluster.\n  * Remove nodes: Remove a node from the cluster.\n* Node management:\n  * Set config values: Apply config values on your nodes. No need to restart.\n  * Disable maintenance mode: Shortcut method to remove the `maintenance_mode` flag from a node.\n* Database management:\n  * Describe database: Get an overview of your database's shards distribution across nodes.\n  * Create database: Create a database, configuring shards number and replication.\n  * Replicate a shard: Design a new replica for a particular database's shard.\n  * Remove a shard's replica: Free a node from holding a replica of a particular database's shard.\n\n## Prerequisites\n\nThe `couchdb-admin` tool needs to be able to reach any of the nodes of the cluster to operate on both `5984` and `5986` ports. Additionally a configured admin role is required.\n\n* The address where to contact the server has to be given in the `--server` argument (defaults to 127.0.0.1)\n* The admin username is required into the `--admin` argument (defaults to admin)\n* The admin's password is required into the `--password` argument (defaults to password)\n\n## Examples\n\nDISCLAIMER: The examples shown below will use the default values for `server`, `admin` and `password` arguments. Please update them accordingly when running your own.\n\n### Cluster management\n\n#### Describe cluster\n\nGet an overview of your cluster's current status, which nodes form it and so on. Uses the [_membership](http://docs.couchdb.org/en/2.0.0/api/server/common.html#get--_membership) endpoint.\n\n```\n$ couchdb-admin describe_cluster\n\n2017/06/29 13:46:26  info Describing cluster layout... server=127.0.0.1\n\ncouchdb_admin.Nodes{\n    AllNodes:     {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n    ClusterNodes: {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n}\n```\n\n#### Add nodes\n\nFollowing the procedure described [in the official docs](http://docs.couchdb.org/en/2.0.0/cluster/nodes.html#adding-a-node) joins a node into the cluster.\nUses the `_nodes` endpoint\n\nAfter firing up a new node, located, for example, at `couch-3.couchdb2-replica-admin`:\n\n```\n$ couchdb-admin add_node --node=couch-3.couchdb2-replica-admin\n\n2017/06/29 15:38:39  info Adding node to the cluster... node=couch-3.couchdb2-replica-admin\n\n2017/06/29 15:38:40  info Successfully added node!  node=couch-3.couchdb2-replica-admin\n```\n\nAnd then, describing the cluster again...\n\n```\n$ couchdb-admin describe_cluster\n\n2017/06/29 15:38:54  info Describing cluster layout... server=127.0.0.1\n\ncouchdb_admin.Nodes{\n    AllNodes:     {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\", \"couchdb@couch-3.couchdb2-replica-admin\"},\n    ClusterNodes: {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\", \"couchdb@couch-3.couchdb2-replica-admin\"},\n}\n```\n\n#### Remove nodes\n\nAgain, following the procedure described [in the official docs](http://docs.couchdb.org/en/2.0.0/cluster/nodes.html#removing-a-node) it removes a node from the cluster.\nUses the `_nodes` endpoint\n\n```\n$ couchdb-admin remove_node --node=couch-3.couchdb2-replica-admin\n\n2017/06/29 15:55:26  info Removing node...          node=couch-3.couchdb2-replica-admin\n\n2017/06/29 15:55:26  info Checking that node does not own any shard... node=couchdb@couch-3.couchdb2-replica-admin\n\n2017/06/29 15:55:26  info Node successfully removed! node=couch-3.couchdb2-replica-admin\n```\nAnd then, describing the cluster again...\n```\n$ couchdb-admin describe_cluster\n\n2017/06/29 15:55:59  info Describing cluster layout... server=127.0.0.1\n\ncouchdb_admin.Nodes{\n    AllNodes:     {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n    ClusterNodes: {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n}\n```\n\n### Node management\n\n#### Set config values\n\nSets config values on a node by using the [_config](http://docs.couchdb.org/en/2.0.0/api/server/configuration.html#put--_config-section-key) endpoint.\nYou can check possible sections, keys and values to use on the [config reference](http://docs.couchdb.org/en/2.0.0/config-ref.html).\nChanges will take effect on the fly, no need to restart!\n\nHere we'll set the log level to debug in a particular node.\n\n```\n$ couchdb-admin set_config --section=log --key=level --value=debug --node=couch-0.couchdb2-replica-admin\n\n2017/06/29 16:04:08  info Setting config value...   key=level node=couch-0.couchdb2-replica-admin section=log value=debug\n\n2017/06/29 16:04:08  info New config successfully applied! key=level node=couch-0.couchdb2-replica-admin section=log value=debug\n```\n\nAnd in the logs you should see `[notice] 2017-06-29T12:42:21.558278Z couchdb@couch-0.couchdb2-replica-admin \u003c0.89.0\u003e -------- config: [log] level set to debug for reason nil`\n\n#### Disable maintenance mode\n\nThis is a shortcut method to disable the [maintenance_mode flag](http://docs.couchdb.org/en/2.0.0/config/couchdb.html#couchdb/maintenance_mode). The reason for this method is that whenever a new node is configured to replicate a shard it is set into `maintenance_mode` to avoid unconsistent reads while it syncs.\n\n```\n$ couchdb-admin disasble_maintenance_mode --node=couch-1.couchdb2-replica-admin\n\n2017/06/29 16:28:52  info Removing maintenance flag... node=couch-1.couchdb2-replica-admin\n\n2017/06/29 16:28:52  info Maintenance flag successfully removed! node=couch-1.couchdb2-replica-admin\n```\n\nYou should see something like this in the logs: `[notice] 2017-06-29T13:07:06.470213Z couchdb@couch-1.couchdb2-replica-admin \u003c0.89.0\u003e -------- config: [couchdb] maintenance_mode set to false for reason nil`\n\n### Database management\n\n#### Describe database\n\nGets a database shards ownership from the `_dbs` endpoint\n\n```\n$ couchdb-admin describe_database --db=testdb\n\n2017/06/29 16:08:04  info Describing database...    db=testdb\n\n\u0026couchdb_admin.Database{\n    name:   \"testdb\",\n    config: couchdb_admin.Config{\n        Id:        \"testdb\",\n        Rev:       \"1-898af88337774f013e7c14fafeb79f75\",\n        Shards:    {46, 49, 52, 57, 56, 50, 48, 56, 52, 50, 51},\n        Changelog: {\n            {\"add\", \"00000000-1fffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"00000000-1fffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"00000000-1fffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"20000000-3fffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"20000000-3fffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"20000000-3fffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"40000000-5fffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"40000000-5fffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"40000000-5fffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"60000000-7fffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"60000000-7fffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"60000000-7fffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"80000000-9fffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"80000000-9fffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"80000000-9fffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"a0000000-bfffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"a0000000-bfffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"a0000000-bfffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"c0000000-dfffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"c0000000-dfffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"c0000000-dfffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"e0000000-ffffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"e0000000-ffffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"e0000000-ffffffff\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n        },\n        ByNode: {\n            \"couchdb@couch-0.couchdb2-replica-admin\": {\"00000000-1fffffff\", \"20000000-3fffffff\", \"40000000-5fffffff\", \"60000000-7fffffff\", \"80000000-9fffffff\", \"a0000000-bfffffff\", \"c0000000-dfffffff\", \"e0000000-ffffffff\"},\n            \"couchdb@couch-1.couchdb2-replica-admin\": {\"00000000-1fffffff\", \"20000000-3fffffff\", \"40000000-5fffffff\", \"60000000-7fffffff\", \"80000000-9fffffff\", \"a0000000-bfffffff\", \"c0000000-dfffffff\", \"e0000000-ffffffff\"},\n            \"couchdb@couch-2.couchdb2-replica-admin\": {\"00000000-1fffffff\", \"20000000-3fffffff\", \"40000000-5fffffff\", \"60000000-7fffffff\", \"80000000-9fffffff\", \"a0000000-bfffffff\", \"c0000000-dfffffff\", \"e0000000-ffffffff\"},\n        },\n        ByRange: {\n            \"20000000-3fffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"40000000-5fffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"60000000-7fffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"80000000-9fffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"a0000000-bfffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"c0000000-dfffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"e0000000-ffffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"00000000-1fffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n        },\n    },\n}\n```\n\nWhere we can see that our database has 8 shards and 3 replicas each shard. The `ByNode` key describes which shards each node is holding whilst `ByRange` describes which nodes contain which shard.\nThis is a special case as we have only 3 nodes, so each node has a complete copy of all the data.\n\n#### Create a database\n\nCreates a new database using the [PUT /{db}](http://docs.couchdb.org/en/2.0.0/api/database/common.html#put--db) endpoint.\n\n```\n$ couchdb-admin create_db --db=mydb --shards=3 --replicas=2\n\n2017/06/29 16:15:42  info Creating database...      db=mydb replicas=2 shards=3\n\n2017/06/29 16:15:43  info Database successfully created! db=mydb replicas=2 shards=3\n```\n\nNow we can see its layout across nodes.\n\n```\n$ couchdb-admin describe_db --db=mytdb\n\n2017/06/29 16:16:43  info Describing database...    db=mydb\n\n\u0026couchdb_admin.Database{\n    name:   \"mydb\",\n    config: couchdb_admin.Config{\n        Id:        \"mydb\",\n        Rev:       \"1-73e3eedeb4a3304842633c8f695e36c0\",\n        Shards:    {46, 49, 52, 57, 56, 55, 52, 48, 56, 51, 54},\n        Changelog: {\n            {\"add\", \"00000000-55555554\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"00000000-55555554\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"55555555-aaaaaaa9\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"55555555-aaaaaaa9\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"aaaaaaaa-ffffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"aaaaaaaa-ffffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n        },\n        ByNode: {\n            \"couchdb@couch-0.couchdb2-replica-admin\": {\"55555555-aaaaaaa9\", \"aaaaaaaa-ffffffff\"},\n            \"couchdb@couch-1.couchdb2-replica-admin\": {\"00000000-55555554\", \"aaaaaaaa-ffffffff\"},\n            \"couchdb@couch-2.couchdb2-replica-admin\": {\"00000000-55555554\", \"55555555-aaaaaaa9\"},\n        },\n        ByRange: {\n            \"55555555-aaaaaaa9\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"aaaaaaaa-ffffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            \"00000000-55555554\": {\"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n        },\n    },\n}\n```\n\n#### Replicate a shard\n\nConfigures a node to also be a replica for a particular shard. It follows the procedure described [in the official docs](http://docs.couchdb.org/en/2.0.0/cluster/sharding.html?highlight=scaling%20out#scaling-out).\n\n```\n$ couchdb-admin replicate --shard=55555555-aaaaaaa9 --db=mydb --replica=couch-1.couchdb2-replica-admin\n\n2017/06/29 16:21:16  info Replicating shard...      db=mydb replica=couch-1.couchdb2-replica-admin shard=55555555-aaaaaaa9\n\n2017/06/29 16:21:16  info Shard successfully replicated db=mydb replica=couch-1.couchdb2-replica-admin shard=55555555-aaaaaaa9\n\n2017/06/29 16:21:16  warn Node was sent into maintenance!. Remember to reenable it once it catches up with changes node=couch-1.couchdb2-replica-admin\n```\n\nAnd now describing the db again we can see that the shard 555... is on all nodes and taht couch-1 node holds all three shards!\n\n```\n$ couchdb-admin describe_db --db=mydb\n\n2017/06/29 16:21:57  info Describing database...    db=mydb\n\n\u0026couchdb_admin.Database{\n    name:   \"mydb\",\n    config: couchdb_admin.Config{\n        Id:        \"mydb\",\n        Rev:       \"2-5c965ef57142374eda39b6f4718b6298\",\n        Shards:    {46, 49, 52, 57, 56, 55, 52, 48, 56, 51, 54},\n        Changelog: {\n            {\"add\", \"00000000-55555554\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"00000000-55555554\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"55555555-aaaaaaa9\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"55555555-aaaaaaa9\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"aaaaaaaa-ffffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"aaaaaaaa-ffffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n        },\n        ByNode: {\n            \"couchdb@couch-0.couchdb2-replica-admin\": {\"55555555-aaaaaaa9\", \"aaaaaaaa-ffffffff\"},\n            \"couchdb@couch-1.couchdb2-replica-admin\": {\"00000000-55555554\", \"aaaaaaaa-ffffffff\", \"55555555-aaaaaaa9\"},\n            \"couchdb@couch-2.couchdb2-replica-admin\": {\"00000000-55555554\", \"55555555-aaaaaaa9\"},\n        },\n        ByRange: {\n            \"55555555-aaaaaaa9\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            \"aaaaaaaa-ffffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            \"00000000-55555554\": {\"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n        },\n    },\n}\n```\n\nBEWARE!!!: The node receiving the new replica is automatically set into [maintenance mode](http://docs.couchdb.org/en/2.0.0/config/couchdb.html#couchdb/maintenance_mode). You should check the logs for pending changes and once it finishes syncing [disable maintenance mode](https://github.com/cabify/couchdb-admin#disable-maintenance-mode) so that it participates in reads again.\n\n#### Remove a shard's replica\n\nConfigures a node to stop being a replica for a particular shard. It follows the procedure described [in the official docs](http://docs.couchdb.org/en/2.0.0/cluster/sharding.html?highlight=scaling%20out#moving-shards).\n\n```\n$ couchdb-admin remove_replica --db=mydb --shard=55555555-aaaaaaa9 --from=couch-1.couchdb2-replica-admin\n\n2017/06/29 16:34:47  info Removing shard ownership... db=mydb replica=couch-1.couchdb2-replica-admin shard=55555555-aaaaaaa9\n\n2017/06/29 16:34:47  info Replica shard successfully removed! db=mydb replica=couch-1.couchdb2-replica-admin shard=55555555-aaaaaaa9\n```\n\nAnd describing the database layout again we see that couch-1 is no longer replicating shard 555...\n\n```\n$ couchdb-admin describe_db --db=mydb\n\n2017/06/29 16:35:48  info Describing database...    db=mydb\n\n\u0026couchdb_admin.Database{\n    name:   \"mydb\",\n    config: couchdb_admin.Config{\n        Id:        \"mydb\",\n        Rev:       \"3-64420ae508c9ad647f615d5d823ec9b8\",\n        Shards:    {46, 49, 52, 57, 56, 55, 52, 48, 56, 51, 54},\n        Changelog: {\n            {\"add\", \"00000000-55555554\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n            {\"add\", \"00000000-55555554\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"55555555-aaaaaaa9\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"55555555-aaaaaaa9\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            {\"add\", \"aaaaaaaa-ffffffff\", \"couchdb@couch-0.couchdb2-replica-admin\"},\n            {\"add\", \"aaaaaaaa-ffffffff\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n        },\n        ByNode: {\n            \"couchdb@couch-0.couchdb2-replica-admin\": {\"55555555-aaaaaaa9\", \"aaaaaaaa-ffffffff\"},\n            \"couchdb@couch-1.couchdb2-replica-admin\": {\"00000000-55555554\", \"aaaaaaaa-ffffffff\"},\n            \"couchdb@couch-2.couchdb2-replica-admin\": {\"00000000-55555554\", \"55555555-aaaaaaa9\"},\n        },\n        ByRange: {\n            \"00000000-55555554\": {\"couchdb@couch-1.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"55555555-aaaaaaa9\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-2.couchdb2-replica-admin\"},\n            \"aaaaaaaa-ffffffff\": {\"couchdb@couch-0.couchdb2-replica-admin\", \"couchdb@couch-1.couchdb2-replica-admin\"},\n        },\n    },\n}\n```\n\n## Vendoring\n\n`couchdb-admin` currently uses [Glide](http://glide.sh/) for vendoring.\n\n## Developing couchdb-admin\n\nIf you wish to work on couchdb-admin you'll first need Go installed (version 1.8+ is required). Make sure you have Go properly installed, including setting up your GOPATH.\n\nNext, clone this repository into $GOPATH/src/github.com/cabify/couchdb-admin. Then enter into the directory `cli/couchdb-admin` and type:\n```\n$ make all\n```\n\nThis will generate a binary file `couchdb-admin` which you can now play with. In case you are running on macOS type `make darwin` instead.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcabify%2Fcouchdb-admin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcabify%2Fcouchdb-admin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcabify%2Fcouchdb-admin/lists"}