{"id":13647475,"url":"https://github.com/app-registry/appr","last_synced_at":"2026-03-11T12:18:41.193Z","repository":{"id":57411108,"uuid":"69499491","full_name":"app-registry/appr","owner":"app-registry","description":null,"archived":false,"fork":false,"pushed_at":"2025-03-17T13:33:52.000Z","size":882,"stargazers_count":56,"open_issues_count":25,"forks_count":17,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-01-14T10:36:20.109Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/app-registry.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-09-28T20:05:34.000Z","updated_at":"2025-03-17T13:33:56.000Z","dependencies_parsed_at":"2023-07-17T20:22:47.905Z","dependency_job_id":"b38dbccd-b791-4bc6-9c3c-15c430c52186","html_url":"https://github.com/app-registry/appr","commit_stats":{"total_commits":202,"total_committers":15,"mean_commits":"13.466666666666667","dds":"0.38613861386138615","last_synced_commit":"37ff9a487a54ad41b59855ecd76ee092fe206a84"},"previous_names":["app-registry/appr-server","cn-app-registry/cnr-server"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/app-registry/appr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-registry%2Fappr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-registry%2Fappr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-registry%2Fappr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-registry%2Fappr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/app-registry","download_url":"https://codeload.github.com/app-registry/appr/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/app-registry%2Fappr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30380936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-11T06:09:32.197Z","status":"ssl_error","status_checked_at":"2026-03-11T06:09:17.086Z","response_time":84,"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":[],"created_at":"2024-08-02T01:03:35.354Z","updated_at":"2026-03-11T12:18:41.154Z","avatar_url":"https://github.com/app-registry.png","language":"Python","readme":"[![build status](https://gitlab.com/failfast-ci/app-registry__appr-server/badges/master/build.svg)](https://gitlab.com/failfast-ci/app-registry__appr-server/commits/master)\n[![Coverage Status](https://coveralls.io/repos/github/cn-app-registry/cnr-server/badge.svg?branch=master)](https://coveralls.io/github/cn-app-registry/cnr-server?branch=master)\n[![Swagger API Reference](https://img.shields.io/badge/swagger-docs-blue.svg)](Documentation/server/appr-api-swagger.yaml)\n\n# APPR Command Line Tool\n[CLI commands overview](Documentation/quick-start.md)\n\n## Install the Helm Registry Plugin\n\nFirst, Install the latest [Helm release](https://github.com/kubernetes/helm#install).\n\nIf you are an OSX user, quickstart with brew: `brew install kubernetes-helm`\n\nNext download and install the registry plugin for Helm.\n\n### OSX\n\n```\nwget https://github.com/cn-app-registry/appr-cli/releases/download/v0.3.7-dev/registry-appr-v0.3.7-dev-osx-x64-helm-plugin.tar.gz\nmkdir -p ~/.helm/plugins/\ntar xzvf registry-appr-v0.3.7-dev-osx-x64-helm-plugin.tar.gz  -C ~/.helm/plugins/\n```\n\n### Linux\n\n```\nwget https://github.com/cn-app-registry/appr-cli/releases/download/v0.3.7-dev/registry-appr-v0.3.7-dev-linux-x64-helm-plugin.tar.gz\nmkdir -p ~/.helm/plugins/\ntar xzvf registry-appr-v0.3.7-dev-linux-x64-helm-plugin.tar.gz  -C ~/.helm/plugins/\n```\n\n### Windows\n\n```\nwget https://github.com/cn-app-registry/appr-cli/releases/download/v0.3.7-dev/registry-appr-v0.3.7-dev-win-x64-helm-plugin.tar.gz\nmkdir -p ~/.helm/plugins/\ntar xzvf registry-appr-v0.3.7-dev-linux-x64-helm-plugin.tar.gz  -C ~/.helm/plugins/\n```\n\nNote: You must have bash in your path and change the `registry/plugin.yaml` execution to call `bash -c $HELM_PLUGIN_DIR/appr.sh`\n\n\n## Deploy Jenkins Using Helm from the Quay Registry\n\n\n```\nhelm registry version app.quay.io\n```\n\nOutput should be:\n```\nApi-version: {u'appr-api': u'0.X.Y'}\nClient-version: 0.X.Y\n```\n\n### Install Jenkins\n\n```\nhelm init\nhelm registry list app.quay.io\nhelm registry install app.quay.io/helm/jenkins\n```\n\n## Create and Push Your Own Chart\n\nFirst, create an account on https://app.quay.io (staging server) and login to the CLI using the username and password\n\nSet an environment for the username created at Quay to use through the rest of these instructions.\n\n```\nexport USERNAME=philips\n```\n\nLogin to Quay with the Helm registry plugin:\n\n```\nhelm registry login -u $USERNAME app.quay.io\n```\n\nCreate a new Helm chart, the default will create a sample nginx application:\n\n```\nhelm create nginx\n```\n\nPush this new chart to Quay and then deploy it from Quay.\n\n```\ncd nginx\nhelm registry push --namespace $USERNAME app.quay.io\nhelm registry install app.quay.io/$USERNAME/nginx\n```\n\n\n# appr-server\n\nAPPR implements a registry for storing Kubernetes application manifests that attempts to reuse as much knowledge from the rest of the Linux container ecosystem as possible.\n\nDifferentiating features include:\n\n- A protocol and data model that can more easily be implemented by pre-existing container registries\n  - This includes a common API for uploading, downloading, and searching for applications\n- The reuse and integration with many elements from [OCI](https://www.opencontainers.org)\n  - Content addressable manifest scheme for security, signing, and non-trusted mirroring\n  - Reuse of common data structures such as Descriptors\n  - Unification of Manifest Lists as the means of content negoitation for both Images and Applications\n\n## Getting started\n\n1. git clone https://github.com/cn-app-registry/appr-server.git \u0026\u0026 cd appr-server\n2. pip install -e . \u0026\u0026 pip install gunicorn\n3. Run the appr-server on port 5000 `gunicorn appr.api.wsgi:app -b :5000`\n   or \"./run-server\"\n4. See the [curl-based examples](Documentation/test.sh)\n\n## Architecture at a glance\n\nThere are two top-level objects:\n\n- Package: metadata describing an application\n- Blob: a gzipped tarball of the package encoded in base64\n\nPackages are primarily indexed by 3 notable fields:\n\n- package-name: it follows container-image format: `namespace/name`.\n- release: it's the version of the package, immutable it can be viewed as an alias to a digest\n- mediaType: the format of the package formats (eg: docker-compose, dab, helm, kpm)\n\nData storage is specified by the `STORAGE` environment variable. The following are supported:\n\n- `filesystem` (default)\n- [`etcd`](https://github.com/coreos/etcd)\n- [`redis`](https://github.com/antirez/redis)\n\n## Demo using [Helm](https://github.com/kubernetes/helm) charts\n\n### Publish a chart\n\nCreate and encode the chart tarball\n\n```\n~/charts/elasticsearch $\ntar czvf ../elastichart.tar.gz  Chart.yaml manifests README.md\ncat ../elastichart.tar.gz | base64 -w 0\nH4sIAGBoF1gAA+2XTY/aMBCGc86vGKlngk02iRpVq1aUQw+VKlr1bowhVp0P2QZp/33tZFkCy0dVAburnUdCBs/EMyR5XyfjgmkbPbBSBVeDONL0zo80S0h/bInTLKAxIUmaxkmSBoTSu3QUALleS1tWxjINELDKxvRE3rn4G6VipchBKGas5EYwzYuwqP1cYW1j8uFwKW2xmkW8LoePacPd9LXQRtZVDiQaRSScC8O1bGw7NelnwlQYu1gp+Nn9nFRLWYmwZLKy7uOWyUOAAXxjFYzrxUI8wCfJ2y+f50Ia38O9W98lqzb1VyENjP0dDI2u19KVBgYzZiTfq/w06LXkIgpf+rS/GkpWyYW7LGZ4vRpe41mWHNW/Y1//yYgEkFyvpS3vXP/b678j6oFZ84vtCmf9P4n3rn9KKEH/vwWskb83/r2m4R9ZzXPnz61NhqWz2jmzzHvtoY0CQLGZ6LwYNhasn2cBFEJLy5Z+WxGqDE0juD+oqbV9NP1ufa6kqGy3nIvl8HFESC/eCKH70biNGqEEt7U+3cdLn+pXyTH968vJ/6z+M0r39J+kNEP934KD+p+KRknO/CPcuK6srpVysru6G+iurMmB/rOoAawoG8Ws6PL6TXoON+rpN3uu4U2HHl73n1Y9gxNVAGTZ/tOdYD6KaES3pTc2uFnvqcaPvgkei3oT/F93m06+fP0+icr5Re+qXc7pn9L9/Z+6SdT/Lfiw+6IUhvhOhSAIgiAIgiAIgiAIgiAIgiBvnr97lKMIACgAAA==\n```\n\nPOST the chart to APPR\n\n```\ncurl -XPOST http://localhost:5000/api/v1/packages/myname/elasticsearch -d '\n{\n  \"blob\": \"H4sIAP3mAFgAA....\",\n  \"release\": \"2.2.1\",\n  \"media_type\": \"helm\"\n}'\n```\n\n### Pull the chart\n\nFind the digest from the package-name/release/media-type\n\n```\ncurl -XGET http://localhost:5000/api/v1/packages/myname/elasticsearch/2.2.1/helm\n{\n  \"channels\": [],\n  \"content\": {\n    \"digest\": \"72ed15c9a65961ecd034cca098ec18eb99002cd402824aae8a674a8ae41bd0ef\",\n    \"mediaType\": \"application/vnd.appr.package.helm.v1.tar+gzip\",\n    \"size\": 583,\n    \"urls\": []\n  },\n  \"created_at\": \"2016-11-16T17:13:07.806579\",\n  \"mediaType\": \"application/vnd.appr.package-manifest.helm.v1.json\",\n  \"package\": \"myname/elasticsearch\",\n  \"release\": \"2.2.1\"\n}\n\n```\n\nFetch the blob\n\n```\ncurl -XGET \\\nhttp://localhost:5000/api/v1/packages/myname/elasticsearch/blobs/sha256/72ed15c9a65961ecd034cca098ec18eb99002cd402824aae8a674a8ae41bd0ef \\\n-o elasticsearch-chart.tar.gz\n```\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapp-registry%2Fappr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fapp-registry%2Fappr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapp-registry%2Fappr/lists"}