{"id":21296850,"url":"https://github.com/reddec/git-pipe","last_synced_at":"2025-08-01T04:15:28.441Z","repository":{"id":64307508,"uuid":"383409782","full_name":"reddec/git-pipe","owner":"reddec","description":"Hassle-free minimal CI/CD for git repositories with docker or docker-compose projects.","archived":false,"fork":false,"pushed_at":"2021-07-30T15:41:24.000Z","size":322,"stargazers_count":53,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-07-02T11:02:00.632Z","etag":null,"topics":["ci-cd","docker","docker-compose","git","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reddec.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["http://reddec.net/about/#donate"]}},"created_at":"2021-07-06T09:16:28.000Z","updated_at":"2024-02-13T00:21:26.000Z","dependencies_parsed_at":"2023-01-15T11:00:42.098Z","dependency_job_id":null,"html_url":"https://github.com/reddec/git-pipe","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/reddec/git-pipe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reddec%2Fgit-pipe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reddec%2Fgit-pipe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reddec%2Fgit-pipe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reddec%2Fgit-pipe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reddec","download_url":"https://codeload.github.com/reddec/git-pipe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reddec%2Fgit-pipe/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264862463,"owners_count":23674978,"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":["ci-cd","docker","docker-compose","git","golang"],"created_at":"2024-11-21T14:30:04.357Z","updated_at":"2025-07-11T17:31:58.934Z","avatar_url":"https://github.com/reddec.png","language":"Go","funding_links":["http://reddec.net/about/#donate"],"categories":[],"sub_categories":[],"readme":"# GIT-PIPE\n\n![logo](_docs/logo.png?raw=true)\n\n\nHassle-free minimal CI/CD for git repos for docker-based projects.\n\nFeatures:\n\n* zero configuration for repos by default\n* automatic encrypted backup and recover via different providers including plain files or S3\n* optional automatic TLS by Let's Encrypt\n* optional automatic domain registration by supported providers\n* minimal additional overhead\n* multiple repos at once without ports conflicts\n\n## How does it work\n\ngit-pipe does for you:\n\n1. Clone/fetch remote repository\n2. Detect [packaging type](#supported-repo-types)\n3. Build package\n4. Restore [backup](#backup) (if applicable)\n5. Starts container(s)\n6. Creates [proxy router](#router)\n7. (optional) Registers [DNS](#supported-providers)\n8. (optional) Generates [TLS certificates](#run) by Let's Encrypt HTTP-01 ACME\n9. (background) Regularly creates [backup](#backup)\n10. Starts from (1) in case something changes in repo\n\n## Minimal working example\n\nFor installation from binaries:\n\n    git-pipe run https://github.com/kassambara/wordpress-docker-compose.git\n\nOr for docker installation:\n\n    docker run -p 127.0.0.1:8080:80 -v /var/run/docker.sock:/var/run/docker.sock reddec/git-pipe run https://github.com/kassambara/wordpress-docker-compose.git\n\nWhere:\n\n* `-p 127.0.0.1:8080:80` - docker instruction to expose port 8080 to localhost\n* `-v /var/run/docker.sock:/var/run/docker.sock` - expose docker control socket to git-pipe\n* `https://github.com/kassambara/wordpress-docker-compose.git` - repo to pull and build (literally I picked just random\n  one. Could be several repos)\n\nCheck [usage section](#usage) for details.\n\nWait a bit to finish building and go to\n\n* http://wordpress.wordpress-docker-compose.localhost:8080 - wordpress app\n* http://phpmyadmin.wordpress-docker-compose.localhost:8080 - for phpmyadmin app\n\n## Automatic UI/dashboard\n\nIndex page automatically generated for unknown domain. Ex: http://localhost:8080\n\n![image](https://user-images.githubusercontent.com/6597086/127631968-85a8eaa9-1605-4ca0-ba52-7943da536d1a.png)\n\n\n\n## Supported OS\n\n* `linux` - high priority\n* `darwin` - (i-wish-i-had-a-mac priority) should work...\n* `windows` - (community support) maybe works, never tested but compiled\n\n## Future goals\n\n* [ ] zero-deps: replace OpenSSL, git, ssh and docker-compose to Go-native variants\n* [ ] file config: support file-based per repo configurations\n* [ ] authorization: \n  *  [x] by JWT \n  *  [ ] OIDC\n* [ ] support dynamic reconfiguration (over API/by file watch + signal)\n* [ ] support GitHub-like webhooks\n* [ ] lazy initialization (ie: bring up service on request only)\n* [x] path routing as alternative to domain-based\n\n## Installation\n\n\n\n### Requirements\n\n* `docker`\n* `docker-compose`\n* `git`\n* `openssl` - for backup en(de)cryption\n\nDuring the first deployment, the following images will be downloaded automatically from docker repository\n\n* busybox\n\n\n\n### Pre-built binary\n\nDownload binary for your OS and arch from [github releases](https://github.com/reddec/git-pipe/releases/latest).\n\n\n\n### Docker\n\nVersions\n\n- `reddec/git-pipe:\u003cversion\u003e` - all-in-one image, Alpine based\n- `reddec/git-pipe:\u003cversion\u003e-light` - without docker-compose\n\nTo download the latest version use:\n\n    docker pull reddec/git-pipe:latest\n\n\n\n### Debian/Ubuntu installation\n\nDownload and install required .deb file from [github releases](https://github.com/reddec/git-pipe/releases/latest).\n\n**It is highly recommended** to install [docker](https://docs.docker.com/engine/install/ubuntu/) and\n[docker-compose](https://docs.docker.com/compose/install/) from the official Docker repository instead of APT. APT repos could be very outdated.\n\n\n\n## Supported repo types\n\n\n\n### docker-compose\n\nRequires docker-compose.yaml or docker-compose.yaml file in the root directory.\nSee [specific configuration](#docker-compose) details;\n\nFlow:\n\n- `build` equal to `docker-compose build`\n- `start` equal to `docker-compose up`\n\n\n\n### docker\n\nRequires Dockerfile in the root directory. Will be executed as-is.\n\nFlow:\n\n- `build` equal to `docker build`\n- `start` equal to `docker run`\n\n## Docker Compose\n\n\u003e tested on docker-compose 1.27\n\n* Deploys all services.\n* All ports in `ports` directive will be linked as sub-domains\n* Each service with at least one port supports an optional `domainname` attribute which overrides sub-domain. Default is\n  service name.\n* First services with attribute `x-root: yes` or with name `www`, `web`, `gateway` will be additionally exposed without\n  sub-domain.\n* All exposed ports will be additionally exposed as sub-sub-domain with port name as the name.\n* Volumes automatically backup-ed and restored (see Backup)\n* Root port for service picked by the same rules as for [docker](#docker)\n\nDomains will be generated as\u003e `\u003cport?\u003e.\u003cx-domain|service\u003e.\u003cx-domain|project\u003e.\u003croot-domain\u003e`\nand `\u003cx-domain|project\u003e.\u003croot-domain\u003e` points to `\u003cfirst x-root: true|www|web|gateway\u003e`\n\n\n\n### Minimal example:\n\n```yaml\nversion: '3'\nservices:\n  web:\n    image: nginx\n    ports:\n      - 8080:80\n      - 8081:9000\n  api:\n    image: hashicorp/http-echo\n    command: -listen :80 -text \"web\"\n    ports:\n      - 8082:80\n```\n\nRepo name: github.com/example/mini\n\nGenerated mapping (root domain (`-d,--domain,$DOMAIN`) is `localhost`):\n\n* `web.mini.localhost` - points to `web` service to internal port `80` (the first port in array)\n* `80.web.mini.localhost` - same\n* `9000.web.mini.localhost` - points to `web` service to internal port `9000`\n* `api.mini.localhost` - points `api` service to internal port `80`\n* `80.api.mini.localhost` - same\n\nRoot domain: `mini.localhost` points to `web` service to internal port `80` (the first service with name `web`, first\nport in array)\n\n\n\n### Override everything example\n\n```yaml\nversion: '3'\nservices:\n  web:\n    domainname: index\n    image: nginx\n    ports:\n      - 8080:80\n      - 8081:9000\n  api:\n    domainname: echo\n    x-root: yes\n    image: hashicorp/http-echo\n    command: -listen :80 -text \"web\"\n    ports:\n      - 8082:80\n```\n\nRepo name: github.com/example/mini\n\nGenerated mapping (root domain (`-d,--domain,$DOMAIN`) is `localhost`):\n\n* `index.super.localhost` - points to `web` service to internal port `80` (the first port in array)\n* `80.index.super.localhost` - same\n* `9000.index.super.localhost` - points to `web` service to internal port `9000`\n* `echo.super.localhost` - points `api` service to internal port `80`\n* `80.echo.super.localhost` - same\n\nRoot domain: `super.localhost` points to `api` service to internal port `80` (the first service with `x-root: yes`,\nfirst port in array)\n\n\n## Backup\n\nFor the single Dockerfile setup:\n\n- All defined `VOLUME` section in Dockerfile will be added to the archive.\n\nFor docker-compose setup:\n\n- All non-external, local (driver `local` or empty) volumes defined in `volumes:` section in full notation will be added\n  to archive.\n\nBackup interval defined by `-I,--backup-interval,$BACKUP_INTERVAL` and by default equal to `1h` (every 1 hour).\n\nThe default encryption is symmetric AES-256 CBC done by OpenSSL. Encryption key defined in `--backup-key,-K,$BACKUP_KEY` and\nby-default equal to `git-pipe-change-me`.\n\nRestore will be done **automatically** before the first run.\n\n\n\n### Supported destination\n\nDefined by `-B,--backup,$BACKUP`. Default is `file://backups`\n\n* `file://\u003cdirectory\u003e` - archive in directory. Creates temp (`.!tmp` suffix) during backup.\n* `s3://\u003cid\u003e:\u003csecret\u003e@\u003cendpoint\u003e/\u003cbucket\u003e[?params]` - upload/download to/from S3-like storage\n* `\u003cempty\u003e` or `none` - disable backup\n\nS3 query params:\n\nThe bucket should be created by an administrator.\n\n* `force_path=true|false`, default `false` - force use path style for buckets. Required for Minio\n* `region=\u003cname\u003e`, default `us-west-1` - region\n* `disable_ssl=true|false`, default `false`, disable SSL for endpoint\n\n**Example for local Minio**:\n\nLaunch minio: `docker run -p 9000:9000 minio/minio server /data`\n\nBackup URL: `s3://minioadmin:minioadmin@127.0.0.1:9000/backups?force_path=true\u0026disable_ssl=true`\n\n**Example for BackBlaze (B2)**:\n\n* Obtain id and secret from [admin panel](https://secure.backblaze.com/app_keys.htm)\n* Copy information about region and bucket name [in dashboard](https://secure.backblaze.com/b2_buckets.htm)\n\nBackup URL: `s3://\u003cid\u003e:\u003csecret\u003e@s3.\u003cregion\u003e.backblazeb2.com/\u003cbucket name\u003e`\n\n\u003e (B2) There is some lag between backup and availability to download. Usually, it's around 2-5 minutes for me. \n\n\n## Git\n\ngit-pipe uses `git` executable so all configuration from `~/.git` is supported.\n\nIt is a good idea to generate deployment SSH keys with read-only access for production usage, however, it is not\nmandatory.\n\n\n## Run\n\n\n\n### As binary\n\n    git-pipe [flags..] \u003crepo, ...\u003e\n\nSee [usage](#usage) for a list of all available flags.\n\n**Localhost example:**\n\n    git-pipe run https://github.com/kassambara/wordpress-docker-compose.git\n\n**Expose to the public:**\n\n    git-pipe run -b 0.0.0.0:8080 https://github.com/kassambara/wordpress-docker-compose.git\n\n**Public and with Let's Encrypt certificates:**\n\n    git-pipe run --auto-tls https://github.com/kassambara/wordpress-docker-compose.git\n\n`--auto-tls` implies binding to `0.0.0.0:443` and automatic certificates by HTTP-01 ACME protocol.\n\nThe node should be accessible from the public internet by 443 port and routed by the domain name. Generally, there are\ntwo universal methods of how to route traffic from the unknown amount of domains to the machine:\n\n1. Route wildcard `*` sub-domain to the node and use the sub-domain as root domain in git-pipe. For example: for\n   wildcard domain `*.apps.mydomain.com`, git-pipe should be launched with flag `-d apps.mydomain.com`\n2. Use automatic DNS registration from [providers](#supported-providers)\n\n\n\n### As docker\n\nVersion:\n\n- `reddec/git-pipe:\u003cversion\u003e` - all-in-one image, Alpine based\n- `reddec/git-pipe:\u003cversion\u003e-light` - without docker-compose\n\n**Basic**\n\n`docker run -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock reddec/git-pipe run \u003cflags same as for bin\u003e`\n\n**Expose to the public with TLS**\n\nIt's better to have **wildcard** certificate.\n\nIn `./certs` should be file `server.key` and `server.crt`.\n\n`docker run -p 443:443 -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd)/certs:/app/ssl reddec/git-pipe run --tls \u003cflags same as for bin\u003e`\n\n**Automatic TLS**\n\nUses Let's Encrypt ACME HTTP-01 protocol.\n\n`docker run -p 443:443 -v /var/run/docker.sock:/var/run/docker.sock reddec/git-pipe run --auto-tls \u003cflags same as for bin\u003e`\n\n**Private repos**\n\nFeel free to mount SSH socket:\n\n`docker run -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent reddec/git-pipe run ...`\n\nBy default, SSH will be used without strict host checking. To harden pulling you may mount your own config\nto `/root/.ssh/config`.\n\n\n\n#### Volumes\n\n`/app/backups` - default directory for backups. Will not be used in case of non-file (ex: S3) backup. Without S3 it\nmakes sense to persist this volume.\n\n`/app/repos` - default directory for cloned repository. It is not critical to persist this volume because git-pipe can\nre-download repos anytime.\n\n`/app/ssl` - default directory for certificates. In the case of `auto-tls` it will be used to cache keys and certs, so I\n**highly recommended** to persist this volume to prevent hitting rate-limit from Let's Encrypt.\n\nIn case you are using your certificates, you should them as `server.key` and `server.crt` and you may mount them in\nread-only mode.\n\n## Environment variables\n\n`git-pipe` will pass the environment to the packs by prefix: where prefix is repo name (simple or FQDN - depends on setup)\nin upper case with dash replaced to underscore. Passed keys will be trimmed from suffix: `TINC_BOOT_X_Y_Z` will be\npassed as `X_Y_Z`.\n\nEnvironment variables can be passed by system-level and/or from file `-e, --env-file path/to/file`. Env files can be defined several times.\nEach next file overwrites the previous value with the same key. Latest goes system environment, which means that system's\nenvironment variables have the highest priority.\n\nBasic example:\n\n* repo: https://example.com/example/my-example.git\n\nLet's guess that the application needs a database URL which you don't want to expose in the repo. App needs variable\n`DB_URL`.\n\nBy default, we need to pass it as `MY_EXAMPLE_DB_URL=something` because\n\n- Repo name is `my-example` which converted to `MY_EXAMPLE_` prefix\n- Variable name `DB_URL`\n\nIn case you used `--fqdn` you should specify the full name of repo: `MY_EXAMPLE.EXAMPLE.EXAMPLE.COM_DB_URL`.\n\n\n\n\n### docker\n\nTrivial: just use environment variables as-is.\n\n\n\n### docker-compose\n\nTo use env variables in compose\nuse [variables substitution](https://docs.docker.com/compose/environment-variables/#substitute-environment-variables-in-compose-files):\n\n```yaml\nversion: '3'\nservices:\n  app:\n    image: my-app:latest\n    environment:\n      DB_URL: \"${DB_URL:-localhost}\"\n```\n\n\n## Router\n\nRouter (proxy) provides reverse-proxy concept.\n\n`-D, --dummy, $DUMMY` disables router completely. Could be useful for services deployed without HTTP services.\n\n\n\n### Domain routing\n\nBy-default, each repo and service deployed as separated domain. Root domain can be defined in `-d,--domain,$DOMAIN`.\n\n\n\n### Path routing\n\nIn case multiple domains is not an option the path-based routing can be useful. Enabled by\nflag `-P,--path-routing,$PATH_ROUTING` which means that services will be under the same domain, but under different path\nprefixes. In this mode, `--domain` flag will not be used for services name,\nhowever, it still required for automatic TLS. \n\n\n\n## DNS\n\ngit-pipe uses domain-based routing system which means that all exposed deployed containers will be externally accessible\nby unique domain.\n\nTo support automatic TLS certificates and DNS routing allocated domains should be routed by the DNS provider. It could\nbe done in several ways:\n\n1. Wildcard `*` sub-domain pointed to the git-pipe node with the sub-domain as root domain in git-pipe. For example: for\n   wildcard domain `*.apps.mydomain.com`, git-pipe should be launched with flag `-d apps.mydomain.com`\n2. With selected DNS providers it's possible to register domains automatically:\n   use flag `-p, --provider, $PROVIDER` and provider-specific flags.\n\n\n\n### Supported providers\n\n\n\n#### Cloudflare\n\nProvider name: `cloudflare`\n\nRequires API-Token for the zone in which you want to register sub-domains.\n\nEnable by:\n\n    -d MYDOMAIN -p cloudflare --cloudflare.api-token XXXXX\n\nWhere `MYDOMAIN` is your root domain which will be added to all\napps; `XXXXX` [Cloudflare API token](https://dash.cloudflare.com/profile/api-tokens)\n\n\u003e `-d, --domain, $DOMAIN \u003croot domain name\u003e` is theoretically optional in case you hard-coded root domains in\n\u003e manifest, but I guess it's not a common situation and should be avoided in most setups.\n\n\nOptions:\n\n* `--cloudflare.ip \u003cIP\u003e` (`$CLOUDFLARE_IP`) - Public IP address for DNS record. If not defined - will be detected\n  automatically by myexternalip.com\n* `--cloudflare.proxy` (`$CLOUDFLARE_PROXY`) - Let Cloudflare proxy traffic. Implies some level of protection and\n  automatic SSL between client and Cloudflare\n* `--cloudflare.api-token \u003cTOKEN\u003e` (`$CLOUDFLARE_API_TOKEN`) -\n  [Cloudflare API token](https://dash.cloudflare.com/profile/api-tokens)\n\n## Authorization\n\nIt's possible to secure exposed endpoints by JWT.\n\n**Important:** index endpoint not secured by authorization, however, it can expose only list of deployed applications.\nUse `--no-index` flag to disable index page.\n\nSupported claims:\n\n* `nbf` - not before\n* `exp` - expiration time. Permanent if not defined\n* `sub` - restrict to single group (repo) by name (or FQDN if `--fqdn` set)\n* `aud` - (required) client name (will be used for statistics and probably for lock)\n* `methods` - list of allowed methods: GET, POST, etc.. Case-insensitive, all methods allowed if list is empty or\n  undefined.\n\nTo enable JWT authorization use `--jwt \u003ckey\u003e` flag, where `\u003ckey\u003e` shared key used for signing tokens.\n\nTokens can be (sorted by priority):\n\n* in header `Authorization` with `Bearer` (case-insensitive) kind\n* in query param `token`\n\n\n**For example** you have token `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjbGllbnQxIn0.tj2xpg4u-IHzqXtjfpmI8QUFKQIQUrxPdCQY4JSfCWI`\n so cURL requests may be:\n\n* in header: `curl -H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjbGllbnQxIn0.tj2xpg4u-IHzqXtjfpmI8QUFKQIQUrxPdCQY4JSfCWI' http://app.example.com/`\n* in query: `curl http://app.example.com/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJjbGllbnQxIn0.tj2xpg4u-IHzqXtjfpmI8QUFKQIQUrxPdCQY4JSfCWI`\n\n\n\n### Generate tokens\n\nCheck `git-pipe jwt` command in [usage](#usage).\n\nExample:\n\n    git-pipe jwt -s changeme my-client-1\n\nwill generate and print token labeled as `my-client-1` without expiration, for all groups (repos), for all methods,\nassuming that shared key is `changeme`.\n\nExample with restriction to single group (repo):\n\n    git-pipe jwt -s changeme -g my-app my-client-1\n\nExample with restriction to single group (repo) and only for GET and HEAD methods:\n\n    git-pipe jwt -s changeme -g my-app -m GET -m HEAD my-client-1\n\nExample with expiration after 3 hours 20 minutes and 5 seconds:\n\n    git-pipe jwt -s changeme -e 3h20m5s my-client-1\n\nExample how to generate for multiple same clients:\n\n    git-pipe jwt -s changeme my-client-1 my-client-2 my-client-3 my-client-4\n\n## Health check\n\ngit-pipe supports health checks in single Dockerfile repositories. It will not route traffic to the service until\ncontainer will become healthy.\n\nSee [how to define health check in Dockerfile](https://docs.docker.com/engine/reference/builder/#healthcheck).\n\nExample for common HTTP service:\n\n```\nFROM my-service\nEXPOSE 80\n\n\n## ....\nHEALTHCHECK --interval=3s CMD curl -f http://localhost:80/health || exit 1\n\n\n## ...\n```\n\n## Usage\n\n\n* `jwt` - helper to generate JWT\n* `run` - (default) run git-pipe and serve repos\n\n## jwt\n```\nUsage:\n  git-pipe [OPTIONS] jwt [jwt-OPTIONS] [name...]\n\nHelp Options:\n  -h, --help            Show this help message\n\n[jwt command options]\n      -s, --secret=     Shared JWT secret [$SECRET]\n      -g, --group=      Allowed group (repo name) [$GROUP]\n      -e, --expiration= Expiration time [$EXPIRATION]\n      -m, --methods=    Allowed HTTP methods [$METHODS]\n\n[jwt command arguments]\n  name:                 Client names for each token will be generated\n\n```\n\n\n## run\n```\nUsage:\n  git-pipe [OPTIONS] run [run-OPTIONS] [git-url...]\n\nHelp Options:\n  -h, --help                      Show this help message\n\n[run command options]\n      -d, --domain=               Root domain, default is hostname (default:\n                                  localhost) [$DOMAIN]\n      -D, --dummy                 Dummy mode disables HTTP router [$DUMMY]\n      -b, --bind=                 Address to where bind HTTP server (default:\n                                  127.0.0.1:8080) [$BIND]\n      -T, --auto-tls              Automatic TLS (Let's Encrypt), ignores bind\n                                  address and uses 0.0.0.0:443 port [$AUTO_TLS]\n          --tls                   Enable HTTPS serving with TLS. TLS files\n                                  should support multiple domains, otherwise\n                                  path-routing should be enabled. Ignored with\n                                  --auto-tls' [$TLS]\n          --ssl-dir=              Directory for SSL certificates and keys.\n                                  Should contain server.{crt,key} files unless\n                                  auto-tls enabled. For auto-tls it is used as\n                                  cache dir (default: ssl) [$SSL_DIR]\n          --no-index              Disable index page [$NO_INDEX]\n      -P, --path-routing          Enable path routing instead of domain-based.\n                                  Implicitly disables --domain [$PATH_ROUTING]\n          --jwt=                  Define JWT secret and enable JWT-based\n                                  authorization [$JWT]\n      -n, --network=              Network name for internal communication\n                                  (default: git-pipe) [$NETWORK]\n      -i, --interval=             Interval to poll repositories (default: 30s)\n                                  [$INTERVAL]\n      -o, --output=               Output directory for clone (default: repos)\n                                  [$OUTPUT]\n      -B, --backup=               Backup location (default: file://backups)\n                                  [$BACKUP]\n      -K, --backup-key=           Backup key (default: git-pipe-change-me)\n                                  [$BACKUP_KEY]\n      -I, --backup-interval=      Backup interval (default: 1h)\n                                  [$BACKUP_INTERVAL]\n      -F, --fqdn                  Construct from URL unique FQDN based on path\n                                  and domain [$FQDN]\n          --graceful-shutdown=    Interval before server shutdown (default:\n                                  15s) [$GRACEFUL_SHUTDOWN]\n      -e, --env-file=             Environment variables files [$ENV_FILE]\n      -p, --provider=[cloudflare] DNS provider for auto registration [$PROVIDER]\n\n    Cloudflare config:\n          --cloudflare.ip=        Public IP address for DNS record. If not\n                                  defined - will be detected automatically by\n                                  myexternalip.com [$CLOUDFLARE_IP]\n          --cloudflare.proxy      Let Cloudflare proxy traffic. Implies some\n                                  level of protection and automatic SSL between\n                                  client and Cloudflare [$CLOUDFLARE_PROXY]\n          --cloudflare.api-token= API token [$CLOUDFLARE_API_TOKEN]\n\n[run command arguments]\n  git-url:                        remote git URL to poll with optional\n                                  branch/tag name after hash\n\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freddec%2Fgit-pipe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freddec%2Fgit-pipe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freddec%2Fgit-pipe/lists"}