{"id":26365385,"url":"https://github.com/cipherstash/proxy","last_synced_at":"2025-03-16T19:35:53.530Z","repository":{"id":281115008,"uuid":"869193095","full_name":"cipherstash/proxy","owner":"cipherstash","description":"Encrypt and search your sensitive data in PostgreSQL, with no SQL changes","archived":false,"fork":false,"pushed_at":"2025-03-14T04:07:23.000Z","size":1525,"stargazers_count":13,"open_issues_count":5,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-14T04:29:35.699Z","etag":null,"topics":["encryption-in-use","postgresql","searchable-encryption","security"],"latest_commit_sha":null,"homepage":"https://cipherstash.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cipherstash.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-07T21:53:37.000Z","updated_at":"2025-03-14T00:14:06.000Z","dependencies_parsed_at":"2025-03-14T04:27:06.365Z","dependency_job_id":null,"html_url":"https://github.com/cipherstash/proxy","commit_stats":null,"previous_names":["cipherstash/proxy"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipherstash%2Fproxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipherstash%2Fproxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipherstash%2Fproxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cipherstash%2Fproxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cipherstash","download_url":"https://codeload.github.com/cipherstash/proxy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243920578,"owners_count":20369077,"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":["encryption-in-use","postgresql","searchable-encryption","security"],"created_at":"2025-03-16T19:35:52.822Z","updated_at":"2025-03-16T19:35:53.516Z","avatar_url":"https://github.com/cipherstash.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg alt=\"CipherStash Logo\" loading=\"lazy\" width=\"128\" height=\"128\" decoding=\"async\" data-nimg=\"1\"   style=\"color:transparent\" src=\"https://cipherstash.com/assets/cs-github.png\"\u003e\n  \u003c/br\u003e\n  Proxy\n\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  Implement robust data security without sacrificing performance or usability\n  \u003cbr/\u003e\n  \u003cdiv align=\"center\" style=\"display: flex; justify-content: center; gap: 1rem;\"\u003e\n    \u003ca href=\"https://cipherstash.com\"\u003e\n      \u003cimg\n        src=\"https://raw.githubusercontent.com/cipherstash/meta/refs/heads/main/csbadge.svg\"\n        alt=\"Built by CipherStash\"\n      /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://hub.docker.com/r/cipherstash/proxy\"\u003e\n      \u003cimg\n        alt=\"Docker Pulls\"\n        src=\"https://img.shields.io/docker/pulls/cipherstash/proxy?style=for-the-badge\u0026labelColor=000000\"\n      /\u003e\n    \u003c/a\u003e\n  \u003c/div\u003e\n\u003c/p\u003e\n\u003cbr/\u003e\n\n\u003c!-- start --\u003e\n\nCipherStash Proxy provides a transparent proxy to your existing postgres database, handling the complexity of encrypting and decrypting your data.\nCipherStash Proxy keeps your sensitive data in PostgreSQL encrypted and searchable, without changing your SQL queries.\n\nBehind the scenes, it uses the [Encrypt Query Language](https://github.com/cipherstash/encrypt-query-language/) to index and search encrypted data.\n\n## Table of contents\n\n- [Getting started](#getting-started)\n- [How-to](#how-to)\n  - [Installing Proxy](#installing-proxy)\n  - [Configuring Proxy](#configuring-proxy)\n    - [Configuring Proxy with environment variables](#configuring-proxy-with-environment-variables)\n    - [Configuring Proxy with a TOML file](#configuring-proxy-with-a-toml-file)\n  - [Running Proxy locally](#running-proxy-locally)\n  - [Setting up the database schema](#setting-up-the-database-schema)\n    - [Creating columns with the right types](#creating-columns-with-the-right-types)\n  - [Encrypting data in an existing database](#encrypting-data-in-an-existing-database)\n    - [Usage](#usage)\n    - [How it works](#how-it-works)\n    - [Configuration](#configuration)\n    - [Example usage](#example-usage)\n- [Reference](#reference)\n  - [Proxy config options](#proxy-config-options)\n  - [Prometheus metrics](#prometheus-metrics)\n    - [Available metrics](#available-metrics)\n  - [`encrypt` tool config options](#encrypt-tool-config-options)\n- [More info](#more-info)\n  - [Developing for Proxy](#developing-for-proxy)\n\n## Getting started\n\n\u003e [!IMPORTANT]\n\u003e **Prerequisites:** Before you start you need to have this software installed:\n\u003e  - [Docker](https://www.docker.com/) — see Docker's [documentation for installing](https://docs.docker.com/get-started/get-docker/)\n\nGet up and running in local dev in \u003c 5 minutes:\n\n```bash\n# Clone the repo\ngit clone https://github.com/cipherstash/proxy\ncd proxy\n\n# Setup your CipherStash configuration\nstash setup\n# TODO: get the config into a format cipherstash-proxy can read\n\n# Start the containers\ndocker compose up\n# TODO: Install a database schema: https://docs.docker.com/compose/how-tos/lifecycle/\n\n# TODO: Run a query\npsql postgres://${CS_DATABASE__USERNAME}:${CS_DATABASE__PASSWORD}@localhost:6432/cipherstash\n\n# TODO: Verify the data is encrypted\npsql postgres://${CS_DATABASE__USERNAME}:${CS_DATABASE__PASSWORD}@postgres:5432/cipherstash\n```\n\n## How-to\n\nThis section contains how-to documentation for installing, configuring, and running CipherStash Proxy.\n\n### Installing Proxy\n\nCipherStash Proxy is available as a [container image](https://hub.docker.com/r/cipherstash/proxy) on Docker Hub that can be deployed locally, in CI/CD, through to production.\n\nThe easiest way to start using CipherStash Proxy with your application is by adding a container to your application's `docker-compose.yml`.\nThe following is an example of what adding CipherStash Proxy to your app's `docker-compose.yml` might look like:\n\n```yaml\nservices:\n  app:\n    # Your Postgres container config\n  db:\n    # Your Postgres container config\n  proxy:\n    image: cipherstash/proxy:latest\n    container_name: proxy\n    ports:\n      - 6432:6432\n      - 9930:9930\n    environment:\n      # Hostname of the Postgres database server connections will be proxied to\n      - CS_DATABASE__HOST=${CS_DATABASE__HOST}\n      # Port of the Postgres database server connections will be proxied to\n      - CS_DATABASE__PORT=${CS_DATABASE__PORT}\n      # Username of the Postgres database server connections will be proxied to\n      - CS_DATABASE__USERNAME=${CS_DATABASE__USERNAME}\n      # Password of the Postgres database server connections will be proxied to\n      - CS_DATABASE__PASSWORD=${CS_DATABASE__PASSWORD}\n      # The database name on the Postgres database server connections will be proxied to\n      - CS_DATABASE__NAME=${CS_DATABASE__NAME}\n      # The CipherStash workspace ID for making requests for encryption keys\n      - CS_AUTH__WORKSPACE_ID=${CS_AUTH__WORKSPACE_ID}\n      # The CipherStash client access key for making requests for encryption keys\n      - CS_AUTH__CLIENT_ACCESS_KEY=${CS_AUTH__CLIENT_ACCESS_KEY}\n      # The CipherStash dataset ID for generating and retrieving encryption keys\n      - CS_ENCRYPT__DATASET_ID=${CS_ENCRYPT__DATASET_ID}\n      # The CipherStash client ID used to programmatically access a dataset\n      - CS_ENCRYPT__CLIENT_ID=${CS_ENCRYPT__CLIENT_ID}\n      # The CipherStash client key used to programmatically access a dataset\n      - CS_ENCRYPT__CLIENT_KEY=${CS_ENCRYPT__CLIENT_KEY}\n      # Toggle Prometheus exporter for CipherStash Proxy operations\n      - CS_PROMETHEUS__ENABLED=${CS_PROMETHEUS__ENABLED:-true}\n```\n\nFor a fully-working example, go to [`docker-compose.yml`](./docker-compose.yml). Follow the steps in [Getting started](#getting-started) to see it in action.\n\nOnce you have set up a `docker-compose.yml`, start the Proxy container:\n\n```bash\ndocker compose up\n```\n\nConnect your PostgreSQL client to Proxy on TCP 6432.\nPoint [Prometheus to scrape metrics](#prometheus-metrics) on TCP 9930.\n\n### Configuring Proxy\n\nTo run, CipherStash Proxy needs to know:\n\n- What port to run on\n- How to connect to the target PostgreSQL database\n- Secrets to authenticate to CipherStash\n\nThere are two ways to configure Proxy:\n\n- [With environment variables that Proxy looks up on startup](#configuring-proxy-with-environment-variables)\n- [With a TOML file that Proxy reads on startup](#configuring-proxy-with-a-toml-file)\n\nProxy's configuration loading order of preference is:\n\n1. If `cipherstash-proxy.toml` is present in the current working directory, Proxy will read its config from that file\n1. If `cipherstash-proxy.toml` is not present, Proxy will look up environment variables to configure itself\n1. If **both** `cipherstash-proxy.toml` and environment variables are present, Proxy will use `cipherstash-proxy.toml` as the base configuration, and override it with any environment variables that are set\n\nSee [Proxy config options](#proxy-config-options) for all the available options.\n\n#### Configuring Proxy with environment variables\n\nIf you are configuring Proxy with environment variables, these are the minimum environment variables required to run Proxy:\n\n```bash\nCS_DATABASE__NAME\nCS_DATABASE__USERNAME\nCS_DATABASE__PASSWORD\nCS_AUTH__WORKSPACE_ID\nCS_AUTH__CLIENT_ACCESS_KEY\nCS_ENCRYPT__DATASET_ID\nCS_ENCRYPT__CLIENT_ID\nCS_ENCRYPT__CLIENT_KEY\n```\n\nRead the full list of environment variables and what they do in the [reference documentation](#proxy-config-options).\n\n#### Configuring Proxy with a TOML file\n\nIf you are configuring Proxy with a `cipherstash-proxy.toml` file, these are the minimum values required to run Proxy:\n\n```toml\n[database]\nname = \"cipherstash\"\nusername = \"cipherstash\"\npassword = \"password\"\n\n[auth]\nworkspace_id = \"cipherstash-workspace-id\"\nclient_access_key = \"cipherstash-client-access-key\"\n\n[encrypt]\ndataset_id = \"cipherstash-dataset-id\"\nclient_id = \"cipherstash-client-id\"\nclient_key = \"cipherstash-client-key\"\n```\n\nRead the full list of configuration options and what they do in the [reference documentation](#proxy-config-options).\n\n### Running Proxy locally\n\nTODO: Add instructions for running Proxy locally\n\n### Setting up the database schema\n\nTODO: Add instructions for setting up the database schema\n\n#### Creating columns with the right types\n\nTODO: Add instructions for creating columns with the right types\n\n## Encrypting data in an existing database\n\nCipherStash Proxy includes an `encrypt` tool – a CLI application to encrypt existing data, or to apply index changes after changes to the encryption configuration of a protected database.\n\n### Usage\n\nEncrypt the `source` column data in `table` into the specified encrypted `target` column.\nThe `encrypt` tool connects to CipherStash Proxy using the `cipherstash.toml` configuration or `ENV` variables.\n\n```\ncipherstash-proxy encrypt [OPTIONS] --table \u003cTABLE\u003e  --columns \u003cSOURCE_COLUMN=TARGET_COLUMN\u003e...\n```\n\n### How it works\n\nAt a high-level, the process for encrypting a column in the database is:\n\n1. Add a new encrypted destination column with the appropriate encryption configuration.\n2. Using CipherStash Proxy to process:\n  1. Select from the original plaintext column.\n  2. Update the encrpted column to set the plaintext value.\n3. Drop the original plaintext column.\n4. Rename the encrypted column to the original plaintext column name.\n\nThe CipherStash Proxy `encrypt` tool automates the data process to encrypt one or more columns in a table.\nUpdates are executed in batches of 100 records (and the `batch_size` is configurable).\nThe process is idempotent and can be run repeatedly.\n\n### Configuration\n\nThe CipherStash Proxy `encrypt` tool reuses the CipherStash Proxy configuration for the Proxy connection details. See [`encrypt` tool config options](#encrypt-tool-config-options) for the available options.\n\n{% callout title=\"Connection\" %}\nConnection to CipherStash Proxy reuses Proxy configuration:\n - server host\n - server port\n - database username\n - database password\n - database name\n{% /callout %}\n\n### Example usage\n\nGiven a running instance of CipherStash Proxy and a `users` table with:\n - `id` – a primary key column\n - `email` – a source plaintext column\n - `encrypted_email` – a destination column configured to be encrypted text.\n\nEncrypt `email` into `encrypted_email`:\n\n```bash\ncipherstash-proxy encrypt --table users --columns email=encrypted_email\n```\n\nSpecify the primary key column:\n\n```bash\ncipherstash-proxy encrypt --table users --columns email=encrypted_email --primary-key user_id\n```\n\nSpecify multiple primary key columns (compound primary key):\n\n```bash\ncipherstash-proxy encrypt --table users --columns email=encrypted_email --primary-key user_id tenant_id\n```\n\n## Reference\n\nThis section contains reference documentation for configuring CipherStash Proxy and its features.\n\n### Proxy config options\n\nYou can configure CipherStash Proxy with a config file, enviroment variables, or a combination of the two – see [Configuring Proxy](#configuring-proxy) for instructions.\n\nThe following are all the configuration options available for Proxy, with their equivalent environment variables:\n\n```toml\n\n[server]\n# Proxy host address\n# Optional\n# Default: `0.0.0.0`\n# Env: CS_SERVER__HOST\nhost = \"0.0.0.0\"\n\n# Proxy host posgt\n# Optional\n# Default: `6432`\n# Env: CS_SERVER__PORT\nport = \"6432\"\n\n# Enforce TLS connections\n# Optional\n# Default: `false`\n# Env: CS_SERVER__REQUIRE_TLS\nrequire_tls = \"false\"\n\n# Shutdown timeout in ms\n# Sets how long to wait for connections to drain on shutdown\n# Optional\n# Default: `2000`\n# Env: CS_SERVER__SHUTDOWN_TIMEOUT\nshutdown_timeout = \"2000\"\n\n\n# Number of worker threads the server should use\n# Optional\n# Default: `NUMBER_OF_CORES/2` or `4`\n# Env: CS_SERVER__WORKER_THREADS\nworker_threads = \"4\"\n\n\n# Thread stack size in bytes\n# Optional\n# Default: `2 * 1024 * 1024` (2MiB) or `4 * 1024 * 1024` (4MiB) if log level is DEBUG or TRACE\n# Env: CS_SERVER__THREAD_STACK_SIZE\nthread_stack_size = \"2097152\"\n\n\n[database]\n# Database host address\n# Optional\n# Default: `0.0.0.0`\n# Env: CS_DATABASE__HOST\nhost = \"0.0.0.0\"\n\n# Database host post\n# Optional\n# Default: `5432`\n# Env: CS_DATABASE__PORT\nport = \"5432\"\n\n# Database name\n# Env: CS_DATABASE__NAME\nname = \"database\"\n\n# Database username\n# Env: CS_DATABASE__USERNAME\nusername = \"username\"\n\n# Database password\n# Env: CS_DATABASE__PASSWORD\npassword = \"password\"\n\n# Connection timeout in ms\n# Sets how long to hold an open connection\n# Optional\n# Default: `300000` (5 minutes)\n# Env: CS_DATABASE__SHUTDOWN_TIMEOUT\nconnection_timeout = \"300000\"\n\n# Enable TLS verification\n# Optional\n# Default: `false`\n# Env: CS_DATABASE__WITH_TLS_VERIFICATION\nwith_tls_verification = \"false\"\n\n# Encrypt configuration reload interval in sec\n# Sets how frequently Encrypted index configuration should be reloaded\n# The configuration specifies the encrypted columns in the database\n# Optional\n# Default: `60`\n# Env: CS_DATABASE__CONFIG_RELOAD_INTERVAL\nconfig_reload_interval = \"60\"\n\n# Schema configuration reload interval in sec\n# Sets how frequently the database schema should be reloaded\n# The schema is used to analyse SQL statements\n# Optional\n# Default: `60`\n# Env: CS_DATABASE__SCHEMA_RELOAD_INTERVAL\nschema_reload_interval = \"60\"\n\n\n[tls]\n# Certificate path\n# Env: CS_TLS__CERTIFICATE\ncertificate = \"./server.cert\"\n\n# Private Key path\n# Env: CS_TLS__PRIVATE_KEY\nprivate_key = \"./server.key\"\n\n\n[auth]\n# CipherStash Workspace ID\n# Env: CS_AUTH__WORKSPACE_ID\nworkspace_id = \"cipherstash-workspace-id\"\n\n# CipherStash Client Access Key\n# Env: CS_AUTH__CLIENT_ACCESS_KEY\nclient_access_key = \"cipherstash-client-access-key\"\n\n[encrypt]\n# CipherStash Dataset ID\n# Env: CS_ENCRYPT__DATASET_ID\ndataset_id = \"cipherstash-dataset-id\"\n\n# CipherStash Client ID\n# Env: CS_ENCRYPT__CLIENT_ID\nclient_id = \"cipherstash-client-id\"\n\n# CipherStash Client Key\n# Env: CS_ENCRYPT__CLIENT_KEY\nclient_key = \"cipherstash-client-key\"\n\n\n[log]\n# Log level\n# Optional\n# Valid values: `error | warn | info | debug | trace`\n# Default: `info`\n# Env: CS_LOG__LEVEL\nlevel = \"info\"\n\n# Log format\n# Optional\n# Valid values: `pretty | text | structured (json)`\n# Default: `pretty`\n# Env: CS_LOG__FORMAT\nformat = \"pretty\"\n\n# Log format\n# Optional\n# Valid values: `stdout | stderr`\n# Default: `info`\n# Env: CS_LOG__OUTPUT\noutput = \"stdout\"\n\n# Enable ansi (colored) output\n# Optional\n# Default: `true`\n# Env: CS_LOG__ANSI_ENABLED\nansi_enabled = \"true\"\n\n\n[prometheus]\n# Enable prometheus stats\n# Optional\n# Default: `false`\n# Env: CS_PROMETHEUS__ENABLED\nenabled = \"false\"\n\n# Prometheus exporter post\n# Optional\n# Default: `9930`\n# Env: CS_PROMETHEUS__PORT\nport = \"9930\"\n```\n\n\n### Prometheus metrics\n\nTo enable a Prometheus exporter on the default port (`9930`) use either:\n\n```toml\n[prometheus]\nenabled = \"true\"\n```\n\n```env\nCS_PROMETHEUS__ENABLED = \"true\"\n```\n\nWhen enabled, metrics can be accessed via `http://localhost:9930/metrics`.\nIf the proxy is running on a host other than localhost, access on that host.\n\n\n#### Available metrics\n\n| Name                                                  | Target    | Description                                                                 |\n|-------------------------------------------------------|-----------|-----------------------------------------------------------------------------|\n| `cipherstash_proxy_clients_active_connections`        | Gauge     | Current number of connections to CipherStash Proxy from clients             |\n| `cipherstash_proxy_clients_bytes_received_total`      | Counter   | Number of bytes received by CipherStash Proxy from clients                  |\n| `cipherstash_proxy_clients_bytes_sent_total`          | Counter   | Number of bytes sent from CipherStash Proxy to clients                      |\n| `cipherstash_proxy_decrypted_values_total`            | Counter   | Number of individual values that have been decrypted                        |\n| `cipherstash_proxy_decryption_duration_seconds`       | Histogram | Duration of time CipherStash Proxy spent performing decryption operations   |\n| `cipherstash_proxy_decryption_duration_seconds_count` | Counter   | Number of observations of requests to CipherStash ZeroKMS to decrypt values |\n| `cipherstash_proxy_decryption_duration_seconds_sum`   | Counter   | Total time CipherStash Proxy spent performing decryption operations         |\n| `cipherstash_proxy_decryption_error_total`            | Counter   | Number of decryption operations that were unsuccessful                      |\n| `cipherstash_proxy_decryption_requests_total`         | Counter   | Number of requests to CipherStash ZeroKMS to decrypt values                 |\n| `cipherstash_proxy_encrypted_values_total`            | Counter   | Number of individual values that have been encrypted                        |\n| `cipherstash_proxy_encryption_duration_seconds`       | Histogram | Duration of time CipherStash Proxy spent performing encryption operations   |\n| `cipherstash_proxy_encryption_duration_seconds_count` | Counter   | Number of observations of requests to CipherStash ZeroKMS to encrypt values |\n| `cipherstash_proxy_encryption_duration_seconds_sum`   | Counter   | Total time CipherStash Proxy spent performing encryption operations         |\n| `cipherstash_proxy_encryption_error_total`            | Counter   | Number of encryption operations that were unsuccessful                      |\n| `cipherstash_proxy_encryption_requests_total`         | Counter   | Number of requests to CipherStash ZeroKMS to encrypt values                 |\n| `cipherstash_proxy_rows_encrypted_total`              | Counter   | Number of encrypted rows returned to clients                                |\n| `cipherstash_proxy_rows_passthrough_total`            | Counter   | Number of non-encrypted rows returned to clients                            |\n| `cipherstash_proxy_rows_total`                        | Counter   | Total number of rows returned                                               |\n| `cipherstash_proxy_server_bytes_received_total`       | Counter   | Number of bytes CipherStash Proxy received from the PostgreSQL server       |\n| `cipherstash_proxy_server_bytes_sent_total`           | Counter   | Number of bytes CipherStash Proxy sent to the PostgreSQL server             |\n| `cipherstash_proxy_statements_duration_seconds`       | Histogram | Duration of time CipherStash Proxy spent executing SQL statements           |\n| `cipherstash_proxy_statements_duration_seconds_count` | Count     | Number of observations of CipherStash Proxy statement duration              |\n| `cipherstash_proxy_statements_duration_seconds_sum`   | Count     | Total time CipherStash Proxy spent executing SQL statements                 |\n| `cipherstash_proxy_statements_encrypted_total`        | Counter   | Number of SQL statements that required encryption                           |\n| `cipherstash_proxy_statements_passthrough_total`      | Counter   | Number of SQL statements that did not require encryption                    |\n| `cipherstash_proxy_statements_total`                  | Counter   | Total number of SQL statements processed by CipherStash Proxy               |\n| `cipherstash_proxy_statements_unmappable_total`       | Counter   | Total number of unmappable SQL statements processed by CipherStash Proxy    |\n\n### `encrypt` tool config options\n\n| Option                  | Description                                                    | Default         |\n| ----------------------- | -------------------------------------------------------------- | --------------- |\n| `-t`, `--table`         | Specifies the table to migrate                                 | None (Required) |\n| `-c`, `--columns`       | List of columns to migrate (space-delimited key=value pairs)   | None (Required) |\n| `-k`, `--primary-key`   | List of primary key columns (space-delimited)                  | `id`            |\n| `-b`, `--batch-size`    | Number of records to process at once                           | `100`           |\n| `-d`, `--dry-run`       | Runs without updating. Loads data but does not perform updates | None (Optional) |\n| `-v`, `--verbose`       | Turn on additional logging output                              | None (Optional) |\n| `-h`, `--help`          | Displays this help message                                     | -               |\n\n\n\n## More info\n\n### Developing for Proxy\n\nCheck out the [Proxy development guide](./DEVELOPMENT.md).\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcipherstash%2Fproxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcipherstash%2Fproxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcipherstash%2Fproxy/lists"}