+ Deploying an Application +
+Learn how to deploy the application to drycc.
+diff --git a/404.html b/404.html new file mode 100644 index 000000000..c3d546dc0 --- /dev/null +++ b/404.html @@ -0,0 +1,147 @@ + + +
+ + + + + + + + + + + + + + + + +Oops! This page doesn't exist. Try going back to the home page.
+You can learn how to make a 404 page like this in Custom 404 Pages.
+Native to Kubernetes, Drycc is the Container as a Service(CaaS) suite available on every public cloud, every Kubernetes distribution, the private cloud and the edge.
+Mission
+Empower engineers and enterprises to innovate with speed, agility, and scale.
+Vision
+Become the best and most respected infrastructure software company in the world.
+Core values
+Native to Kubernetes, Drycc is the Container as a Service(CaaS) suite available on every public cloud, every Kubernetes distribution, the private cloud and the edge.
+We recognize we come from a variety of backgrounds and have a variety of beliefs and values. We embrace each other as people, respect our differences, and are committed to working together to achieve our shared objectives.
+We listen to our customers to understand their needs and think from their perspective. We identify current and potential challenges and optimize business value for our customers. Our goal is to be a trusted, reliable, and long-term partner providing leading technology to our users.
+We try things, break things, take risks, and believe failure is key to innovation. We bounce back from failure and learn quickly.
+We strive to make information and the decision process as transparent as possible. We endeavor to be humble, curious, and always open to learning and improving ourselves. We are open to different opinions, diverse perspectives and challenges, but after a decision is made, we fully commit to it. We believe in open source and are committed to participating in and contributing to the open source community in meaningful ways.
+We are committed to helping our customers build cool stuff that transforms their business in less time – we call it Time to Awesome.
+less than a minute
+Drycc Workflow is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage applications.
+We welcome your input! If you have feedback, please submit an issue. If you’d like to participate in development, please read the “Working on Documentation” section below and submit a pull request.
+ + + + +2 minute read
+These release notes for Drycc Workflow v1.2.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.1.0, please refer to the following change summary.
+e5584e3
(controller) - controller: add STACK supportad34dc1
(dockerbuilder) - kaniko: use kaniko replace docker-pyb81430e
(dockerbuilder) - dockerbuilder: change image to image.json format60dde96
(slugbuilder) - slugbuilder: add STACK supportfe8b6e5
(slugrunner) - slugrunner: add STACK support942f050
(builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORTff7a16f
(builder) - registry: remove ecr and gcr registryad13683
(builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK6def637
(builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY5044e22
(builder) - registry: remove registry_secret_prefix2ea39cc
(builder) - controller-go-sdk: upgrade controller-go-sdk6aee0d7
(builder) - registry: optimizing variable namingf9c62d9
(controller) - domain: added reserved domain checkf5a135b
(controller) - migrations: clean old migrations4369b2c
(controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY1057ca5
(controller) - registry: remove registry_secret_prefixd114b3e
(controller) - docker: update docker clientedbe963
(dockerbuilder) - dockerfile: change base image to alpinefb35baf
(dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY946dbf6
(dockerbuilder) - docker: remove insecure support628d853
(dockerbuilder) - proxy: add registry proxyff27cbd
(registry) - env: remove unused env7204d72
(registry-proxy) - registry: optimizing variable naming2 minute read
+These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.2.0, please refer to the following change summary.
+9c7cceb
(builder) - builder: add app config to env7fe44fa
(controller) - docker: docker timeout must be an int, float or Noneb196550
(controller) - controller: revert release.check_image_access for nowcc3ec13
(workflow-manager) - glide: bump goautonegef932c4
(builder) - controller-sdk-go: upgrade controller-sdk-go4654cf6
(controller) - django-rest-framework: upgrade to 3.9.314121f1
(controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs385acdc
(controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfsfa312bb
(database) - postgres: set max_connections = 10247ebecdf
(database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb8878f6
(dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb097451
(fluentd) - fluent: upgrade fluent to v1.44341f9a
(minio) - mc: upgrade mc and minioc1ee2a4
(monitor) - monitor: remove copyrights.tar.gz9854260
(registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zacc5627
(slugbuilder) - slugbuilder: internal support for multi buildpackd58907e
(slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb39a0c2
(slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z9 minute read
+These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary.
+fc7d93f
(builder) - builder: use go-dev0c2159e
(builder) - builder: fmt code and add create_bucket script1b88340
(controller) - controller: remove deprecated apia92fdeb
(controller) - routable: ingress support routable1e3eab3
(controller) - maintenance: add maintenance support for ingress56b9dd0
(controller) - crt: support containerd-ctr5fc3b46
(controller) - controller: add ephemeral-storage restrictiond677e52
(controller) - controller: add a volume command5f1323a
(controller) - controller:drycc run cmd add –mount para74c36a5
(controller) - tasks: add distributed async task139c3ca
(controller) - tasks: change nsq reader to asyncf237d74
(controller) - controller:add drycc resource cmd41b46d0
(controller) - controller:add drycc resource cmd improvementc26f7d8
(controller) - controller: add LimitRanges support45b5d1b
(controller) - users: add users status api4e16f9b
(controller) - ps:add ps:stop/start commandc659fa9
(controller) - k8s: add k8s cluster domain31a625d
(controller) - ps:add ps:stop/start command00a779a
(fluentd) - fluentd: support containerd log formatf3f1bd4
(fluentd) - nsqd: add stateless nsqd cluster supportdb7147c
(fluentd) - mirrors: delete aliyun mirrors689c12e
(logger) - nsqd: add stateless nsqd cluster support78ccc5d
(logger) - redis: add redis client cluster support9843f2c
(logger) - k8s: add k8s cluster domain6ba122e
(minio) - minio: add pvc support6973550
(monitor) - monitor: add ingress for monitorcd73305
(monitor) - charts: add volumeName support4769fe9
(monitor) - nsqd: add stateless nsqd cluster support87806df
(monitor) - k8s: add k8s cluster domain4db40c4
(nsqd) - nsqd: add stateless nsqd cluster supportb6f3d4f
(nsqd) - nsqd: add stateless nsqd cluster support74b85bb
(redis) - redis: change redis to statefulsetff98b50
(slugbuilder) - slugbuilder: delete build hookb201c2f
(slugbuilder) - buildpacks: use drycc buildpacks0ec042d
(builder) - test: fix test case error4fb113b
(builder) - build: base image replace by alpine443df48
(builder) - minio: fix not bucket error3dab5b0
(builder) - minio: create bucket error734fca6
(controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scalinga7dcd10
(controller) - controller: test pass93f0f2e
(controller) - controller: fix migrations error4724375
(controller) - controller: fix test error7bacf29
(controller) - charts: fix clusterrole90957f7
(controller) - pod: sort events error440b13e
(controller) - controller: review table structure0a470a6
(controller) - controller: bump tornado 5.1.1e39218b
(controller) - pynsq: no current event loop in thread1d8630e
(controller) - tests: fix test_task.py run error1ff1202
(controller) - controller: fix test cased8c0da3
(controller) - settings: fix env name6d8fd36
(database) - 003_restore_from_backup.sh: ignore script exit 1e0394a9
(database) - minio: fix not bucket errorf35f252
(database) - mc: fix create_bucket error74d6886
(database) - postgres: recovery mode not rune50d0c1
(dockerbuilder) - caddy: fix caddy not startf3bec7a
(fluentd) - influxdb: fix influxdb host and portbc19f27
(fluentd) - charts: skipped value for daemon_environment: Not a table338d623
(logger) - logger: logger not run in alpine7788302
(minio) - minio: bump minio version619eed0
(minio) - fix: use go mod replace dep3b42122
(monitor) - monitor: fix host error67998ef
(monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api2cc361c
(registry) - registry: fix test case548297a
(registry) - minio: fix not bucket error5412ddb
(registry) - minio: create bucket errord0d629e
(slugbuilder) - slugbuilder:fix normalize_storage pathd76ecbe
(slugbuilder) - slugbuilder: use v3 apic505e18
(slugbuilder) - shellcheck: SC2039c893a17
(builder) - builder: fmt codebba5795
(controller) - controller: format coded36082b
(controller) - controller: fix pep866026f2
(controller) - resource: standardize the naming of resource03d7e2c
(controller) - servicecatalog: change servicecatalog to svcat49dbb6d
(controller) - controller: flake8 upgradecbfc108
(monitor) - monitor: format charts and dashboardee85954
(slugbuilder) - slugbuilder: use shellcheck3afed2e
(slugbuilder) - docker: simplify dockerfile36b7f68
(slugrunner) - docker: simplify dockerfile61bb0ef
(builder) - aws: upgrade aws sdk version0f2e074
(builder) - chore: use go mode replace depe9a2219
(builder) - builder: delete glide upbb8c518
(builder) - registry: del quay.iofa6d02f
(builder) - builder: upgrade go.sum9d61e8d
(builder) - build: upgrade go.modd763a98
(builder) - charts: upgrade k8s newer API versionsd1bc1aa
(builder) - pkg: upgrade to new drycc/pkg02b1e98
(builder) - builder: update go mod8e17d65
(builder) - builder: change alpine repositoriesf32b723
(builder) - mirrors: delete aliyun mirrorse33dc61
(builder) - minio: use bin mc replace docker images3ab4f1c
(builder) - builder: update controller-sdk-gob2adfac
(builder) - heroku: remove heroku-16 supportf429ac8
(builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes7197c83
(builder) - go.mod:upgrade require pkg controller-sdk-go5f3e22d
(controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs1db645a
(controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfsfbe8067
(controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs537d667
(controller) - registry: del quay.ioa23c65b
(controller) - deps: update all deps to the latest version546337e
(controller) - charts: upgrade k8s newer API versions06023f8
(controller) - workflow-manager: del workflow-managerbba5736
(controller) - controller: change cluster-issuer location6c43661
(controller) - Certificatechange cluster-issuer location39a4728
(controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml9e96d3f
(controller) - Certificate:upgrade version cert-manager.io/v1alpha28e68049
(controller) - docker: use INDEX_URL replace index.docker.io8fda205
(controller) - cert_manager: change cert_manager_enabled to global6fefb6d
(controller) - charts: change platform_domain to global064b2ad
(controller) - maintenance: remove maintenance supportb8797c9
(controller) - workflow: remove namespace1b20d76
(controller) - quota: add kube quota configd780075
(controller) - pod: add pod default resources support3d72c08
(controller) - rename: rename ingress name0aa6ab9
(controller) - mirrors: delete aliyun mirrors7533a65
(controller) - heroku: remove heroku-16 supporte5a885d
(controller) - controller:check mount volume path9014e74
(controller) - test: optimization Dockerfile.test0b6ebb2
(controller) - tasks: change apply_async parameters835f009
(controller) - wsgi: add tornado 6 support67a4ad7
(controller) - utils: use threads replace asyncioa28949b
(controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUPa903209
(controller) - charts: add custom controller environment variables supporte0e783e
(controller) - ldap: change filter styled760825
(controller) - scheduler: remove debug loga25928e
(controller) - wsgi: remove a wsgi.py file7b2696e
(controller) - log: disable nsq.client info log8d5c07b
(controller) - charts: add default environment025f4a2
(controller) - controller: change quota nameebda60e
(controller) - controller: review pvc code8832ba9
(controller) - controller: change status\binding model type and mount path check container_types7148d04
(controller) - controller: add overcommit cpu and ram support4d2087c
(controller) - limits: modify limits unit verificationaf36970
(controller) - api: check cpu/memory range for api329355b
(controller) - volumes: modify the volume size9dfee09
(controller) - LimitRanges: modify the default limits5205bca
(controller) - controller: improve the details of certificate7ebecdf
(database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z6415e2c
(database) - postgres: upgrade to pg1312e6806
(database) - charts: upgrade k8s newer API versionsd294509
(database) - minio: use canary minio test1bad02e
(database) - mirrors: delete aliyun mirrorsd51420b
(database) - minio: use bin mc replace docker images4133d05
(dockerbuilder) - dockerbuilder: update caddy and kaniko6b4dd18
(dockerbuilder) - minio: use bin mc replace docker images6df9b7c
(fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3c2490f8
(fluentd) - fluentd: upgrade fluentdbe4a56a
(fluentd) - fluentd: add Gemfile.lock2237f75
(fluentd) - charts: upgrade k8s newer API versionsc574065
(fluentd) - charts: upgrade k8s newer API versions52b8084
(fluentd) - router: delete obsolete router code3b3cceb
(fluentd) - fluentd: remove manifests dir25c6702
(fluentd) - nsqd: change var namebd571be
(fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS72aa4e6
(fluentd) - influxdb: change influxdb service namebd61903
(logger) - logger: use go mod replace dep69c63a1
(logger) - logger: update go.mod3aa9cd7
(logger) - registry: del quay.iof058496
(logger) - nsqd: change var name6d9787c
(logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS85ed307
(logger) - logger: standard namingd88e7b6
(minio) - minio: update minio api to v743715d2
(minio) - minio: upgrade minio0e1239b
(minio) - minio: use docker.io replace quay.iof7f047b
(minio) - registry: del quay.ioafa7128
(minio) - build: upgrade go.modaff2db5
(minio) - charts: upgrade k8s newer API versions4547f14
(minio) - pkg: upgrade to new drycc/pkg2769b85
(minio) - minio: use bin mc replace docker images35dde8d
(monitor) - monitor: update grafana influxdb telegraf9e3a949
(monitor) - charts: upgrade k8s newer API versions6af0432
(monitor) - workflow-manager: remove workflow-manager0611c07
(monitor) - router: delete obsolete router codebe04824
(monitor) - cert_manager: change cert_manager_enabled to global3780165
(monitor) - charts: change platform_domain to global50b04e1
(monitor) - influxdb: remove influxdb admin ui6ab4d68
(monitor) - influxdb: remove unuse portf1510bd
(monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetesf36de2c
(monitor) - pvc: upgrade to new formatfc78a0a
(monitor) - workflow: remove namespacee85890f
(monitor) - monitor: monitoring nsqd and redis separately694f6b1
(monitor) - mirrors: delete aliyun mirrors4aea36a
(monitor) - grafana: add ldap support for grafana68fc30f
(nsqd) - nsq: update nsq16f32aa
(nsqd) - charts: upgrade k8s newer API versions04db389
(redis) - reids: update to redis 63f01bab
(redis) - charts: upgrade k8s newer API versions647e4be
(registry) - registry: del quay.io0bbce99
(registry) - charts: upgrade k8s newer API versionsa982b50
(registry) - minio: use bin mc replace docker imagese088da3
(registry-proxy) - ingress: renmae use_native_ingress to use_ingress7e88337
(registry-proxy) - nginx: upgrade nginx to mainline7204d72
(registry-proxy) - registry: optimizing variable naming2eafc59
(registry-proxy) - registry-proxy: update nginx071bd86
(registry-proxy) - charts: upgrade k8s newer API versionsc72db96
(registry-proxy) - registry-proxy: change travis icon urlca9f962
(slugbuilder) - slugbuilder: del BUILDPACK_URL support1b74dd5
(slugbuilder) - slugbuilder: add heroku-20 support54d4ad2
(slugbuilder) - slugbuilder: del quay.ioa78f37e
(slugbuilder) - slugbuilder: add heroku-20 stack94ac94a
(slugbuilder) - minio: use bin mc replace docker images53b4b8b
(slugbuilder) - slugbuilder: modify stack priority58e2bd2
(slugbuilder) - dockerfile: add WORKDIR /tmpb29cd04
(slugbuilder) - slugbuilder: add pre_build.sh9d319f6
(slugbuilder) - slugbuilder: silent mc command outputd1ec3c9
(slugbuilder) - heroku: remove heroku-16 support5048534
(slugbuilder) - slugbuilder: use drycc stack-imagesa116537
(slugrunner) - slugrunner: add heroku-20 supporta1196bf
(slugrunner) - slugrunner: del quay.io64c96d7
(slugrunner) - slugrunner: add heroku-20 stackcc3e226
(slugrunner) - minio: use bin mc replace docker images9130bde
(slugrunner) - shellcheck: shellcheck installer4ea33e1
(slugrunner) - slugrunner: modify stack priority5514e8b
(slugrunner) - heroku: remove heroku-16 supportbe829fb
(slugrunner) - slugrunner: use drycc stack-imagese1e06be
(slugrunner) - slugrunner: remove Dockerfile.heroku-1611 minute read
+These release notes for Drycc Workflow v1.5.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary.
+0f5f8e4
(builder) - builder: multi-platform supportf269d06
(builder) - build: add buildx supportjkjkk:q5e72fe8
(builder) - registry: use docker build25d8a4c
(builder) - docker: dealing with the change of docker in kubenetes 1.207a3e1c5
(builder) - charts: set the default chart version46b75ff
(builder) - builder: add cloud native buildpacks support2db2054
(builder) - builder: unified build model4b7f9d9
(builder) - builder: add initContainersb78c936
(controller) - token: add get token apibac52a5
(controller) - tasks: use celery replace nsqdb9b0c58
(controller) - build: add buildx support205dcb3
(controller) - influxdb: add influxdb clientff15849
(controller) - influxdb: upgrade to influxdb 2.x4016244
(controller) - controller: push data to influxfcfce2e
(controller) - workflow-manager: add workflow-manager support00e9bfb
(controller) - influxdb: review influxdb codedd644d5
(controller) - docker: dealing with the change of docker in kubenetes 1.20118278b
(controller) - charts: set the default chart version122a9cd
(controller) - oauth2: add oauth2 support559a5b6
(controller) - controller: use cncf buildpacks replace slugrunner96130e6
(controller) - charts: database configuration optimization of passport and controller2ea8508
(controller) - oauth: using passport authentication868c437
(database) - database: multi-platform supporteadd5da
(database) - build: add buildx supportb6eea4c
(database) - docker: dealing with the change of docker in kubenetes 1.2004a88db
(database) - charts: set the default chart version92ed309
(database) - database: add initContaineree6b78f
(fluentd) - build: add buildx supportf523e30
(fluentd) - docker: dealing with the change of docker in kubenetes 1.20ee47b53
(fluentd) - charts: set the default chart version80a51af
(influxdb) - influxdb: modify influxdb naming rulesfb10030
(influxdb) - influxdb: use influxdb v20e87ad8
(influxdb) - docker: dealing with the change of docker in kubenetes 1.209d10801
(influxdb) - charts: set the default chart versiond825c9f
(logger) - build: add buildx supportb139576
(logger) - docker: dealing with the change of docker in kubenetes 1.2088f84ea
(logger) - charts: set the default chart version5ccae3e
(logger) - dockerfile: remove chmod cmd193aefc
(logger) - logger: add initContainersbaee330
(minio) - minio: multi-platform supportad5d055
(minio) - build: add buildx support19868d4
(minio) - docker: dealing with the change of docker in kubenetes 1.204bd84b8
(minio) - charts: set the default chart version79d1f2f
(monitor) - database: multi-platform support88e5a7f
(monitor) - build: add buildx support5672e99
(monitor) - influxdb: modify influxdb naming rules8672103
(monitor) - influxdb: use influxdb v266cb4c8
(monitor) - docker: dealing with the change of docker in kubenetes 1.209576eb3
(monitor) - charts: set the default chart version30809c9
(monitor) - monitor: add initContainers70d140c
(nsqd) - nsqd: using self compiled nsq binary1073d4f
(nsqd) - nsqd: use GOPATH replace /goe498480
(nsqd) - build: add buildx supportcf9b7d5
(nsqd) - docker: dealing with the change of docker in kubenetes 1.20c335856
(nsqd) - charts: set the default chart versionefba713
(redis) - build: add buildx supportc7a3b53
(redis) - docker: dealing with the change of docker in kubenetes 1.204cdad7b
(redis) - charts: set the default chart version652b443
(registry) - registry: multi-platform support4060176
(registry) - registry: use docker build7102a03
(registry) - docker: dealing with the change of docker in kubenetes 1.206c8600d
(registry) - charts: set the default chart version33a51c9
(registry) - registry: add initContainersbef70dc
(registry-proxy) - build: add buildx supportd2319c1
(registry-proxy) - docker: dealing with the change of docker in kubenetes 1.2002fafed
(registry-proxy) - charts: set the default chart version5499c9a
(controller) - gunicorn: gunicorn not running06e9e88
(controller) - controller: error loading shared library01b5bd0
(controller) - controller: upgrade celery config6e32d55
(controller) - controller: fix update resources bug0e0d53f
(controller) - chart: set the domain depends certManagerEnabled2ac4ca8
(controller) - passport: error loading shared library libexpat.so.1a0dd517
(fluentd) - fluentd: drone build6eca2a3
(logger) - logger: golang lint63b0aa0
(registry) - drone: charts url error472cfcc
(controller) - controller organize README.md documentd9d6e29
(redis) - redis: delete links that do not exist1468f57
(controller) - controller: add command unittest9999bfd
(builder) - builder:replace the special wordscda8b58
(builder) - builder: remove docker keyword from chartsdc575dd
(builder) - builder: use imagebuilder replace dockerbuilderd3bb183
(builder) - docker: use the full name of registry5fe34d1
(builder) - travis: add DEV_REGISTRY7e36453
(builder) - CICD: use drone52b8d9d
(builder) - drone: add image_registries volumes65963f4
(builder) - k8s: add privileged to dindd345fcf
(builder) - LICENSE: revert modifications to Apache license7975c99
(builder) - drone: always pull image59633dd
(builder) - builder: modify launch imagebuild pod8d14e67
(builder) - builder: use Procfile in anywhere5357fa8
(builder) - go: bump go mod8d26ac0
(builder) - k8s: k8s deprecated api migration0af620d
(builder) - chars: change org to imageTagae84303
(builder) - builder: run imagebuider replace pod with job3b2c496
(builder) - builder: change docs website5679a4c
(builder) - builder: upgrade to golang1.17a214503
(controller) - controller:replace whitelist with allowlist375ddcc
(controller) - ps:drycc ps:list show autoscale numc32e409
(controller) - ldap: canot register when ldap is enabledc46580a
(controller) - controller:modify redis configfa9e87b
(controller) - chart:modify controller charts6f9fd08
(controller) - nsq: remove nsq994b2dc
(controller) - docker-buildx: add check-dockera720c3a
(controller) - controller: remove docker keyword from chartse9a5c84
(controller) - docker: use the full name of registrya26614a
(controller) - controller: add rabbitmq env3df229d
(controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC257e94b
(controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjobf4d6ec3
(controller) - chart: pretty chart format63e6195
(controller) - influxdb: modify influxdb code0f6d408
(controller) - CICD: use drone87bad28
(controller) - python: upgrade to python3.9e8f7560
(controller) - volumes: modify mount summary6cf6c6b
(controller) - drone: add image_registries volumesa9397e8
(controller) - oauth: modify token Authenticationc7f8c8b
(controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfsa1a08aa
(controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfsefd78b4
(controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs649b044
(controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs41b742b
(controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs22ffe5d
(controller) - LICENSE: revert modifications to Apache licensec98b468
(controller) - drone: always pull image20e6edb
(controller) - chart: modify the problem of using buildpackdb16879
(controller) - controller: pretty pods list printba6f456
(controller) - test: pretty pods list print5fce4b7
(controller) - k8s: k8s deprecated api migratione9e0bcb
(controller) - oauth: using passport authentication0311172
(controller) - chars: change org to imageTag150eff1
(controller) - charts: update cert-manager api versionde8545a
(controller) - controller: update requirements1442207
(controller) - controller: using django native JSONFiledab4e836
(controller) - oauth: modify passport api5c54e06
(controller) - controller: eliminate pip warnings870328d
(controller) - controller: remove entrypoint5e5e6ae
(controller) - controller: upgrade celery config607778f
(controller) - controller: add initContainer23dc016
(controller) - chart: set the domain depends certManagerEnabledf3cf20b
(controller) - controller: remove default bash env73f2636
(controller) - controller: modify alpinelinux repositories498e9f2
(controller) - chart: change certManagerEnabled to boolean type27f5308
(controller) - passport: exclude cryptography370b75d
(controller) - controller: use sh env07585b4
(database) - postgres:replace the special words20172dc
(database) - database: remove docker keyword from chartsabb9b88
(database) - docker: use the full name of registrye72f58f
(database) - chart: modify the off-cluster databasea91f64f
(database) - travis: add DEV_REGISTRY614fb76
(database) - tests: use add-host replace linka3428f3
(database) - CICD: use drone239fef1
(database) - drone: add image_registries volumes42858e1
(database) - LICENSE: revert modifications to Apache licensed0fe850
(database) - drone: always pull image34a36ad
(database) - charts: Nn secret is generated during off-cluster064ccf4
(database) - database: create database9228992
(database) - chars: change org to imageTag9f7810c
(database) - database: upgrade to wal-g v1.105783f4
(fluentd) - fluentd:replace the special words0739809
(fluentd) - influxdb:replace monitor-influx with influxf02487c
(fluentd) - fluentd: remove docker keyword from charts2c96cc0
(fluentd) - docker: use the full name of registryb20c429
(fluentd) - charts: remove port config6dd0197
(fluentd) - travis: add DEV_REGISTRYc5bec51
(fluentd) - CICD: use dronef8524b7
(fluentd) - drone: add image_registries volumesa50878a
(fluentd) - LICENSE: revert modifications to Apache license14fe20e
(fluentd) - drone: always pull image4a2f660
(fluentd) - k8s: k8s deprecated api migrationde2dd91
(fluentd) - chars: change org to imageTaga9f1944
(fluentd) - fluentd: upgrade to fluentd1.147cb4e95
(influxdb) - influxdb: change username to user0fdc21b
(influxdb) - influxdb: remove docker keyword from chartsb2acddb
(influxdb) - influxdb: change default pathba88919
(influxdb) - influxdb: add check_env function9117401
(influxdb) - influxdb: modify init_influxdb has_bucket092a3e6
(influxdb) - chart: pod not readiness51de380
(influxdb) - travis: add DEV_REGISTRY66d7667
(influxdb) - docker: replace influxdb base image3aa3094
(influxdb) - CICD: use drone14b9c24
(influxdb) - drone: add image_registries volumes02b4cd1
(logger) - logger:replace the special words114b5d5
(logger) - reids: delete the logger prefix of redis639278a
(logger) - redis: remove logger from redis conf90195e2
(logger) - go: remove GOOS and GOARCH31e2e27
(logger) - logger: remove docker keyword from charts8fbd9fa
(logger) - docker: use the full name of registryb39df2d
(logger) - charts: remove redis\nsqd port config35d6d07
(logger) - travis: add DEV_REGISTRY69aabf5
(logger) - tests: remove docker linke916644
(logger) - CICD: use droned6872b7
(logger) - drone: add image_registries volumes37801da
(logger) - LICENSE: revert modifications to Apache licensecfb4b38
(logger) - drone: always pull image8bda3bf
(logger) - go: bump go mode13ebfc
(logger) - chars: change org to imageTag38e6d8d
(minio) - minio:replace the special wordsd6925dd
(minio) - minio: remove docker keyword from chartsd56bc39
(minio) - docker: use the full name of registrye4696cc
(minio) - travis: add DEV_REGISTRY70c5c79
(minio) - minio: use latest version773cf6c
(minio) - Makefile: remove DEV_REGISTRY ?=5ce5bc6
(minio) - CICD: use drone5da8be3
(minio) - drone: add image_registries volumesc1f0611
(minio) - LICENSE: revert modifications to Apache licenseb73f792
(minio) - drone: always pull image79d1c93
(minio) - go: bump go modc448899
(minio) - chars: change org to imageTag15ee49e
(minio) - minio: migrate deprecated warning9968a1a
(minio) - minio: upgrade to golang1.714fedd2
(monitor) - monitor:replace the special works52c431a
(monitor) - reids: delete the logger prefix of redis2c95b47
(monitor) - redis: remove logger from redis confda9bc56
(monitor) - monitor:remove influxdb53f47b9
(monitor) - grafana: use grafana docker image5bdb188
(monitor) - grafana: use grafana docker imagec0586dd
(monitor) - monitor: remove docker keyword from charts87d02b6
(monitor) - charts: add nodes and persistentvolumes rule1b5598f
(monitor) - monitor: modify grafana dashboard with FLUX and pretty config.tomlbcbc0d5
(monitor) - docker: use the full name of registry9418c9e
(monitor) - monitor: fix upload dashboard error and modify INFLUXDB input589f29a
(monitor) - travis: add DEV_REGISTRYf776f8a
(monitor) - CICD: use drone6ca3060
(monitor) - drone: add image_registries volumes6a9ffb2
(monitor) - LICENSE: revert modifications to Apache license45e41ed
(monitor) - drone: always pull image654d407
(monitor) - k8s: k8s deprecated api migration41e9b9c
(monitor) - chars: change org to imageTag99c10d3
(monitor) - charts: update cert-manager api version9bf83c4
(monitor) - oauth: user oauth passporta128f6d
(monitor) - chart: change certManagerEnabled to boolean type8f897fe
(monitor) - chart: set the domain depends certManagerEnabledba6d793
(nsqd) - README:update travis build status49879c4
(nsqd) - nsqd: minimum git clone codec5e2680
(nsqd) - nsqd: remove docker keyword from charts21dd17b
(nsqd) - docker: use the full name of registry7d86b3c
(nsqd) - charts: remove port configc073d95
(nsqd) - travis: add DEV_REGISTRY55c297c
(nsqd) - CICD: use drone165c2ae
(nsqd) - drone: add image_registries volumes9c6a1f8
(nsqd) - LICENSE: revert modifications to Apache license9283098
(nsqd) - drone: always pull image46acf8a
(nsqd) - k8s: k8s deprecated api migration43caf80
(nsqd) - chars: change org to imageTag6897471
(nsqd) - nsqd: use official image297bc05
(redis) - redis:replace the special wordsf5f8b5e
(redis) - reids: delete the logger prefix of redisaf7b657
(redis) - redis: change logger-redis to redis8dca154
(redis) - redis: remove logger from redis confeaeda2d
(redis) - redis: remove docker keyword from charts53c6358
(redis) - docker: use the full name of registryae37416
(redis) - charts: remove port confige985656
(redis) - travis: add DEV_REGISTRY423336a
(redis) - CICD: use dronebe64ab4
(redis) - drone: add image_registries volumes3bec735
(redis) - LICENSE: revert modifications to Apache license4f934f6
(redis) - drone: always pull image359b878
(redis) - chars: change org to imageTag83b8ac2
(registry) - workflow:replace the special words869b280
(registry) - registry: remove docker keyword from charts999c1e9
(registry) - docker: use the full name of registry5652da9
(registry) - travis: add DEV_REGISTRYcc8c6c2
(registry) - CICD: use dronec7bdbd0
(registry) - CICD: pretty .drone.yaml format5c55a38
(registry) - test: use add-host replace linkf8866f3
(registry) - drone: add image_registries volumes6c8292f
(registry) - LICENSE: revert modifications to Apache license1d50f2c
(registry) - drone: always pull imageefbca6d
(registry) - chars: change org to imageTag2eafc59
(registry-proxy) - registry-proxy: update nginx071bd86
(registry-proxy) - charts: upgrade k8s newer API versionsc72db96
(registry-proxy) - registry-proxy: change travis icon url63ffb92
(registry-proxy) - registry-proxy:replace the special works1d904a6
(registry-proxy) - registry-proxy: remove docker keyword from chartsc8200b1
(registry-proxy) - docker: use the full name of registryd3fa939
(registry-proxy) - travis: add DEV_REGISTRY5a8b353
(registry-proxy) - CICD: use drone703d05a
(registry-proxy) - drone: add image_registries volumesaa71db1
(registry-proxy) - LICENSE: revert modifications to Apache license710c126
(registry-proxy) - drone: always pull image2dcc5e6
(registry-proxy) - chars: change org to imageTag16 minute read
+These release notes for Drycc Workflow v1.6.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.5.0, please refer to the following change summary.
+52517d9
(builder) - builder: update controller-sdk-go1d78ca0
(builder) - builder: add affinity26b6980
(builder) - builder: switch charts to ocibfd4385
(controller) - controller: add get manager user status874208d
(controller) - controller: unified measurement modelcadf98f
(controller) - controller: add admission webhooke0050c2
(controller) - controller: new measurement modela11ba58
(controller) - controller: multi pod restart uses asyncfb3c15d
(controller) - controller: add check app owner status3d78b76
(controller) - controller: add resource services api3d6a201
(controller) - controller: add search apps api01c443a
(controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter7c26232
(controller) - controller: add volume size limit3bee749
(controller) - controller: add annotations support23cd97c
(controller) - controller: traefik v2 supporte37b7db
(controller) - controller: add affinityb3b367b
(controller) - controller: add volume expand supporta4e154a
(controller) - controller: add database replica support2f37216
(controller) - controller: switch wsgi to asgib3314a5
(controller) - controller: add pod exec api75df2dc
(controller) - controller: add stream support for app logs4229bad
(controller) - ccontroller: switch charts to oci89bb19b
(database) - database: upgrade to pg149f45a5d
(database) - database: add hugepages supportc4008c9
(database) - database: add affinity411a7b2
(database) - postgres: use patroni64e5cb0
(database) - database: switch charts to oci2bab823
(fluentd) - fluentd: switch charts to oci337ba62
(imagebuilder) - imagebuilder: run podman as rootless4396ffa
(imagebuilder) - imagebuilder: switch to oci chartsf37ae09
(influxdb) - influxdb: add affinity04503b2
(influxdb) - influxdb: add influxdb ha41ddad5
(influxdb) - influxdb: switch charts to oci2006480
(logger) - logger: use redis stream replace nsqdab23d17
(logger) - logger: add affinity81d4e9d
(logger) - logger: switch charts to ocic3d9796
(monitor) - monitor: add affinitycd9de3c
(monitor) - monitor: switch to oci charts318a73f
(passport) - passport: add change user confirm79ef100
(passport) - passport: add re login at authorize6927bb5
(passport) - passport: add affinity3146a09
(passport) - passport: add google reCAPTCHA802abcd
(passport) - passport: add replica database supporta0dcd1b
(passport) - passport: switch wsgi to asgi4c9dbba
(passport) - passport: switch charts to oci74825f7
(rabbitmq) - rabbitmq: add rabbitmq managentment ingress12cf7d6
(rabbitmq) - rabbitmq: add affinity103417d
(rabbitmq) - rabbitmq: switch charts to oci5d428bb
(redis) - redis: add affinitya88c1a9
(redis) - redis: switch charts to oci541585d
(registry) - registry: add affinitye9ca9d4
(registry) - registry: add garbage-collect cronjobec62a59
(registry) - registry: switch charts to ocifde0b07
(registry-proxy) - registry-proxy: switch charts to ocibe14eb4
(storage) - minio: add affinity51af696
(storage) - storage: add k8s csi support76a75d9
(storage) - storage: add cluster health checkera17dc8c
(storage) - storage: switch charts to ocie4f44fb
(builder) - builder: no error returne38dfc7
(builder) - builderControllerHost/ControllerPort init errorff9069f
(controller) - controller: influxdb query errorf7f5069
(controller) - controller: authentication 5007e297a8
(controller) - controller: add check remote user status9db28e1
(controller) - controller: celery MaxRetriesExceededError4bcff08
(controller) - controller: wrong named69fde2
(controller) - controller: traefik ingress create errora3ad743
(controller) - fixup(controller: user login error662c8dd
(controller) - controller: change influxdb port957bdf6
(controller) - controller: validate rsa key pairing before storage419ec4c
(controller) - controller: kubernetes pod/exec cluster rolea67edaa
(controller) - controller: Cannot routing:disablee09e214
(controller) - controller: allowlist cannot remove318b126
(controller) - controller: domains update error92855eb
(database) - database: premission deniedbde945a
(database) - fixup(postgres: support arm, fix Failed to build psutil7854d45
(database) - fixup(postgres: user name converted to lowercase letters57b2a07
(fluentd) - fluentd: ifconfig_path not found20e72b9
(imagebuilder) - imagebuilder: upgrade pack version651db8a
(imagebuilder) - imagebuilder: chown uid gid orderd2e9164
(influxdb) - influxdb: proxy not running3a1d361
(monitor) - monitor: charts namingd754ae0
(monitor) - monitor: telegraf init error63f9e34
(monitor) - monitor: affinity error95ae1e5
(passport) - passport: yarn build fail3f5365e
(passport) - passport: wrong name907f17b
(passport) - passport: change uid gid to 1001e3911e0
(passport) - passport: ‘registration_done’ not found2ace5f0
(passport) - passport: ui styleb3ba1e1
(passport) - passport privacy policy link172e9c8
(passport) - passport: check databaseReplicaUrl errora3aeb70
(rabbitmq) - passport: change uid gid to 10015c73dcf
(redis) - reids: DRYCC_REGISTY misspellingd7e3baf
(redis) - redis: env misscadaa91
(registry) - registry: set gid uid to 1001d524217
(registry) - registry: storage run error854f912
(registry) - registry: chown uid gid ordere642bb7
(registry-proxy) - registry-proxy: containerPort error8dfd029
(registry-proxy) - registry-proxy: chown uid gid orderbbea364
(storage) - minio: premission denied97deba1
(storage) - storage: node unimplemented errorb9bdeff
(storage) - storage: pd can not connect each other1edb10c
(controller) - controller: database convention over configuration1960cc3
(database) - database: database name convention over configuration06d1f5d
(imagebuilder) - imagebuilder: URL to Urlb8a8941
(passport) - passport: database convention over configuration8e9a199
(builder) - builder: upgrade controller-sdk-go4840151
(builder) - builder: use exec runner replace docker runner68ccfb1
(builder) - builder: canonical charts naming8f971cb
(builder) - builder: provide any additional service annotationsfe2c55d
(builder) - dockerfile: use drycc/base image2b5e706
(builder) - dockerfile: change user and workdir7a6c8d3
(builder) - builder: set gid uid to 1001fe494f7
(builder) - dockerfile: use uid gida7c8752
(builder) - builder: change nodes to pod affinityeb2e94c
(builder) - database: bump mc 2022.04.01.23.44.48cfaae66
(builder) - builder: use registry.drycc.cc replace docker.iod7d2890
(builder) - builder: change default imagebuilder registryecfdb19
(builder) - imagebuilder: change python-dev registry6da17f4
(builder) - builder: https://github.com/minio/minio/issues/143311a57e5b
(builder) - builder: https://github.com/minio/minio/issues/14331f1464fa
(builder) - builder: https://github.com/minio/minio/issues/13799b1e1c4f
(builder) - builder: use env replace creds volume71a4145
(builder) - builder: bump go.mod3567688
(builder) - builder: fine management affinity73ea38b
(builder) - builder: change storage to minio1f91321
(builder) - builder: use testify replace assertd148b9c
(builder) - builder: add check storage healthb768101
(builder) - builder: change initContainers1b3bec3
(builder) - builder: add replicas5cb0d61
(builder) - builder: upgrade to latest controller-sdk-go98b9d58
(builder) - builder: upgrade new require65817c3
(builder) - builder: change drycc.cc to www.drycc.cc4e3f9d0
(controller) - controller: add celery retry mechanismf6716fe
(controller) - controller: change cronjob nameeb60693
(controller) - controller: refine celery task priority66905e9
(controller) - controller: change manager authea20c41
(controller) - controller: remove start/stop api4c8fc80
(controller) - controller: improve tasks error handlingcf7402e
(controller) - controller: add blocklist api80f14dd
(controller) - controller: use get_user_model replace auth.Userffc7bb7
(controller) - controller: use JSONField replace ArrayField370df8c
(controller) - controller: add validate metric29084ce
(controller) - controller: use user id request manager api718fe12
(controller) - controller change urlpatterns order71f4042
(controller) - controller: measurements uses lowercase letterse5123ea
(controller) - controller: change resource unit to number18fee9a
(controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfsffca6c1
(controller) - controller: use exec runner replace docker runner9ec12e1
(controller) - controller: simplify drone configuration4b4749e
(controller) - controller: set default CSRF_COOKIE_SECURE false2ef6338
(controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfsc7570d0
(controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs8b17bc1
(controller) - controller: canonical charts namingc928fb0
(controller) - controller: use rabbitmq clusterf917185
(controller) - controller: provide any additional service annotations22a8f63
(controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs3cc3b00
(controller) - dockerfile: use drycc/base imageee274f6
(controller) - controller: set venv profilece6b069
(controller) - controller: set gid uid to 10013a105d3
(controller) - dockerfile: use uid gid15f9b0e
(controller) - controller: code review01e6fd9
(controller) - controller: use passport user id893ee31
(controller) - oauth2: update user info pipline3028fb4
(controller) - user: set AnonymousUser username5daf82d
(controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss61f2c53
(controller) - controller: change nodes to pod affinity88feb1d
(controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14914e03f
(controller) - controller: use registry.drycc.cc replace docker.ioa5bb548
(controller) - controller: change python-dev registry3ecdd7c
(controller) - controller: add a separate rabbitmqUrl configuration967cb11
(controller) - controller: remove APP_STORAGE473d2b5
(controller) - controller: use env replace creds volumee410d4c
(controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfsc6ef777
(controller) - controller: simplified passport config0fd3233
(controller) - controller: remove settings hardcodea64e99c
(controller) - controller: change passport config62aba25
(controller) - controller: set cronjob timezone to utc760b70b
(controller) - controller: change default ratio8dffc3a
(controller) - controller: fine management affinity26043c4
(controller) - controller: change default app storage608bd8d
(controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs18ed0c2
(controller) - controller: remove conjob affinityadd6712
(controller) - controller: add volume expand support use patchcc1ad13
(controller) - controller: add startupProbe0e9a603
(controller) - controller: add clearsocial cronjobeb6f05d
(controller) - controller: change initContainers762c676
(controller) - controller: change replicasabd7e8c
(controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs07fdf1b
(controller) - controller: remove database conn_max_ageef8e41f
(controller) - controller: add database replica check79143f2
(controller) - controller: upgrade new requirea624048
(controller) - controller: add app.refresh func annotationb22d367
(controller) - controller: optimize app refresh timingfe98f0c
(database) - database: use exec runner replace docker runner5e00c11
(database) - database: canonical charts namingd2cb860
(database) - database: disable huge_pages197d80d
(database) - database: add persistence1c3e645
(database) - database: provide any additional service annotations37730ab
(database) - dockerfile: use drycc/base image5014112
(database) - dockerfile: change entrypoint29b538e
(database) - database: change nodes to pod affinityc2bb074
(database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48077a4e9
(database) - database: use registry.drycc.cc replace docker.io560bdb9
(database) - database: change python-dev registry1e54b55
(database) - database: https://github.com/minio/minio/issues/14331d646672
(database) - database: https://github.com/minio/minio/issues/13799a6ac4e3
(database) - database: use env replace creds volume9618d87
(database) - database: fine management affinityb823273
(database) - database: change minio to storage7bd5a90
(database) - database: add check storage health20c6d96
(database) - database: fix storage run error8bde830
(database) - database: upgrade to pg 14.5a33b5e5
(fluentd) - fluentd: update pluginseed7a78
(fluentd) - fluentd: update filter kubernetes settingcc83dd8
(fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logsba2feb2
(fluentd) - fluentd: use exec runner replace docker runnerd528676
(fluentd) - fluentd: simplify drone configurationdece82d
(fluentd) - fluentd: canonical charts naming4e0a802
(fluentd) - fluend: replace nsqd with redis15ceca0
(fluentd) - dockerfile: use drycc/base imagea7f619f
(fluentd) - dockerfile: change workdir9adf5ed
(fluentd) - database: bump fluentd 1.14.650c14c2
(fluentd) - fluentd: use registry.drycc.cc replace docker.io83171b1
(fluentd) - fluentd: change python-dev registryec83581
(fluentd) - fluentd: unified reids declaration07c63e2
(fluentd) - fluentd: upgrade fluentd 1.15.265df9be
(imagebuilder) - imagebuilder: update pack version66cab35
(imagebuilder) - imagebuilder: use dind replace go-dev0c82060
(imagebuilder) - imagebuilder: use exec runner replace docker runner8146da9
(imagebuilder) - imagebuilder: canonical charts naming7d97241
(imagebuilder) - dockerfile: use drycc/base image07e805c
(imagebuilder) - imagebuilder: change default buildpack8d1038d
(imagebuilder) - imagebuilder: upgrade podman to 4.0.162d3687
(imagebuilder) - imagebuilder: change workdir to /workspaceda8bfb0
(imagebuilder) - imagebuilder: change uid gid to 1001d44e3bc
(imagebuilder) - imagebuilder: upgrade stack5b0c7e6
(imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.iof74cbf6
(imagebuilder) - imagebuilder: add defaultBuildpacksURL941d493
(imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331449be91
(imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/1379963b0523
(imagebuilder) - imagebuilder: use env replace creds volume4e8a6e5
(imagebuilder) - imagebuilder: add imagebuilder config2d891f5
(imagebuilder) - imagebuilder: change minio to storageaddceda
(imagebuilder) - imagebuilder: upgrade new requirea6e569f
(imagebuilder) - imagebuilder: pack_build add –env-file parameter6191ff5
(influxdb) - influxdb: use exec runner replace docker runnerdc3f8c7
(influxdb) - influxdb: canonical charts naming6b5c819
(influxdb) - influxdb: new ingress style68b381d
(influxdb) - influxdb: provide any additional service annotationsea20eb8
(influxdb) - dockerfile: use drycc/base image64c0a71
(influxdb) - influxdb: set gid uid to 1001a709ca1
(influxdb) - influxdb: use DRYCC_UID DRYCC_GID env740dff0
(influxdb) - influxdb: use common affinity templatee035673
(influxdb) - influxdb: change nodes to pod affinityf1cefbd
(influxdb) - influxdb: use registry.drycc.cc replace docker.ioa00100e
(influxdb) - influxdb: fine management affinity9d165ef
(influxdb) - influxdb: add probebee7fff
(influxdb) - influxdb: upgrade to influxdb 2.4.0254914c
(logger) - logger: use exec runner replace docker runner8d91c68
(logger) - logger: canonical charts namingb6d2182
(logger) - logger: provide any additional service annotationsc35e59a
(logger) - dockerfile: use drycc/base imagea63c070
(logger) - logger: change workdir to /workspacea594b28
(logger) - logger: set gid uid to 10019a90e22
(logger) - dockerfile: use uid gid36493b4
(logger) - logger: use common affinity template897a3a5
(logger) - logger: change nodes to pod affinity03b32ab
(logger) - logger: use registry.drycc.cc replace docker.ioa50ba5f
(logger) - logger: change python-dev registry23187a3
(logger) - logger: unified reids declarationaaa129a
(logger) - logger: fine management affinitybe4f656
(logger) - logger: add replicas7c25459
(logger) - charts: add NetworkPolicy6810149
(logger) - logger: remove memory storagea918c50
(logger) - logger: add .vscode to .gitignorea415210
(logger) - logger: add log follow support59b1da3
(logger) - logger: upgrade new require27cc151
(monitor) - monitor: use exec runner replace docker runner07d6a9d
(monitor) - monitor: canonical charts naming1054357
(monitor) - monitor: use redis default porte3673df
(monitor) - monitor: remove nsqdfc9dd3e
(monitor) - monitor: new ingress style856a898
(monitor) - monitor: add default user env9857535
(monitor) - monitor: add random user38b5a04
(monitor) - grafana: oauth auto login5dfc579
(monitor) - monitor: upgrade versione121b5a
(monitor) - monitor: provide any additional service annotations84462a0
(monitor) - dockerfile: use drycc/base imageb9e8ce8
(monitor) - monitor: chore(imagebuilder): change uid gid to 100105ee8ab
(monitor) - dockerfile: use uid gide1fa68e
(monitor) - monitor: use common affinity templateb8f302b
(monitor) - monitor: change nodes to pod affinity4fc991f
(monitor) - database: bump telegraf 1.22.0 and grafana 8.4.521a2f6a
(monitor) - monitor: use registry.drycc.cc replace docker.ioacc976f
(monitor) - monitor: change python-dev registry62d76c1
(monitor) - monitor: unified reids declarationb3c57ad
(monitor) - monitor: optimize oauth2 configuration70af6b0
(monitor) - monitor: change passport config69f9a88
(monitor) - monitor: fine management affinity2fb278f
(monitor) - monitor: rename influxdb port17548ff
(monitor) - grafana: update dashborad69d7bbd
(monitor) - grafana: influx dashborad disk size75db1b0
(monitor) - monitor: upgrade new grafana/telegraf80504a1
(monitor) - grafana: update influx and redis dashboardf7078cb
(monitor) - monitor:chown use env91ae0dd
(passport) - passport: optimize login display2d3bbbc
(passport) - passport: change drycc logo59790a7
(passport) - passport: make user email uniquefaea034
(passport) - passport: use strtobool1fbf2bc
(passport) - passport: use yarn replace npm119cac8
(passport) - passport: use exec runner replace docker runnercff5062
(passport) - passport: set default CSRF_COOKIE_SECURE false9cc0210
(passport) - passport: canonical charts naming9ab3896
(passport) - passport: new ingress style259ccc9
(passport) - passport: provide any additional service annotationsaf1bbcd
(passport) - dockerfile: use drycc/base image9ae5373
(passport) - passport: set venv profile8f61090
(passport) - dockerfile: use uid gidfcaf72d
(passport) - passport: upgrade npm package546dcd5
(passport) - passport: add license4bda2d6
(passport) - passport: use minify73b0fd1
(passport) - passport: use common affinity template278fe7a
(passport) - passport: change nodes to pod affinity3cd93d3
(passport) - passport: add reactive370b493
(passport) - passport: add footer483cbd6
(passport) - passport: use h_captcha replace re_captcha3d1675e
(passport) - database: bump python 3.10.4 and node 16.14.286a7835
(passport) - passport: use registry.drycc.cc replace docker.io2d65355
(passport) - passport: change python-dev registry90c1444
(passport) - passport: unified reids declaration2e0e417
(passport) - passport: fix firefox footerad274be
(passport) - passport: use bulecssf986d8b
(passport) - passport: add main footer3e52867
(passport) - passport: dynamic settings for vue38adabc
(passport) - passport: change passport configf8d6b60
(passport) - passport: fine management affinity2cbd79d
(passport) - passport: remove database conn_max_age7122797
(passport) - passport: change drycc.cc to www.drycc.cc8cc84cd
(rabbitmq) - rabbitmq: use exec runner replace docker runnerf35930f
(rabbitmq) - rabbitmq: add rabbitmq cluster supportfbfa3ba
(rabbitmq) - rabbitmq: canonical charts namingca60701
(rabbitmq) - rabbitmq: use volumeClaimTemplatesfe5d1b4
(rabbitmq) - rabbitmq: add sharding support9c4ab97
(rabbitmq) - rabbitmq: provide any additional service annotations348a88a
(rabbitmq) - dockerfile: use drycc/base image2388be1
(rabbitmq) - rabbitmq: upgrade erlang to 24.2.2db2eaa5
(rabbitmq) - dockerfile: use uid gid772afd1
(rabbitmq) - rabbitmq: change to wait pid file2bfc25e
(rabbitmq) - rabbitmq: use common affinity template11d505e
(rabbitmq) - rabbitmq: change nodes to pod affinity69d63f1
(rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.148380299
(rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.iob3f69f1
(rabbitmq) - rabbitmq: add check rabbitmqLocaltion5327c76
(rabbitmq) - rabbitmq: fine management affinity5c66b5a
(rabbitmq) - rabbitmq: change probe27bebf9
(rabbitmq) - rabbitmq: add start-rabbitmq script86ee6a7
(rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.71f29683
(redis) - redis: use exec runner replace docker runnera5041fc
(redis) - redis: canonical charts naming64468c2
(redis) - redis: add redis persistencede5d753
(redis) - redis: provide any additional service annotationsf644639
(redis) - dockerfile: use drycc/base image98051d2
(redis) - redis: premission deniedbcb548e
(redis) - dockerfile: use uid gid524aa41
(redis) - redis: use common affinity template26c9466
(redis) - redis: change nodes to pod affinityb67d7a2
(redis) - redis: use registry.drycc.cc replace docker.io839ec50
(redis) - redis: use env replace creds volume237ca86
(redis) - redis: fine management affinitybdd968d
(redis) - redis: upgrade neew require8b2910f
(registry) - registry: use exec runner replace docker runnereedbe78
(registry) - registry: canonical charts naming0241615
(registry) - registry: provide any additional service annotations9b58da4
(registry) - dockerfile: use drycc/base imageab6acb7
(registry) - registry: change workdir to /workspacef368bf7
(registry) - registry: use DRYCC_UID DRYCC_GID envf4b9041
(registry) - registry: use common affinity templatec2e87ca
(registry) - registry: change nodes to pod affinityfeb6aba
(registry) - database: bump mc 2022.04.01.23.44.48956932b
(registry) - rregistry: use registry.drycc.cc replace docker.iodeda8d8
(registry) - registry: move registry-secret.yaml from workflow to registryf52c7bf
(registry) - registry: change python-dev registry007fe03
(registry) - registry: https://github.com/minio/minio/issues/14331d620c6d
(registry) - registry: https://github.com/minio/minio/issues/1379985e6b73
(registry) - registry: use env replace creds volume6a1155d
(registry) - registry: fine management affinity7b8ebae
(registry) - registry: change minio to storage1338951
(registry) - registry: add check storage health2fa769d
(registry) - registry: change probef187cbf
(registry) - registry: add replicas09d8a7b
(registry) - registry: upgrade to mc 2022.08.28.20.08.114b187b8
(registry-proxy) - registry-proxy: use exec runner replace docker runner29ffbbe
(registry-proxy) - registry-proxy: canonical charts naming6d783ba
(registry-proxy) - registry-proxy: remove use_cni8cf05cf
(registry-proxy) - dockerfile: use drycc/base image090e286
(registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 10017cf6120
(registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env3a00697
(registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io30e69e8
(registry-proxy) - registry-proxy: add registry basic auth proxy942abce
(registry-proxy) - registry-proxy: upgrade to nginx 1.23.15ea3297
(storage) - minio: use exec runner replace docker runner8306add
(storage) - minio: canonical charts namingc917e9f
(storage) - minio: provide any additional service annotations042c732
(storage) - dockerfile: use drycc/base image7b47b82
(storage) - minio: change workdir to /workspace6f3531e
(storage) - minio: use DRYCC_UID DRYCC_GID env9795fb1
(storage) - minio: use common affinity templatea7b09c5
(storage) - minio: change nodes to pod affinity7607342
(storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39ea2b2f1
(storage) - minio: use registry.drycc.cc replace docker.io445b501
(storage) - minio: https://github.com/minio/minio/issues/14331f19fbc7
(storage) - minio: use env replace creds volume8982e2e
(storage) - minio: use minio to distributed06bec73
(storage) - minio: fine management affinity9b8f006
(storage) - storage: remove assert59d64b9
(storage) - storage: change listen to POD_IP60044ee
(storage) - storage: add juicefs mount options189f944
(storage) - storage: remove volumeName302fe89
(storage) - storage: mv to minio dir6ec586d
(storage) - storage: change readinessProbee andlivenessProbe0e028df
(storage) - storage: add minio pdbcf9bd2d
(storage) - storage: add check storage health svc2dd5c9f
(storage) - storage: add volumeBindingModefa2effc
(storage) - storage: remove databaseBucketd166cc7
(storage) - charts: format network-policy named06bcce
(storage) - storage: upgrade to golang 1.19c2ca05c
(storage) - storage: upgrade new require10 minute read
+These release notes for Drycc Workflow v1.7.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.6.0, please refer to the following change summary.
+fcbebda
(builder) - builder: use TCPRoute expose serviced02bb5d
(controller) - controller: support app dns policy config9aa968e
(controller) - controller: add svc type support62e2d34
(controller) - controller: improve the services api4393755
(controller) - controller: use gateway replace ingress323045d
(controller) - controller: add canary support3f81c97
(controller) - gateways: add addresses field4e64aa7
(controller) - gateways: add addresses field02ad581
(monitor) - grafana: add pd tikv dashboard2a9e2b0
(monitor) - monitor: add storage monitor41d5057
(monitor) - grafana: data source change to prometheusec035d1
(monitor) - monitor: usegateway replace ingressc694c98
(monitor) - grafana: add drycc storage seaweedfs dashboard1e1fdc8
(passport) - passport: use gateway replace ingressffdb408
(prometheus) - prometheus: use gateway replace ingress04152b9
(rabbitmq) - rabbitmq: use gateway replace ingress0499500
(builder) - builder: manifest error642491d
(builder) - builder: no build log873d146
(controller) - controller: do not set entrypoint when no procfiled9028c5
(controller) - controller: pip8 error3efcfb7
(controller) - controller: manifest error18a3a1a
(controller) - controller: miss service error94f796c
(controller) - controller: drycc run pod should not restart80f3161
(controller) - controller: monitor query errorb76f2c5
(controller) - controller: read websocket delayb6e068e
(controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase configad9adc6
(controller) - controller: rabbitmq sharding err6773907
(controller) - controller: default k8s pod annotaionsffcf1f9
(controller) - controller: under-indented for visual indent3afd0cf
(controller) - controller: charts env error769bb8b
(database) - database: manifest error769bb8b
(database) - database: label conflict error6a321c5
(database) - database: link error558feae
(fluentbit) - fluentbit: build charts error98d8a2a
(gateway) - fixup8b5dde1
(gateway) - gateway: secretName702866d
(gateway) - gateway: build statusf55dac1
(imagebuilder) - imagebuilder: manifest errorac13b5f
(imagebuilder) - imagebuilder: build svg6b7bbc5
(logger) - logger: manifest error0136b5c
(monitor) - monitor: manifest errorf03d975
(passport) - passport: DRYCC_GRAFANA_DOMAIN errorb530ea8
(passport) - passport: manifest errorbe5a0a7
(passport) - passport: change passport1596c7f
(rabbitmq) - rabbitmq: manifest error0dc4f6f
(rabbitmq) - rabbitmq: images-shard error43293ae
(redis) - redis: manifest errorca13b7d
(registry) - registry: manifest errorab5c793
(registry) - registry: garbage collect errorab0fabc
(registry-proxy) - registry-proxy: manifest errordfc7236
(registry-proxy) - registry-proxy: daemon yaml format42c03be
(storage) - storage: seaweedfs csi error453e41a
(timeseries) - timeseries: could not register nodebdd02eb
(builder) - builder: use dynamic clusterrole name66b4b25
(builder) - builder: upgrade new controller-go-sdk219d86f
(builder) - builder: upgrade go.mod91f2f14
(builder) - builder: use woodpecker replace drone9abca16
(builder) - woodpecker: use woodpecker ci build statusf43dd50
(builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.00384c69
(builder) - builder: add chart appVersione3149b9
(builder) - builder: upgrade codename to bookwormd88ea1b
(builder) - builder: add codename build-argba59030
(builder) - builder: upgrade go.mod1114dd7
(builder) - builder: bump common 1.1.2fe50b62
(builder) - builder: change drycc gateway listener namedb3950c
(builder) - builder: remove gateway route5a508bb
(builder) - builder: use podman replace dockerbbb9029
(builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0f4e5d6c
(builder) - builder: remove health url9111c8f
(builder) - builder: remove io/ioutil1f36e3d
(controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfse4ab434
(controller) - controller: use woodpecker replace drone9f0301e
(controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs3932423
(controller) - woodpecker: use woodpecker ci build statusae8b6b4
(controller) - setting: support KUBERNETES_LIMITS env configc10b9bc
(controller) - controller: using the api_version instead of hard codinge6908cd
(controller) - controller: upgrade requirementsb0eba0c
(controller) - controller: add route rules serializer2e4b6a4
(controller) - controller: add chart appVersion7d32b55
(controller) - controller: upgrade to bookwormf2dc8dd
(controller) - controller: add codename build-arg5739b83
(controller) - controller: use timescaledb replace influxdb53892cb
(controller) - controller: add timeseries0fe0eae
(controller) - controller: upgrade requirements18b2a91
(controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfsf50874a
(controller) - controller: bump common 1.1.2956cd08
(controller) - controller: change drycc gateway listener name9ab3ead
(controller) - controller: remove passport url checka24c7b0
(controller) - controller: remove gateway routef7e539a
(controller) - controller: change celery priorityab77a52
(controller) - controller: use podman replace docker8e27501
(controller) - controller: dynamic app storage class385978b
(controller) - controller: list_pods datetime formatb20362c
(controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfse11ae1b
(controller) - controller: add cluster migrateca6e9df
(controller) - controller: async mount9a7fbfc
(controller) - controller: remove FOSSA3d55279
(controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfsd498a11
(controller) - controller: add measure loalancers249a985
(controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfsb967f58
(controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)8ca9ed6
(controller) - controller: no longer restrict reserved domain9ff6649
(database) - database: add init database configure9b4cd26
(database) - database: use dynamic clusterrole nameb59cde4
(database) - database: remove minio require86462f8
(database) - database: use woodpecker replace drone1e8555a
(database) - database: add chart appVersion1b762d5
(database) - database: upgrade codename to bookworm9ffe1fd
(database) - database: add codename build-arg69466d7
(database) - database: add database extensionbeb4b62
(database) - database: bump common 1.1.267e2714
(database) - database: use podman replace docker8f328f8
(fluentbit) - fluentbit: no limit buffer size for kube apifc0552c
(fluentbit) - fluentbit: use podman replace docker63a6cab
(fluentbit) - fluentbit: change fluentbit match220f81a
(fluentbit) - fluentbit: run as no-rootaec1393
(fluentbit) - fluentbit: change configmap name1af4fd2
(fluentbit) - fluentbit: change default stream namebef90ad
(gateway) - gateway: add route for gatewayd523ddb
(gateway) - gateway: change drycc gateway listener named9137f4
(gateway) - gateway: add chart appVersion0425dd4
(gateway) - gateway: add customListeners3982b86
(imagebuilder) - imagebuilder: use woodpecker replace drone3e4e7a3
(imagebuilder) - imagebuilder: add chart appVersion8df6e8e
(imagebuilder) - imagebuilder: upgrade stack versiona5601f7
(imagebuilder) - imagebuilder: add drycc_app env07465f8
(imagebuilder) - imagebuilder: upgrade to bookworm00d22d2
(imagebuilder) - imagebuilder: add codename build-arg0b7a24e
(imagebuilder) - imagebuilder: upgrade podman/mc/caddya7d8be8
(imagebuilder) - imagebuilder: use podman replace docker6b2da83
(logger) - logger: use woodpecker replace drone8245b25
(logger) - woodpecker: use woodpecker ci build statusf811a74
(logger) - logger: add chart appVersion413f6f6
(logger) - logger: upgrade codename to bookworm2ac6b10
(logger) - logger: add codename build-arg2581426
(logger) - logger: bump redis to v9364b25a
(logger) - logger: bump common 1.1.2dc169a3
(logger) - logger: use fluentbit replace fluentdd855d91
(logger) - logger: use podman replace dockerf767235
(monitor) - monitor: add off-cluster passport configureab23936
(monitor) - monitor: use dynamic clusterrole name47beee0
(monitor) - monitor: change tikv secret keyaf7703f
(monitor) - grafana: remove panel when component off-cluster1b870c2
(monitor) - monitor: use woodpecker replace drone4a5f1f1
(monitor) - grafana: up ldap api_url config143cabe
(monitor) - monitor: add prometheus architecture diagram93091c2
(monitor) - woodpecker: use woodpecker ci build status0b7045a
(monitor) - grafana: add dashboard kubernetes_deployment_metrics2fb1839
(monitor) - woodpecker: pipeline config VERSION, when build container imagee272416
(monitor) - monitor: add chart appVersionabc0e53
(monitor) - monitor: upgrade codename to bookworm86cc01b
(monitor) - monitor: add codename build-arg1cd849f
(monitor) - monitor: add postgresql outputsc3205c0
(monitor) - monitor: change default agent config8c802c0
(monitor) - monitor: add timeseries databasee9abc40
(monitor) - monitor: bump common 1.1.26af66cd
(monitor) - monitor: change drycc gateway listener named02d718
(monitor) - monitor: remove gateway route3509c29
(monitor) - monitor: use podman replace dockered7bfa2
(monitor) - monitor: optimize env PROMETHEUS_URLda89bef
(passport) - passport: charts codereview61c4a96
(passport) - passport: support init app config9101006
(passport) - passport: add initApplications to charts7dd7fa4
(passport) - passport: use woodpecker replace drone4400199
(passport) - woodpecker: use woodpecker ci build status6b2c546
(passport) - passport: change secret name to drycc-passport-auto-tlsc8bd824
(passport) - passport: upgrade requirementsaee5aef
(passport) - passport: add chart appVersion2d81953
(passport) - passport: upgrade codename to bookworm9e66242
(passport) - passport: add codename build-arg0fca998
(passport) - passport: upgrade requirements3482528
(passport) - passport: bump common 1.1.20c5ec93
(passport) - passport: change drycc gateway listener namef7b8f53
(passport) - passport: remove gateway routebaf69da
(passport) - passport: use podman replace dockerfcd45dd
(passport) - passport: add cluster migrateda6d32a
(prometheus) - prometheus: add prometheus-config683de9e
(prometheus) - prometheus: use podman replace docker3323300
(prometheus) - prometheus: remove gateway routeda1d356
(prometheus) - prometheus: change drycc gateway listener name4e7a936
(prometheus) - prometheus: bump common 1.1.244c1c6f
(prometheus) - prometheus: add codename build-argd1f1dda
(prometheus) - prometheus: upgrade codename to bookworm0836fc1
(prometheus) - prometheus: add chart appVersion9e13232
(prometheus) - prometheus: add LICENSEf53e14a
(rabbitmq) - rabbitmq: remove auto user0ec7277
(rabbitmq) - rabbitmq: use woodpecker replace dronef376a30
(rabbitmq) - woodpecker: use woodpecker ci build status51405d8
(rabbitmq) - rabbitmq: add chart appVersion463ca03
(rabbitmq) - rabbitmq: upgrade codename to bookworm1978a71
(rabbitmq) - rabbitmq: add codename build-arg139277f
(rabbitmq) - rabbitmq: bump common 1.1.2be49741
(rabbitmq) - rabbitmq: change drycc gateway listener name6d22518
(rabbitmq) - rabbitmq: remove gateway route0eb7833
(rabbitmq) - rabbitmq: add check shards9211063
(rabbitmq) - rabbitmq: erlang vm tuning optimization648a78d
(rabbitmq) - rabbitmq: use podman replace docker0b43a4d
(rabbitmq) - rabbitmq: add x-random exchangead1c4da
(redis) - redis: use woodpecker replace drone3f37f92
(redis) - redis: add chart appVersione3bef7a
(redis) - redis: upgrade codename to bookworm4e806d4
(redis) - redis: add codename build-argd5023be
(redis) - redis: bump common 1.1.298f5d6f
(redis) - redis: use podman replace docker063f29e
(registry) - registry: use woodpecker replace drone17bf8ae
(registry) - woodpecker: use woodpecker ci build status7bbad15
(registry) - registry: add chart appVersion279154f
(registry) - registry: upgrade codename to bookworm3e4ae84
(registry) - registry: add codename build-argfa322d6
(registry) - registry: bump common 1.1.26c18fe0
(registry) - registry: use podman replace docker0bc8472
(registry) - registry: remove health url5dacd9f
(registry) - registry: add wait-for-port checkfdeefc3
(registry) - registry: use headless08bf9f8
(registry) - registry: change registry port to 500040bcea2
(registry) - registry: add registry push test871b8e7
(registry) - registry: add default env7f3b3ac
(registry) - registry: bump registry 2.8.3569f15d
(registry-proxy) - registry-proxy: use woodpecker replace dronecc33caf
(registry-proxy) - woodpecker: use woodpecker ci build status0002aab
(registry-proxy) - registry-proxy: add chart appVersion40af10b
(registry-proxy) - registry-proxy: upgrade codename to bookwormc56b9df
(registry-proxy) - registry-proxy: add codename build-arg9d5bfe0
(registry-proxy) - registry-proxy: use podman replace dockere6a3350
(registry-proxy) - registry-proxy: change worker_processes to 1726f39d
(storage) - storage: add volume compactionMBpsa5aa2d8
(storage) - storage: add threshold to vacuum and reclaim spacese687d04
(storage) - storage: delete disk type in single disk case75ee2e4
(storage) - storage: change datanode replicas to 4c5fd7ba
(storage) - storage: delete useless envb3826ea
(storage) - storage: add ssd hdd dir29881a0
(storage) - storage: add balance cronjobc5a0f51
(storage) - storage: add defaultReplication for seaweedfs master543c7a2
(timeseries) - timeseries: use podman replace docker5376024
(timeseries) - timeseries: update timeseries-service-replica52e8520
(timeseries) - timeseries: bump common 1.1.2f82657c
(timeseries) - timeseries: add start script2 minute read
+These release notes for Drycc Workflow v1.7.2 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.1, please refer to the following change summary.
+2fe80a6
(controller) - resources: after resources instance update, could not delete (#111)a4082ad
(controller) - controller: resource status and bindinge9bfccc
(controller) - controller: fix multiple volumes mount at one dir error (#116)58d2b4c
(logger) - logger: redis conn error block7cb2700
(prometheus) - prometheus: prometheus config basic_auth7838c6b
(storage) - storage: random accesskey secretkeyd9dcdfb
(storage) - storage: pod restart loses data3cbdd29
(storage) - storage: tipd cannot start after deleting podbe7e11f
(storage) - storage: jq command not found878f674
(storage) - storage: charts updateStrategy error06cfe56
(timeseries) - timeseries: the data node ip is incorrect7f29f5a
(controller) - resources: retrieve resource instance response add message (#112)4a84dcd
(controller) - controller: add deploy default annotations (#113)829d7e5
(controller) - controller: modify url match service name (#114)30abf6d
(controller) - controller: transfer app ownership in asyncdc6f45e
(controller) - controller: add channel for pod execaf4f3a7
(controller) - controller: avoid error when secret no data field (#117)ca27956
(controller) - controller: add pod default securityb2e9c64
(prometheus) - charts: node-exporter mount root (#2)3cdb2b6
(storage) - storage: bump seaweedfs 3.6100dd2fd
(storage) - storage: add csi daemonset updateStrategy48e763c
(storage) - storage: add drycc storage upgrade document841df90
(storage) - storage: bump seaweedfs 3.62cefd52e
(timeseries) - timeseries: add check data node existsad1c46e
(workflow-cli) - resources: resources instance add message9f955c2
(workflow-cli) - workflow-cli: add short options cpu65399ef
(workflow-cli) - workflow-cli: add tty resize support2 minute read
+These release notes for Drycc Workflow v1.7.5 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.4, please refer to the following change summary.
+95d130a
(controller) - controller: volume support nfsee2ee15
(controller) - controller: container entrypoint error03ea4f8
(controller) - controller: class property have been deprecated in python 3.115f04d17
(controller) - controller: miss err msg27972a3
(controller) - controller: load_db_state_to_k8s erra005d62
(controller) - controller: volume repeat path no errorc7a5ba6
(rabbitmq) - rabbitmq: cpu usage to high45c2077
(workflow-cli) - workflow-cli: miss err msgbc738bd
(workflow-cli) - workflow-cli: volumes list format35e1c06
(builder) - builder: bump golang 1.2226caa36
(controller) - deps: bump aiohttp from 3.9.0 to 3.9.2 in /rootfs (#118)3d938c4
(controller) - deps: bump django from 4.2.7 to 4.2.10e625c2f
(logger) - logger: bump golang 1.22bfa500d
(redis) - redis: headless svc does not require ports330209a
(registry) - registry: headless svc does not require ports48c42eb
(storage) - storage: change volume index to leveldbf4fde9d
(storage) - storage: add volume size limit33e3684
(workflow-cli) - workflow-cli: volume support nfs48d5950
(workflow-cli) - workflow-cli: bump golang 1.226 minute read
+6c1cf5e
(builder) - charts: reuses the value from an existing secret and config65ae63c
(builder) - pipeline: add dryccfile supportbb7b11d
(builder) - auth: add tokens api39d022f
(controller) - ps: add pod logs support86056d0
(controller) - charts: reuses the value from an existing secret and config4cf005c
(controller) - limits: add limits plan supportbf60e4b
(controller) - controller: add init job98f77a8
(controller) - pipeline: add dryccfile support8ce9a83
(controller) - cert-manager: add tls events7034f5d
(controller) - config: deploy according to procfile_type5554d8f
(controller) - config: add typed_values2c5bbad
(controller) - auth: add token api410d34e
(database) - charts: reuses the value from an existing secret and config693e4d1
(imagebuilder) - pipeline: add dryccfile support7d9cc06
(imagebuilder) - config: add typed values854e171
(passport) - charts: reuses the value from an existing secret and config7ac9255
(passport) - oauth2: add authorization code for any grant type4517547
(rabbitmq) - charts: reuses the value from an existing secret and configbccfcb4
(redis) - charts: reuses the value from an existing secret and configd887605
(registry) - charts: reuses the value from an existing secret and configff09e5b
(storage) - charts: reuses the value from an existing secret and configc6e2ac8
(timeseries) - charts: reuses the value from an existing secret and config22c4c77
(workflow-cli) - apps: change drycc run to asynca9e6369
(workflow-cli) - ps: add pod logs support2bc31c8
(workflow-cli) - limits: add limits plan supportf40398a
(workflow-cli) - pipeline: add dryccfile support03638ff
(workflow-cli) - tls: add tls events9113627
(workflow-cli) - config: add typed values43ee760
(workflow-cli) - auth: add tokens api50dfe64
(builder) - woodpecker: CI_SYSTEM_ARCH env removedab09b24
(controller) - healthcheck: delete outdated code52019b5
(controller) - services: default PORT change errorf57ae42
(controller) - certificate: failed to create certificate30c3f54
(controller) - woodpecker: CI_SYSTEM_ARCH env removeddbba43a
(controller) - service: update port errore0459c5
(controller) - copy: use deepcopy replace copy2122479
(controller) - charts: failed to call webhook53d9977
(controller) - signals: config limits handle errorafda287
(controller) - limits: always set defaultb350cb8
(database) - woodpecker: CI_SYSTEM_ARCH env removedb48a422
(fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed7cebca2
(gateway) - cert-manager: auto tls error190c19b
(imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed2c6a6f9
(logger) - woodpecker: CI_SYSTEM_ARCH env removed10bb98d
(monitor) - woodpecker: CI_SYSTEM_ARCH env removedf8225dc
(passport) - woodpecker: CI_SYSTEM_ARCH env removed06db66c
(prometheus) - woodpecker: CI_SYSTEM_ARCH env removedf4aff72
(rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed88c18ff
(redis) - woodpecker: CI_SYSTEM_ARCH env removed5dcc19d
(registry) - woodpecker: CI_SYSTEM_ARCH env removed092a939
(registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed3597ac9
(storage) - woodpecker: CI_SYSTEM_ARCH env removed5a49b35
(timeseries) - woodpecker: CI_SYSTEM_ARCH env removed0c4a48a
(workflow-cli) - tls: change issuer options06a2511
(workflow-cli) - tls: info error2f7617e
(builder) - go: bump controller-sdk-go versionaae2f29
(builder) - charts: add diagnostic mode7304980
(builder) - woodpecker: migrations woodpecker-ci to 230b648b
(builder) - charts: change canary app version2afa006
(builder) - controller-sdk-go: bump versiond127a90
(builder) - config: add typed values32fdfd0
(controller) - charts: add diagnostic mode0974942
(controller) - woodpecker: migrations woodpecker-ci to 2f401e08
(controller) - python: bump python 3.12c565959
(controller) - celery: remove retrieve_resource task47be1a1
(controller) - requirements: bump drf 3.15.199f7468
(controller) - charts: add config to values.yaml7d17f5c
(controller) - scale: prohibit scale when there is a running pipelinef09e1c9
(controller) - resource: sort services and planse817505
(controller) - limits: change default cpu and gpu name5531b2f
(controller) - auth: add password login27473f7
(controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfsc1ee1c7
(controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfsaffbcb5
(database) - postgres: add patroni and postgres params (#15)f9e4eda
(database) - dockerfile: install vi008b7b6
(database) - dockerfile: install vim instand of vidbbfee1
(database) - charts: add diagnostic mode2e26c33
(database) - woodpecker: migrations woodpecker-ci to 2a1b81f2
(database) - charts: change canary app versionbc725e8
(fluentbit) - charts: add diagnostic mode5d73886
(fluentbit) - woodpecker: migrations woodpecker-ci to 2b85072d
(fluentbit) - charts: change canary app version761174d
(gateway) - gateway: change secrets name1c304da
(gateway) - woodpecker: migrations woodpecker-ci to 2b919a4c
(gateway) - charts: change canary app version3cea298
(imagebuilder) - charts: allow all dns653bcbe
(imagebuilder) - woodpecker: migrations woodpecker-ci to 259daeab
(imagebuilder) - charts: change canary app version2834a5a
(logger) - charts: add diagnostic mode6685492
(logger) - woodpecker: migrations woodpecker-ci to 2191cdaf
(logger) - charts: change canary app versionb3c3cfa
(monitor) - charts: add diagnostic mode796799d
(monitor) - grafana: add node metrics dashboardef2a222
(monitor) - woodpecker: migrations woodpecker-ci to 29c83090
(monitor) - charts: change canary app version1a97c2c
(passport) - charts: add diagnostic mode353e1ae
(passport) - logger: add oauth2_provider logger configfe735c0
(passport) - woodpecker: migrations woodpecker-ci to 241d6144
(passport) - charts: change canary app version979d474
(passport) - python: bump python 3.12e9f41a1
(passport) - requirements: bump drf 3.15.1f479f4d
(passport) - charts: add migrate jobad9abf6
(passport) - passport: migrations add run_before95ac667
(passport) - passport: optimize the use of master and slave database rules204f7fc
(passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs90a6410
(prometheus) - woodpecker: migrations woodpecker-ci to 22d8eb44
(prometheus) - charts: change canary app version9687a17
(rabbitmq) - charts: add diagnostic mode35d3d5b
(rabbitmq) - woodpecker: migrations woodpecker-ci to 26a6564d
(rabbitmq) - charts: change canary app versioncb6722f
(redis) - charts: add diagnostic mode9553497
(redis) - woodpecker: migrations woodpecker-ci to 21c8dc07
(redis) - charts: change canary app version9fa2a32
(registry) - charts: add diagnostic mode9b09e51
(registry) - woodpecker: migrations woodpecker-ci to 27dbd390
(registry) - charts: change canary app versione1d2a33
(registry-proxy) - charts: add diagnostic mode3eabfdd
(registry-proxy) - charts: remove default limitsf8754da
(registry-proxy) - woodpecker: migrations woodpecker-ci to 27df7316
(registry-proxy) - charts: change canary app version861d3b8
(storage) - filer: modify the default parameters of the filer5fa08da
(storage) - woodpecker: migrations woodpecker-ci to 222c4620
(storage) - charts: change canary app version6c1e29c
(timeseries) - postgres: add patroni paramse280d3f
(timeseries) - dockerfile: install vi5213617
(timeseries) - dockerfile: install vim instand of via569a57
(timeseries) - charts: add diagnostic modeb93ec70
(timeseries) - woodpecker: migrations woodpecker-ci to 2ff3b870
(timeseries) - charts: change canary app versione334f74
(workflow-cli) - healthcheck: delete outdated healthcheck style4f8b960
(workflow-cli) - auth: add password loginless than a minute
++This is the multi-page printable view of this section. +Click here to print. +
+This is the blog section. It has two categories: News and Releases.
+Files in these directories will be listed in reverse chronological order.
+ +Drycc Workflow is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage applications.
+We welcome your input! If you have feedback, please submit an issue. If you’d like to participate in development, please read the “Working on Documentation” section below and submit a pull request.
+ +6c1cf5e
(builder) - charts: reuses the value from an existing secret and config65ae63c
(builder) - pipeline: add dryccfile supportbb7b11d
(builder) - auth: add tokens api39d022f
(controller) - ps: add pod logs support86056d0
(controller) - charts: reuses the value from an existing secret and config4cf005c
(controller) - limits: add limits plan supportbf60e4b
(controller) - controller: add init job98f77a8
(controller) - pipeline: add dryccfile support8ce9a83
(controller) - cert-manager: add tls events7034f5d
(controller) - config: deploy according to procfile_type5554d8f
(controller) - config: add typed_values2c5bbad
(controller) - auth: add token api410d34e
(database) - charts: reuses the value from an existing secret and config693e4d1
(imagebuilder) - pipeline: add dryccfile support7d9cc06
(imagebuilder) - config: add typed values854e171
(passport) - charts: reuses the value from an existing secret and config7ac9255
(passport) - oauth2: add authorization code for any grant type4517547
(rabbitmq) - charts: reuses the value from an existing secret and configbccfcb4
(redis) - charts: reuses the value from an existing secret and configd887605
(registry) - charts: reuses the value from an existing secret and configff09e5b
(storage) - charts: reuses the value from an existing secret and configc6e2ac8
(timeseries) - charts: reuses the value from an existing secret and config22c4c77
(workflow-cli) - apps: change drycc run to asynca9e6369
(workflow-cli) - ps: add pod logs support2bc31c8
(workflow-cli) - limits: add limits plan supportf40398a
(workflow-cli) - pipeline: add dryccfile support03638ff
(workflow-cli) - tls: add tls events9113627
(workflow-cli) - config: add typed values43ee760
(workflow-cli) - auth: add tokens api50dfe64
(builder) - woodpecker: CI_SYSTEM_ARCH env removedab09b24
(controller) - healthcheck: delete outdated code52019b5
(controller) - services: default PORT change errorf57ae42
(controller) - certificate: failed to create certificate30c3f54
(controller) - woodpecker: CI_SYSTEM_ARCH env removeddbba43a
(controller) - service: update port errore0459c5
(controller) - copy: use deepcopy replace copy2122479
(controller) - charts: failed to call webhook53d9977
(controller) - signals: config limits handle errorafda287
(controller) - limits: always set defaultb350cb8
(database) - woodpecker: CI_SYSTEM_ARCH env removedb48a422
(fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed7cebca2
(gateway) - cert-manager: auto tls error190c19b
(imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed2c6a6f9
(logger) - woodpecker: CI_SYSTEM_ARCH env removed10bb98d
(monitor) - woodpecker: CI_SYSTEM_ARCH env removedf8225dc
(passport) - woodpecker: CI_SYSTEM_ARCH env removed06db66c
(prometheus) - woodpecker: CI_SYSTEM_ARCH env removedf4aff72
(rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed88c18ff
(redis) - woodpecker: CI_SYSTEM_ARCH env removed5dcc19d
(registry) - woodpecker: CI_SYSTEM_ARCH env removed092a939
(registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed3597ac9
(storage) - woodpecker: CI_SYSTEM_ARCH env removed5a49b35
(timeseries) - woodpecker: CI_SYSTEM_ARCH env removed0c4a48a
(workflow-cli) - tls: change issuer options06a2511
(workflow-cli) - tls: info error2f7617e
(builder) - go: bump controller-sdk-go versionaae2f29
(builder) - charts: add diagnostic mode7304980
(builder) - woodpecker: migrations woodpecker-ci to 230b648b
(builder) - charts: change canary app version2afa006
(builder) - controller-sdk-go: bump versiond127a90
(builder) - config: add typed values32fdfd0
(controller) - charts: add diagnostic mode0974942
(controller) - woodpecker: migrations woodpecker-ci to 2f401e08
(controller) - python: bump python 3.12c565959
(controller) - celery: remove retrieve_resource task47be1a1
(controller) - requirements: bump drf 3.15.199f7468
(controller) - charts: add config to values.yaml7d17f5c
(controller) - scale: prohibit scale when there is a running pipelinef09e1c9
(controller) - resource: sort services and planse817505
(controller) - limits: change default cpu and gpu name5531b2f
(controller) - auth: add password login27473f7
(controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfsc1ee1c7
(controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfsaffbcb5
(database) - postgres: add patroni and postgres params (#15)f9e4eda
(database) - dockerfile: install vi008b7b6
(database) - dockerfile: install vim instand of vidbbfee1
(database) - charts: add diagnostic mode2e26c33
(database) - woodpecker: migrations woodpecker-ci to 2a1b81f2
(database) - charts: change canary app versionbc725e8
(fluentbit) - charts: add diagnostic mode5d73886
(fluentbit) - woodpecker: migrations woodpecker-ci to 2b85072d
(fluentbit) - charts: change canary app version761174d
(gateway) - gateway: change secrets name1c304da
(gateway) - woodpecker: migrations woodpecker-ci to 2b919a4c
(gateway) - charts: change canary app version3cea298
(imagebuilder) - charts: allow all dns653bcbe
(imagebuilder) - woodpecker: migrations woodpecker-ci to 259daeab
(imagebuilder) - charts: change canary app version2834a5a
(logger) - charts: add diagnostic mode6685492
(logger) - woodpecker: migrations woodpecker-ci to 2191cdaf
(logger) - charts: change canary app versionb3c3cfa
(monitor) - charts: add diagnostic mode796799d
(monitor) - grafana: add node metrics dashboardef2a222
(monitor) - woodpecker: migrations woodpecker-ci to 29c83090
(monitor) - charts: change canary app version1a97c2c
(passport) - charts: add diagnostic mode353e1ae
(passport) - logger: add oauth2_provider logger configfe735c0
(passport) - woodpecker: migrations woodpecker-ci to 241d6144
(passport) - charts: change canary app version979d474
(passport) - python: bump python 3.12e9f41a1
(passport) - requirements: bump drf 3.15.1f479f4d
(passport) - charts: add migrate jobad9abf6
(passport) - passport: migrations add run_before95ac667
(passport) - passport: optimize the use of master and slave database rules204f7fc
(passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs90a6410
(prometheus) - woodpecker: migrations woodpecker-ci to 22d8eb44
(prometheus) - charts: change canary app version9687a17
(rabbitmq) - charts: add diagnostic mode35d3d5b
(rabbitmq) - woodpecker: migrations woodpecker-ci to 26a6564d
(rabbitmq) - charts: change canary app versioncb6722f
(redis) - charts: add diagnostic mode9553497
(redis) - woodpecker: migrations woodpecker-ci to 21c8dc07
(redis) - charts: change canary app version9fa2a32
(registry) - charts: add diagnostic mode9b09e51
(registry) - woodpecker: migrations woodpecker-ci to 27dbd390
(registry) - charts: change canary app versione1d2a33
(registry-proxy) - charts: add diagnostic mode3eabfdd
(registry-proxy) - charts: remove default limitsf8754da
(registry-proxy) - woodpecker: migrations woodpecker-ci to 27df7316
(registry-proxy) - charts: change canary app version861d3b8
(storage) - filer: modify the default parameters of the filer5fa08da
(storage) - woodpecker: migrations woodpecker-ci to 222c4620
(storage) - charts: change canary app version6c1e29c
(timeseries) - postgres: add patroni paramse280d3f
(timeseries) - dockerfile: install vi5213617
(timeseries) - dockerfile: install vim instand of via569a57
(timeseries) - charts: add diagnostic modeb93ec70
(timeseries) - woodpecker: migrations woodpecker-ci to 2ff3b870
(timeseries) - charts: change canary app versione334f74
(workflow-cli) - healthcheck: delete outdated healthcheck style4f8b960
(workflow-cli) - auth: add password loginThese release notes for Drycc Workflow v1.7.5 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.4, please refer to the following change summary.
+95d130a
(controller) - controller: volume support nfsee2ee15
(controller) - controller: container entrypoint error03ea4f8
(controller) - controller: class property have been deprecated in python 3.115f04d17
(controller) - controller: miss err msg27972a3
(controller) - controller: load_db_state_to_k8s erra005d62
(controller) - controller: volume repeat path no errorc7a5ba6
(rabbitmq) - rabbitmq: cpu usage to high45c2077
(workflow-cli) - workflow-cli: miss err msgbc738bd
(workflow-cli) - workflow-cli: volumes list format35e1c06
(builder) - builder: bump golang 1.2226caa36
(controller) - deps: bump aiohttp from 3.9.0 to 3.9.2 in /rootfs (#118)3d938c4
(controller) - deps: bump django from 4.2.7 to 4.2.10e625c2f
(logger) - logger: bump golang 1.22bfa500d
(redis) - redis: headless svc does not require ports330209a
(registry) - registry: headless svc does not require ports48c42eb
(storage) - storage: change volume index to leveldbf4fde9d
(storage) - storage: add volume size limit33e3684
(workflow-cli) - workflow-cli: volume support nfs48d5950
(workflow-cli) - workflow-cli: bump golang 1.226cb63b6
(storage) - seaweedfs: bump version 3.63These release notes for Drycc Workflow v1.7.2 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.1, please refer to the following change summary.
+2fe80a6
(controller) - resources: after resources instance update, could not delete (#111)a4082ad
(controller) - controller: resource status and bindinge9bfccc
(controller) - controller: fix multiple volumes mount at one dir error (#116)58d2b4c
(logger) - logger: redis conn error block7cb2700
(prometheus) - prometheus: prometheus config basic_auth7838c6b
(storage) - storage: random accesskey secretkeyd9dcdfb
(storage) - storage: pod restart loses data3cbdd29
(storage) - storage: tipd cannot start after deleting podbe7e11f
(storage) - storage: jq command not found878f674
(storage) - storage: charts updateStrategy error06cfe56
(timeseries) - timeseries: the data node ip is incorrect7f29f5a
(controller) - resources: retrieve resource instance response add message (#112)4a84dcd
(controller) - controller: add deploy default annotations (#113)829d7e5
(controller) - controller: modify url match service name (#114)30abf6d
(controller) - controller: transfer app ownership in asyncdc6f45e
(controller) - controller: add channel for pod execaf4f3a7
(controller) - controller: avoid error when secret no data field (#117)ca27956
(controller) - controller: add pod default securityb2e9c64
(prometheus) - charts: node-exporter mount root (#2)3cdb2b6
(storage) - storage: bump seaweedfs 3.6100dd2fd
(storage) - storage: add csi daemonset updateStrategy48e763c
(storage) - storage: add drycc storage upgrade document841df90
(storage) - storage: bump seaweedfs 3.62cefd52e
(timeseries) - timeseries: add check data node existsad1c46e
(workflow-cli) - resources: resources instance add message9f955c2
(workflow-cli) - workflow-cli: add short options cpu65399ef
(workflow-cli) - workflow-cli: add tty resize supportThese release notes for Drycc Workflow v1.7.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.6.0, please refer to the following change summary.
+fcbebda
(builder) - builder: use TCPRoute expose serviced02bb5d
(controller) - controller: support app dns policy config9aa968e
(controller) - controller: add svc type support62e2d34
(controller) - controller: improve the services api4393755
(controller) - controller: use gateway replace ingress323045d
(controller) - controller: add canary support3f81c97
(controller) - gateways: add addresses field4e64aa7
(controller) - gateways: add addresses field02ad581
(monitor) - grafana: add pd tikv dashboard2a9e2b0
(monitor) - monitor: add storage monitor41d5057
(monitor) - grafana: data source change to prometheusec035d1
(monitor) - monitor: usegateway replace ingressc694c98
(monitor) - grafana: add drycc storage seaweedfs dashboard1e1fdc8
(passport) - passport: use gateway replace ingressffdb408
(prometheus) - prometheus: use gateway replace ingress04152b9
(rabbitmq) - rabbitmq: use gateway replace ingress0499500
(builder) - builder: manifest error642491d
(builder) - builder: no build log873d146
(controller) - controller: do not set entrypoint when no procfiled9028c5
(controller) - controller: pip8 error3efcfb7
(controller) - controller: manifest error18a3a1a
(controller) - controller: miss service error94f796c
(controller) - controller: drycc run pod should not restart80f3161
(controller) - controller: monitor query errorb76f2c5
(controller) - controller: read websocket delayb6e068e
(controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase configad9adc6
(controller) - controller: rabbitmq sharding err6773907
(controller) - controller: default k8s pod annotaionsffcf1f9
(controller) - controller: under-indented for visual indent3afd0cf
(controller) - controller: charts env error769bb8b
(database) - database: manifest error769bb8b
(database) - database: label conflict error6a321c5
(database) - database: link error558feae
(fluentbit) - fluentbit: build charts error98d8a2a
(gateway) - fixup8b5dde1
(gateway) - gateway: secretName702866d
(gateway) - gateway: build statusf55dac1
(imagebuilder) - imagebuilder: manifest errorac13b5f
(imagebuilder) - imagebuilder: build svg6b7bbc5
(logger) - logger: manifest error0136b5c
(monitor) - monitor: manifest errorf03d975
(passport) - passport: DRYCC_GRAFANA_DOMAIN errorb530ea8
(passport) - passport: manifest errorbe5a0a7
(passport) - passport: change passport1596c7f
(rabbitmq) - rabbitmq: manifest error0dc4f6f
(rabbitmq) - rabbitmq: images-shard error43293ae
(redis) - redis: manifest errorca13b7d
(registry) - registry: manifest errorab5c793
(registry) - registry: garbage collect errorab0fabc
(registry-proxy) - registry-proxy: manifest errordfc7236
(registry-proxy) - registry-proxy: daemon yaml format42c03be
(storage) - storage: seaweedfs csi error453e41a
(timeseries) - timeseries: could not register nodebdd02eb
(builder) - builder: use dynamic clusterrole name66b4b25
(builder) - builder: upgrade new controller-go-sdk219d86f
(builder) - builder: upgrade go.mod91f2f14
(builder) - builder: use woodpecker replace drone9abca16
(builder) - woodpecker: use woodpecker ci build statusf43dd50
(builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.00384c69
(builder) - builder: add chart appVersione3149b9
(builder) - builder: upgrade codename to bookwormd88ea1b
(builder) - builder: add codename build-argba59030
(builder) - builder: upgrade go.mod1114dd7
(builder) - builder: bump common 1.1.2fe50b62
(builder) - builder: change drycc gateway listener namedb3950c
(builder) - builder: remove gateway route5a508bb
(builder) - builder: use podman replace dockerbbb9029
(builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0f4e5d6c
(builder) - builder: remove health url9111c8f
(builder) - builder: remove io/ioutil1f36e3d
(controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfse4ab434
(controller) - controller: use woodpecker replace drone9f0301e
(controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs3932423
(controller) - woodpecker: use woodpecker ci build statusae8b6b4
(controller) - setting: support KUBERNETES_LIMITS env configc10b9bc
(controller) - controller: using the api_version instead of hard codinge6908cd
(controller) - controller: upgrade requirementsb0eba0c
(controller) - controller: add route rules serializer2e4b6a4
(controller) - controller: add chart appVersion7d32b55
(controller) - controller: upgrade to bookwormf2dc8dd
(controller) - controller: add codename build-arg5739b83
(controller) - controller: use timescaledb replace influxdb53892cb
(controller) - controller: add timeseries0fe0eae
(controller) - controller: upgrade requirements18b2a91
(controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfsf50874a
(controller) - controller: bump common 1.1.2956cd08
(controller) - controller: change drycc gateway listener name9ab3ead
(controller) - controller: remove passport url checka24c7b0
(controller) - controller: remove gateway routef7e539a
(controller) - controller: change celery priorityab77a52
(controller) - controller: use podman replace docker8e27501
(controller) - controller: dynamic app storage class385978b
(controller) - controller: list_pods datetime formatb20362c
(controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfse11ae1b
(controller) - controller: add cluster migrateca6e9df
(controller) - controller: async mount9a7fbfc
(controller) - controller: remove FOSSA3d55279
(controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfsd498a11
(controller) - controller: add measure loalancers249a985
(controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfsb967f58
(controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)8ca9ed6
(controller) - controller: no longer restrict reserved domain9ff6649
(database) - database: add init database configure9b4cd26
(database) - database: use dynamic clusterrole nameb59cde4
(database) - database: remove minio require86462f8
(database) - database: use woodpecker replace drone1e8555a
(database) - database: add chart appVersion1b762d5
(database) - database: upgrade codename to bookworm9ffe1fd
(database) - database: add codename build-arg69466d7
(database) - database: add database extensionbeb4b62
(database) - database: bump common 1.1.267e2714
(database) - database: use podman replace docker8f328f8
(fluentbit) - fluentbit: no limit buffer size for kube apifc0552c
(fluentbit) - fluentbit: use podman replace docker63a6cab
(fluentbit) - fluentbit: change fluentbit match220f81a
(fluentbit) - fluentbit: run as no-rootaec1393
(fluentbit) - fluentbit: change configmap name1af4fd2
(fluentbit) - fluentbit: change default stream namebef90ad
(gateway) - gateway: add route for gatewayd523ddb
(gateway) - gateway: change drycc gateway listener named9137f4
(gateway) - gateway: add chart appVersion0425dd4
(gateway) - gateway: add customListeners3982b86
(imagebuilder) - imagebuilder: use woodpecker replace drone3e4e7a3
(imagebuilder) - imagebuilder: add chart appVersion8df6e8e
(imagebuilder) - imagebuilder: upgrade stack versiona5601f7
(imagebuilder) - imagebuilder: add drycc_app env07465f8
(imagebuilder) - imagebuilder: upgrade to bookworm00d22d2
(imagebuilder) - imagebuilder: add codename build-arg0b7a24e
(imagebuilder) - imagebuilder: upgrade podman/mc/caddya7d8be8
(imagebuilder) - imagebuilder: use podman replace docker6b2da83
(logger) - logger: use woodpecker replace drone8245b25
(logger) - woodpecker: use woodpecker ci build statusf811a74
(logger) - logger: add chart appVersion413f6f6
(logger) - logger: upgrade codename to bookworm2ac6b10
(logger) - logger: add codename build-arg2581426
(logger) - logger: bump redis to v9364b25a
(logger) - logger: bump common 1.1.2dc169a3
(logger) - logger: use fluentbit replace fluentdd855d91
(logger) - logger: use podman replace dockerf767235
(monitor) - monitor: add off-cluster passport configureab23936
(monitor) - monitor: use dynamic clusterrole name47beee0
(monitor) - monitor: change tikv secret keyaf7703f
(monitor) - grafana: remove panel when component off-cluster1b870c2
(monitor) - monitor: use woodpecker replace drone4a5f1f1
(monitor) - grafana: up ldap api_url config143cabe
(monitor) - monitor: add prometheus architecture diagram93091c2
(monitor) - woodpecker: use woodpecker ci build status0b7045a
(monitor) - grafana: add dashboard kubernetes_deployment_metrics2fb1839
(monitor) - woodpecker: pipeline config VERSION, when build container imagee272416
(monitor) - monitor: add chart appVersionabc0e53
(monitor) - monitor: upgrade codename to bookworm86cc01b
(monitor) - monitor: add codename build-arg1cd849f
(monitor) - monitor: add postgresql outputsc3205c0
(monitor) - monitor: change default agent config8c802c0
(monitor) - monitor: add timeseries databasee9abc40
(monitor) - monitor: bump common 1.1.26af66cd
(monitor) - monitor: change drycc gateway listener named02d718
(monitor) - monitor: remove gateway route3509c29
(monitor) - monitor: use podman replace dockered7bfa2
(monitor) - monitor: optimize env PROMETHEUS_URLda89bef
(passport) - passport: charts codereview61c4a96
(passport) - passport: support init app config9101006
(passport) - passport: add initApplications to charts7dd7fa4
(passport) - passport: use woodpecker replace drone4400199
(passport) - woodpecker: use woodpecker ci build status6b2c546
(passport) - passport: change secret name to drycc-passport-auto-tlsc8bd824
(passport) - passport: upgrade requirementsaee5aef
(passport) - passport: add chart appVersion2d81953
(passport) - passport: upgrade codename to bookworm9e66242
(passport) - passport: add codename build-arg0fca998
(passport) - passport: upgrade requirements3482528
(passport) - passport: bump common 1.1.20c5ec93
(passport) - passport: change drycc gateway listener namef7b8f53
(passport) - passport: remove gateway routebaf69da
(passport) - passport: use podman replace dockerfcd45dd
(passport) - passport: add cluster migrateda6d32a
(prometheus) - prometheus: add prometheus-config683de9e
(prometheus) - prometheus: use podman replace docker3323300
(prometheus) - prometheus: remove gateway routeda1d356
(prometheus) - prometheus: change drycc gateway listener name4e7a936
(prometheus) - prometheus: bump common 1.1.244c1c6f
(prometheus) - prometheus: add codename build-argd1f1dda
(prometheus) - prometheus: upgrade codename to bookworm0836fc1
(prometheus) - prometheus: add chart appVersion9e13232
(prometheus) - prometheus: add LICENSEf53e14a
(rabbitmq) - rabbitmq: remove auto user0ec7277
(rabbitmq) - rabbitmq: use woodpecker replace dronef376a30
(rabbitmq) - woodpecker: use woodpecker ci build status51405d8
(rabbitmq) - rabbitmq: add chart appVersion463ca03
(rabbitmq) - rabbitmq: upgrade codename to bookworm1978a71
(rabbitmq) - rabbitmq: add codename build-arg139277f
(rabbitmq) - rabbitmq: bump common 1.1.2be49741
(rabbitmq) - rabbitmq: change drycc gateway listener name6d22518
(rabbitmq) - rabbitmq: remove gateway route0eb7833
(rabbitmq) - rabbitmq: add check shards9211063
(rabbitmq) - rabbitmq: erlang vm tuning optimization648a78d
(rabbitmq) - rabbitmq: use podman replace docker0b43a4d
(rabbitmq) - rabbitmq: add x-random exchangead1c4da
(redis) - redis: use woodpecker replace drone3f37f92
(redis) - redis: add chart appVersione3bef7a
(redis) - redis: upgrade codename to bookworm4e806d4
(redis) - redis: add codename build-argd5023be
(redis) - redis: bump common 1.1.298f5d6f
(redis) - redis: use podman replace docker063f29e
(registry) - registry: use woodpecker replace drone17bf8ae
(registry) - woodpecker: use woodpecker ci build status7bbad15
(registry) - registry: add chart appVersion279154f
(registry) - registry: upgrade codename to bookworm3e4ae84
(registry) - registry: add codename build-argfa322d6
(registry) - registry: bump common 1.1.26c18fe0
(registry) - registry: use podman replace docker0bc8472
(registry) - registry: remove health url5dacd9f
(registry) - registry: add wait-for-port checkfdeefc3
(registry) - registry: use headless08bf9f8
(registry) - registry: change registry port to 500040bcea2
(registry) - registry: add registry push test871b8e7
(registry) - registry: add default env7f3b3ac
(registry) - registry: bump registry 2.8.3569f15d
(registry-proxy) - registry-proxy: use woodpecker replace dronecc33caf
(registry-proxy) - woodpecker: use woodpecker ci build status0002aab
(registry-proxy) - registry-proxy: add chart appVersion40af10b
(registry-proxy) - registry-proxy: upgrade codename to bookwormc56b9df
(registry-proxy) - registry-proxy: add codename build-arg9d5bfe0
(registry-proxy) - registry-proxy: use podman replace dockere6a3350
(registry-proxy) - registry-proxy: change worker_processes to 1726f39d
(storage) - storage: add volume compactionMBpsa5aa2d8
(storage) - storage: add threshold to vacuum and reclaim spacese687d04
(storage) - storage: delete disk type in single disk case75ee2e4
(storage) - storage: change datanode replicas to 4c5fd7ba
(storage) - storage: delete useless envb3826ea
(storage) - storage: add ssd hdd dir29881a0
(storage) - storage: add balance cronjobc5a0f51
(storage) - storage: add defaultReplication for seaweedfs master543c7a2
(timeseries) - timeseries: use podman replace docker5376024
(timeseries) - timeseries: update timeseries-service-replica52e8520
(timeseries) - timeseries: bump common 1.1.2f82657c
(timeseries) - timeseries: add start scriptThese release notes for Drycc Workflow v1.6.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.5.0, please refer to the following change summary.
+52517d9
(builder) - builder: update controller-sdk-go1d78ca0
(builder) - builder: add affinity26b6980
(builder) - builder: switch charts to ocibfd4385
(controller) - controller: add get manager user status874208d
(controller) - controller: unified measurement modelcadf98f
(controller) - controller: add admission webhooke0050c2
(controller) - controller: new measurement modela11ba58
(controller) - controller: multi pod restart uses asyncfb3c15d
(controller) - controller: add check app owner status3d78b76
(controller) - controller: add resource services api3d6a201
(controller) - controller: add search apps api01c443a
(controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter7c26232
(controller) - controller: add volume size limit3bee749
(controller) - controller: add annotations support23cd97c
(controller) - controller: traefik v2 supporte37b7db
(controller) - controller: add affinityb3b367b
(controller) - controller: add volume expand supporta4e154a
(controller) - controller: add database replica support2f37216
(controller) - controller: switch wsgi to asgib3314a5
(controller) - controller: add pod exec api75df2dc
(controller) - controller: add stream support for app logs4229bad
(controller) - ccontroller: switch charts to oci89bb19b
(database) - database: upgrade to pg149f45a5d
(database) - database: add hugepages supportc4008c9
(database) - database: add affinity411a7b2
(database) - postgres: use patroni64e5cb0
(database) - database: switch charts to oci2bab823
(fluentd) - fluentd: switch charts to oci337ba62
(imagebuilder) - imagebuilder: run podman as rootless4396ffa
(imagebuilder) - imagebuilder: switch to oci chartsf37ae09
(influxdb) - influxdb: add affinity04503b2
(influxdb) - influxdb: add influxdb ha41ddad5
(influxdb) - influxdb: switch charts to oci2006480
(logger) - logger: use redis stream replace nsqdab23d17
(logger) - logger: add affinity81d4e9d
(logger) - logger: switch charts to ocic3d9796
(monitor) - monitor: add affinitycd9de3c
(monitor) - monitor: switch to oci charts318a73f
(passport) - passport: add change user confirm79ef100
(passport) - passport: add re login at authorize6927bb5
(passport) - passport: add affinity3146a09
(passport) - passport: add google reCAPTCHA802abcd
(passport) - passport: add replica database supporta0dcd1b
(passport) - passport: switch wsgi to asgi4c9dbba
(passport) - passport: switch charts to oci74825f7
(rabbitmq) - rabbitmq: add rabbitmq managentment ingress12cf7d6
(rabbitmq) - rabbitmq: add affinity103417d
(rabbitmq) - rabbitmq: switch charts to oci5d428bb
(redis) - redis: add affinitya88c1a9
(redis) - redis: switch charts to oci541585d
(registry) - registry: add affinitye9ca9d4
(registry) - registry: add garbage-collect cronjobec62a59
(registry) - registry: switch charts to ocifde0b07
(registry-proxy) - registry-proxy: switch charts to ocibe14eb4
(storage) - minio: add affinity51af696
(storage) - storage: add k8s csi support76a75d9
(storage) - storage: add cluster health checkera17dc8c
(storage) - storage: switch charts to ocie4f44fb
(builder) - builder: no error returne38dfc7
(builder) - builderControllerHost/ControllerPort init errorff9069f
(controller) - controller: influxdb query errorf7f5069
(controller) - controller: authentication 5007e297a8
(controller) - controller: add check remote user status9db28e1
(controller) - controller: celery MaxRetriesExceededError4bcff08
(controller) - controller: wrong named69fde2
(controller) - controller: traefik ingress create errora3ad743
(controller) - fixup(controller: user login error662c8dd
(controller) - controller: change influxdb port957bdf6
(controller) - controller: validate rsa key pairing before storage419ec4c
(controller) - controller: kubernetes pod/exec cluster rolea67edaa
(controller) - controller: Cannot routing:disablee09e214
(controller) - controller: allowlist cannot remove318b126
(controller) - controller: domains update error92855eb
(database) - database: premission deniedbde945a
(database) - fixup(postgres: support arm, fix Failed to build psutil7854d45
(database) - fixup(postgres: user name converted to lowercase letters57b2a07
(fluentd) - fluentd: ifconfig_path not found20e72b9
(imagebuilder) - imagebuilder: upgrade pack version651db8a
(imagebuilder) - imagebuilder: chown uid gid orderd2e9164
(influxdb) - influxdb: proxy not running3a1d361
(monitor) - monitor: charts namingd754ae0
(monitor) - monitor: telegraf init error63f9e34
(monitor) - monitor: affinity error95ae1e5
(passport) - passport: yarn build fail3f5365e
(passport) - passport: wrong name907f17b
(passport) - passport: change uid gid to 1001e3911e0
(passport) - passport: ‘registration_done’ not found2ace5f0
(passport) - passport: ui styleb3ba1e1
(passport) - passport privacy policy link172e9c8
(passport) - passport: check databaseReplicaUrl errora3aeb70
(rabbitmq) - passport: change uid gid to 10015c73dcf
(redis) - reids: DRYCC_REGISTY misspellingd7e3baf
(redis) - redis: env misscadaa91
(registry) - registry: set gid uid to 1001d524217
(registry) - registry: storage run error854f912
(registry) - registry: chown uid gid ordere642bb7
(registry-proxy) - registry-proxy: containerPort error8dfd029
(registry-proxy) - registry-proxy: chown uid gid orderbbea364
(storage) - minio: premission denied97deba1
(storage) - storage: node unimplemented errorb9bdeff
(storage) - storage: pd can not connect each other1edb10c
(controller) - controller: database convention over configuration1960cc3
(database) - database: database name convention over configuration06d1f5d
(imagebuilder) - imagebuilder: URL to Urlb8a8941
(passport) - passport: database convention over configuration8e9a199
(builder) - builder: upgrade controller-sdk-go4840151
(builder) - builder: use exec runner replace docker runner68ccfb1
(builder) - builder: canonical charts naming8f971cb
(builder) - builder: provide any additional service annotationsfe2c55d
(builder) - dockerfile: use drycc/base image2b5e706
(builder) - dockerfile: change user and workdir7a6c8d3
(builder) - builder: set gid uid to 1001fe494f7
(builder) - dockerfile: use uid gida7c8752
(builder) - builder: change nodes to pod affinityeb2e94c
(builder) - database: bump mc 2022.04.01.23.44.48cfaae66
(builder) - builder: use registry.drycc.cc replace docker.iod7d2890
(builder) - builder: change default imagebuilder registryecfdb19
(builder) - imagebuilder: change python-dev registry6da17f4
(builder) - builder: https://github.com/minio/minio/issues/143311a57e5b
(builder) - builder: https://github.com/minio/minio/issues/14331f1464fa
(builder) - builder: https://github.com/minio/minio/issues/13799b1e1c4f
(builder) - builder: use env replace creds volume71a4145
(builder) - builder: bump go.mod3567688
(builder) - builder: fine management affinity73ea38b
(builder) - builder: change storage to minio1f91321
(builder) - builder: use testify replace assertd148b9c
(builder) - builder: add check storage healthb768101
(builder) - builder: change initContainers1b3bec3
(builder) - builder: add replicas5cb0d61
(builder) - builder: upgrade to latest controller-sdk-go98b9d58
(builder) - builder: upgrade new require65817c3
(builder) - builder: change drycc.cc to www.drycc.cc4e3f9d0
(controller) - controller: add celery retry mechanismf6716fe
(controller) - controller: change cronjob nameeb60693
(controller) - controller: refine celery task priority66905e9
(controller) - controller: change manager authea20c41
(controller) - controller: remove start/stop api4c8fc80
(controller) - controller: improve tasks error handlingcf7402e
(controller) - controller: add blocklist api80f14dd
(controller) - controller: use get_user_model replace auth.Userffc7bb7
(controller) - controller: use JSONField replace ArrayField370df8c
(controller) - controller: add validate metric29084ce
(controller) - controller: use user id request manager api718fe12
(controller) - controller change urlpatterns order71f4042
(controller) - controller: measurements uses lowercase letterse5123ea
(controller) - controller: change resource unit to number18fee9a
(controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfsffca6c1
(controller) - controller: use exec runner replace docker runner9ec12e1
(controller) - controller: simplify drone configuration4b4749e
(controller) - controller: set default CSRF_COOKIE_SECURE false2ef6338
(controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfsc7570d0
(controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs8b17bc1
(controller) - controller: canonical charts namingc928fb0
(controller) - controller: use rabbitmq clusterf917185
(controller) - controller: provide any additional service annotations22a8f63
(controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs3cc3b00
(controller) - dockerfile: use drycc/base imageee274f6
(controller) - controller: set venv profilece6b069
(controller) - controller: set gid uid to 10013a105d3
(controller) - dockerfile: use uid gid15f9b0e
(controller) - controller: code review01e6fd9
(controller) - controller: use passport user id893ee31
(controller) - oauth2: update user info pipline3028fb4
(controller) - user: set AnonymousUser username5daf82d
(controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss61f2c53
(controller) - controller: change nodes to pod affinity88feb1d
(controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14914e03f
(controller) - controller: use registry.drycc.cc replace docker.ioa5bb548
(controller) - controller: change python-dev registry3ecdd7c
(controller) - controller: add a separate rabbitmqUrl configuration967cb11
(controller) - controller: remove APP_STORAGE473d2b5
(controller) - controller: use env replace creds volumee410d4c
(controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfsc6ef777
(controller) - controller: simplified passport config0fd3233
(controller) - controller: remove settings hardcodea64e99c
(controller) - controller: change passport config62aba25
(controller) - controller: set cronjob timezone to utc760b70b
(controller) - controller: change default ratio8dffc3a
(controller) - controller: fine management affinity26043c4
(controller) - controller: change default app storage608bd8d
(controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs18ed0c2
(controller) - controller: remove conjob affinityadd6712
(controller) - controller: add volume expand support use patchcc1ad13
(controller) - controller: add startupProbe0e9a603
(controller) - controller: add clearsocial cronjobeb6f05d
(controller) - controller: change initContainers762c676
(controller) - controller: change replicasabd7e8c
(controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs07fdf1b
(controller) - controller: remove database conn_max_ageef8e41f
(controller) - controller: add database replica check79143f2
(controller) - controller: upgrade new requirea624048
(controller) - controller: add app.refresh func annotationb22d367
(controller) - controller: optimize app refresh timingfe98f0c
(database) - database: use exec runner replace docker runner5e00c11
(database) - database: canonical charts namingd2cb860
(database) - database: disable huge_pages197d80d
(database) - database: add persistence1c3e645
(database) - database: provide any additional service annotations37730ab
(database) - dockerfile: use drycc/base image5014112
(database) - dockerfile: change entrypoint29b538e
(database) - database: change nodes to pod affinityc2bb074
(database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48077a4e9
(database) - database: use registry.drycc.cc replace docker.io560bdb9
(database) - database: change python-dev registry1e54b55
(database) - database: https://github.com/minio/minio/issues/14331d646672
(database) - database: https://github.com/minio/minio/issues/13799a6ac4e3
(database) - database: use env replace creds volume9618d87
(database) - database: fine management affinityb823273
(database) - database: change minio to storage7bd5a90
(database) - database: add check storage health20c6d96
(database) - database: fix storage run error8bde830
(database) - database: upgrade to pg 14.5a33b5e5
(fluentd) - fluentd: update pluginseed7a78
(fluentd) - fluentd: update filter kubernetes settingcc83dd8
(fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logsba2feb2
(fluentd) - fluentd: use exec runner replace docker runnerd528676
(fluentd) - fluentd: simplify drone configurationdece82d
(fluentd) - fluentd: canonical charts naming4e0a802
(fluentd) - fluend: replace nsqd with redis15ceca0
(fluentd) - dockerfile: use drycc/base imagea7f619f
(fluentd) - dockerfile: change workdir9adf5ed
(fluentd) - database: bump fluentd 1.14.650c14c2
(fluentd) - fluentd: use registry.drycc.cc replace docker.io83171b1
(fluentd) - fluentd: change python-dev registryec83581
(fluentd) - fluentd: unified reids declaration07c63e2
(fluentd) - fluentd: upgrade fluentd 1.15.265df9be
(imagebuilder) - imagebuilder: update pack version66cab35
(imagebuilder) - imagebuilder: use dind replace go-dev0c82060
(imagebuilder) - imagebuilder: use exec runner replace docker runner8146da9
(imagebuilder) - imagebuilder: canonical charts naming7d97241
(imagebuilder) - dockerfile: use drycc/base image07e805c
(imagebuilder) - imagebuilder: change default buildpack8d1038d
(imagebuilder) - imagebuilder: upgrade podman to 4.0.162d3687
(imagebuilder) - imagebuilder: change workdir to /workspaceda8bfb0
(imagebuilder) - imagebuilder: change uid gid to 1001d44e3bc
(imagebuilder) - imagebuilder: upgrade stack5b0c7e6
(imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.iof74cbf6
(imagebuilder) - imagebuilder: add defaultBuildpacksURL941d493
(imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331449be91
(imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/1379963b0523
(imagebuilder) - imagebuilder: use env replace creds volume4e8a6e5
(imagebuilder) - imagebuilder: add imagebuilder config2d891f5
(imagebuilder) - imagebuilder: change minio to storageaddceda
(imagebuilder) - imagebuilder: upgrade new requirea6e569f
(imagebuilder) - imagebuilder: pack_build add –env-file parameter6191ff5
(influxdb) - influxdb: use exec runner replace docker runnerdc3f8c7
(influxdb) - influxdb: canonical charts naming6b5c819
(influxdb) - influxdb: new ingress style68b381d
(influxdb) - influxdb: provide any additional service annotationsea20eb8
(influxdb) - dockerfile: use drycc/base image64c0a71
(influxdb) - influxdb: set gid uid to 1001a709ca1
(influxdb) - influxdb: use DRYCC_UID DRYCC_GID env740dff0
(influxdb) - influxdb: use common affinity templatee035673
(influxdb) - influxdb: change nodes to pod affinityf1cefbd
(influxdb) - influxdb: use registry.drycc.cc replace docker.ioa00100e
(influxdb) - influxdb: fine management affinity9d165ef
(influxdb) - influxdb: add probebee7fff
(influxdb) - influxdb: upgrade to influxdb 2.4.0254914c
(logger) - logger: use exec runner replace docker runner8d91c68
(logger) - logger: canonical charts namingb6d2182
(logger) - logger: provide any additional service annotationsc35e59a
(logger) - dockerfile: use drycc/base imagea63c070
(logger) - logger: change workdir to /workspacea594b28
(logger) - logger: set gid uid to 10019a90e22
(logger) - dockerfile: use uid gid36493b4
(logger) - logger: use common affinity template897a3a5
(logger) - logger: change nodes to pod affinity03b32ab
(logger) - logger: use registry.drycc.cc replace docker.ioa50ba5f
(logger) - logger: change python-dev registry23187a3
(logger) - logger: unified reids declarationaaa129a
(logger) - logger: fine management affinitybe4f656
(logger) - logger: add replicas7c25459
(logger) - charts: add NetworkPolicy6810149
(logger) - logger: remove memory storagea918c50
(logger) - logger: add .vscode to .gitignorea415210
(logger) - logger: add log follow support59b1da3
(logger) - logger: upgrade new require27cc151
(monitor) - monitor: use exec runner replace docker runner07d6a9d
(monitor) - monitor: canonical charts naming1054357
(monitor) - monitor: use redis default porte3673df
(monitor) - monitor: remove nsqdfc9dd3e
(monitor) - monitor: new ingress style856a898
(monitor) - monitor: add default user env9857535
(monitor) - monitor: add random user38b5a04
(monitor) - grafana: oauth auto login5dfc579
(monitor) - monitor: upgrade versione121b5a
(monitor) - monitor: provide any additional service annotations84462a0
(monitor) - dockerfile: use drycc/base imageb9e8ce8
(monitor) - monitor: chore(imagebuilder): change uid gid to 100105ee8ab
(monitor) - dockerfile: use uid gide1fa68e
(monitor) - monitor: use common affinity templateb8f302b
(monitor) - monitor: change nodes to pod affinity4fc991f
(monitor) - database: bump telegraf 1.22.0 and grafana 8.4.521a2f6a
(monitor) - monitor: use registry.drycc.cc replace docker.ioacc976f
(monitor) - monitor: change python-dev registry62d76c1
(monitor) - monitor: unified reids declarationb3c57ad
(monitor) - monitor: optimize oauth2 configuration70af6b0
(monitor) - monitor: change passport config69f9a88
(monitor) - monitor: fine management affinity2fb278f
(monitor) - monitor: rename influxdb port17548ff
(monitor) - grafana: update dashborad69d7bbd
(monitor) - grafana: influx dashborad disk size75db1b0
(monitor) - monitor: upgrade new grafana/telegraf80504a1
(monitor) - grafana: update influx and redis dashboardf7078cb
(monitor) - monitor:chown use env91ae0dd
(passport) - passport: optimize login display2d3bbbc
(passport) - passport: change drycc logo59790a7
(passport) - passport: make user email uniquefaea034
(passport) - passport: use strtobool1fbf2bc
(passport) - passport: use yarn replace npm119cac8
(passport) - passport: use exec runner replace docker runnercff5062
(passport) - passport: set default CSRF_COOKIE_SECURE false9cc0210
(passport) - passport: canonical charts naming9ab3896
(passport) - passport: new ingress style259ccc9
(passport) - passport: provide any additional service annotationsaf1bbcd
(passport) - dockerfile: use drycc/base image9ae5373
(passport) - passport: set venv profile8f61090
(passport) - dockerfile: use uid gidfcaf72d
(passport) - passport: upgrade npm package546dcd5
(passport) - passport: add license4bda2d6
(passport) - passport: use minify73b0fd1
(passport) - passport: use common affinity template278fe7a
(passport) - passport: change nodes to pod affinity3cd93d3
(passport) - passport: add reactive370b493
(passport) - passport: add footer483cbd6
(passport) - passport: use h_captcha replace re_captcha3d1675e
(passport) - database: bump python 3.10.4 and node 16.14.286a7835
(passport) - passport: use registry.drycc.cc replace docker.io2d65355
(passport) - passport: change python-dev registry90c1444
(passport) - passport: unified reids declaration2e0e417
(passport) - passport: fix firefox footerad274be
(passport) - passport: use bulecssf986d8b
(passport) - passport: add main footer3e52867
(passport) - passport: dynamic settings for vue38adabc
(passport) - passport: change passport configf8d6b60
(passport) - passport: fine management affinity2cbd79d
(passport) - passport: remove database conn_max_age7122797
(passport) - passport: change drycc.cc to www.drycc.cc8cc84cd
(rabbitmq) - rabbitmq: use exec runner replace docker runnerf35930f
(rabbitmq) - rabbitmq: add rabbitmq cluster supportfbfa3ba
(rabbitmq) - rabbitmq: canonical charts namingca60701
(rabbitmq) - rabbitmq: use volumeClaimTemplatesfe5d1b4
(rabbitmq) - rabbitmq: add sharding support9c4ab97
(rabbitmq) - rabbitmq: provide any additional service annotations348a88a
(rabbitmq) - dockerfile: use drycc/base image2388be1
(rabbitmq) - rabbitmq: upgrade erlang to 24.2.2db2eaa5
(rabbitmq) - dockerfile: use uid gid772afd1
(rabbitmq) - rabbitmq: change to wait pid file2bfc25e
(rabbitmq) - rabbitmq: use common affinity template11d505e
(rabbitmq) - rabbitmq: change nodes to pod affinity69d63f1
(rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.148380299
(rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.iob3f69f1
(rabbitmq) - rabbitmq: add check rabbitmqLocaltion5327c76
(rabbitmq) - rabbitmq: fine management affinity5c66b5a
(rabbitmq) - rabbitmq: change probe27bebf9
(rabbitmq) - rabbitmq: add start-rabbitmq script86ee6a7
(rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.71f29683
(redis) - redis: use exec runner replace docker runnera5041fc
(redis) - redis: canonical charts naming64468c2
(redis) - redis: add redis persistencede5d753
(redis) - redis: provide any additional service annotationsf644639
(redis) - dockerfile: use drycc/base image98051d2
(redis) - redis: premission deniedbcb548e
(redis) - dockerfile: use uid gid524aa41
(redis) - redis: use common affinity template26c9466
(redis) - redis: change nodes to pod affinityb67d7a2
(redis) - redis: use registry.drycc.cc replace docker.io839ec50
(redis) - redis: use env replace creds volume237ca86
(redis) - redis: fine management affinitybdd968d
(redis) - redis: upgrade neew require8b2910f
(registry) - registry: use exec runner replace docker runnereedbe78
(registry) - registry: canonical charts naming0241615
(registry) - registry: provide any additional service annotations9b58da4
(registry) - dockerfile: use drycc/base imageab6acb7
(registry) - registry: change workdir to /workspacef368bf7
(registry) - registry: use DRYCC_UID DRYCC_GID envf4b9041
(registry) - registry: use common affinity templatec2e87ca
(registry) - registry: change nodes to pod affinityfeb6aba
(registry) - database: bump mc 2022.04.01.23.44.48956932b
(registry) - rregistry: use registry.drycc.cc replace docker.iodeda8d8
(registry) - registry: move registry-secret.yaml from workflow to registryf52c7bf
(registry) - registry: change python-dev registry007fe03
(registry) - registry: https://github.com/minio/minio/issues/14331d620c6d
(registry) - registry: https://github.com/minio/minio/issues/1379985e6b73
(registry) - registry: use env replace creds volume6a1155d
(registry) - registry: fine management affinity7b8ebae
(registry) - registry: change minio to storage1338951
(registry) - registry: add check storage health2fa769d
(registry) - registry: change probef187cbf
(registry) - registry: add replicas09d8a7b
(registry) - registry: upgrade to mc 2022.08.28.20.08.114b187b8
(registry-proxy) - registry-proxy: use exec runner replace docker runner29ffbbe
(registry-proxy) - registry-proxy: canonical charts naming6d783ba
(registry-proxy) - registry-proxy: remove use_cni8cf05cf
(registry-proxy) - dockerfile: use drycc/base image090e286
(registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 10017cf6120
(registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env3a00697
(registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io30e69e8
(registry-proxy) - registry-proxy: add registry basic auth proxy942abce
(registry-proxy) - registry-proxy: upgrade to nginx 1.23.15ea3297
(storage) - minio: use exec runner replace docker runner8306add
(storage) - minio: canonical charts namingc917e9f
(storage) - minio: provide any additional service annotations042c732
(storage) - dockerfile: use drycc/base image7b47b82
(storage) - minio: change workdir to /workspace6f3531e
(storage) - minio: use DRYCC_UID DRYCC_GID env9795fb1
(storage) - minio: use common affinity templatea7b09c5
(storage) - minio: change nodes to pod affinity7607342
(storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39ea2b2f1
(storage) - minio: use registry.drycc.cc replace docker.io445b501
(storage) - minio: https://github.com/minio/minio/issues/14331f19fbc7
(storage) - minio: use env replace creds volume8982e2e
(storage) - minio: use minio to distributed06bec73
(storage) - minio: fine management affinity9b8f006
(storage) - storage: remove assert59d64b9
(storage) - storage: change listen to POD_IP60044ee
(storage) - storage: add juicefs mount options189f944
(storage) - storage: remove volumeName302fe89
(storage) - storage: mv to minio dir6ec586d
(storage) - storage: change readinessProbee andlivenessProbe0e028df
(storage) - storage: add minio pdbcf9bd2d
(storage) - storage: add check storage health svc2dd5c9f
(storage) - storage: add volumeBindingModefa2effc
(storage) - storage: remove databaseBucketd166cc7
(storage) - charts: format network-policy named06bcce
(storage) - storage: upgrade to golang 1.19c2ca05c
(storage) - storage: upgrade new requireThese release notes for Drycc Workflow v1.5.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary.
+0f5f8e4
(builder) - builder: multi-platform supportf269d06
(builder) - build: add buildx supportjkjkk:q5e72fe8
(builder) - registry: use docker build25d8a4c
(builder) - docker: dealing with the change of docker in kubenetes 1.207a3e1c5
(builder) - charts: set the default chart version46b75ff
(builder) - builder: add cloud native buildpacks support2db2054
(builder) - builder: unified build model4b7f9d9
(builder) - builder: add initContainersb78c936
(controller) - token: add get token apibac52a5
(controller) - tasks: use celery replace nsqdb9b0c58
(controller) - build: add buildx support205dcb3
(controller) - influxdb: add influxdb clientff15849
(controller) - influxdb: upgrade to influxdb 2.x4016244
(controller) - controller: push data to influxfcfce2e
(controller) - workflow-manager: add workflow-manager support00e9bfb
(controller) - influxdb: review influxdb codedd644d5
(controller) - docker: dealing with the change of docker in kubenetes 1.20118278b
(controller) - charts: set the default chart version122a9cd
(controller) - oauth2: add oauth2 support559a5b6
(controller) - controller: use cncf buildpacks replace slugrunner96130e6
(controller) - charts: database configuration optimization of passport and controller2ea8508
(controller) - oauth: using passport authentication868c437
(database) - database: multi-platform supporteadd5da
(database) - build: add buildx supportb6eea4c
(database) - docker: dealing with the change of docker in kubenetes 1.2004a88db
(database) - charts: set the default chart version92ed309
(database) - database: add initContaineree6b78f
(fluentd) - build: add buildx supportf523e30
(fluentd) - docker: dealing with the change of docker in kubenetes 1.20ee47b53
(fluentd) - charts: set the default chart version80a51af
(influxdb) - influxdb: modify influxdb naming rulesfb10030
(influxdb) - influxdb: use influxdb v20e87ad8
(influxdb) - docker: dealing with the change of docker in kubenetes 1.209d10801
(influxdb) - charts: set the default chart versiond825c9f
(logger) - build: add buildx supportb139576
(logger) - docker: dealing with the change of docker in kubenetes 1.2088f84ea
(logger) - charts: set the default chart version5ccae3e
(logger) - dockerfile: remove chmod cmd193aefc
(logger) - logger: add initContainersbaee330
(minio) - minio: multi-platform supportad5d055
(minio) - build: add buildx support19868d4
(minio) - docker: dealing with the change of docker in kubenetes 1.204bd84b8
(minio) - charts: set the default chart version79d1f2f
(monitor) - database: multi-platform support88e5a7f
(monitor) - build: add buildx support5672e99
(monitor) - influxdb: modify influxdb naming rules8672103
(monitor) - influxdb: use influxdb v266cb4c8
(monitor) - docker: dealing with the change of docker in kubenetes 1.209576eb3
(monitor) - charts: set the default chart version30809c9
(monitor) - monitor: add initContainers70d140c
(nsqd) - nsqd: using self compiled nsq binary1073d4f
(nsqd) - nsqd: use GOPATH replace /goe498480
(nsqd) - build: add buildx supportcf9b7d5
(nsqd) - docker: dealing with the change of docker in kubenetes 1.20c335856
(nsqd) - charts: set the default chart versionefba713
(redis) - build: add buildx supportc7a3b53
(redis) - docker: dealing with the change of docker in kubenetes 1.204cdad7b
(redis) - charts: set the default chart version652b443
(registry) - registry: multi-platform support4060176
(registry) - registry: use docker build7102a03
(registry) - docker: dealing with the change of docker in kubenetes 1.206c8600d
(registry) - charts: set the default chart version33a51c9
(registry) - registry: add initContainersbef70dc
(registry-proxy) - build: add buildx supportd2319c1
(registry-proxy) - docker: dealing with the change of docker in kubenetes 1.2002fafed
(registry-proxy) - charts: set the default chart version5499c9a
(controller) - gunicorn: gunicorn not running06e9e88
(controller) - controller: error loading shared library01b5bd0
(controller) - controller: upgrade celery config6e32d55
(controller) - controller: fix update resources bug0e0d53f
(controller) - chart: set the domain depends certManagerEnabled2ac4ca8
(controller) - passport: error loading shared library libexpat.so.1a0dd517
(fluentd) - fluentd: drone build6eca2a3
(logger) - logger: golang lint63b0aa0
(registry) - drone: charts url error472cfcc
(controller) - controller organize README.md documentd9d6e29
(redis) - redis: delete links that do not exist1468f57
(controller) - controller: add command unittest9999bfd
(builder) - builder:replace the special wordscda8b58
(builder) - builder: remove docker keyword from chartsdc575dd
(builder) - builder: use imagebuilder replace dockerbuilderd3bb183
(builder) - docker: use the full name of registry5fe34d1
(builder) - travis: add DEV_REGISTRY7e36453
(builder) - CICD: use drone52b8d9d
(builder) - drone: add image_registries volumes65963f4
(builder) - k8s: add privileged to dindd345fcf
(builder) - LICENSE: revert modifications to Apache license7975c99
(builder) - drone: always pull image59633dd
(builder) - builder: modify launch imagebuild pod8d14e67
(builder) - builder: use Procfile in anywhere5357fa8
(builder) - go: bump go mod8d26ac0
(builder) - k8s: k8s deprecated api migration0af620d
(builder) - chars: change org to imageTagae84303
(builder) - builder: run imagebuider replace pod with job3b2c496
(builder) - builder: change docs website5679a4c
(builder) - builder: upgrade to golang1.17a214503
(controller) - controller:replace whitelist with allowlist375ddcc
(controller) - ps:drycc ps:list show autoscale numc32e409
(controller) - ldap: canot register when ldap is enabledc46580a
(controller) - controller:modify redis configfa9e87b
(controller) - chart:modify controller charts6f9fd08
(controller) - nsq: remove nsq994b2dc
(controller) - docker-buildx: add check-dockera720c3a
(controller) - controller: remove docker keyword from chartse9a5c84
(controller) - docker: use the full name of registrya26614a
(controller) - controller: add rabbitmq env3df229d
(controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC257e94b
(controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjobf4d6ec3
(controller) - chart: pretty chart format63e6195
(controller) - influxdb: modify influxdb code0f6d408
(controller) - CICD: use drone87bad28
(controller) - python: upgrade to python3.9e8f7560
(controller) - volumes: modify mount summary6cf6c6b
(controller) - drone: add image_registries volumesa9397e8
(controller) - oauth: modify token Authenticationc7f8c8b
(controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfsa1a08aa
(controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfsefd78b4
(controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs649b044
(controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs41b742b
(controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs22ffe5d
(controller) - LICENSE: revert modifications to Apache licensec98b468
(controller) - drone: always pull image20e6edb
(controller) - chart: modify the problem of using buildpackdb16879
(controller) - controller: pretty pods list printba6f456
(controller) - test: pretty pods list print5fce4b7
(controller) - k8s: k8s deprecated api migratione9e0bcb
(controller) - oauth: using passport authentication0311172
(controller) - chars: change org to imageTag150eff1
(controller) - charts: update cert-manager api versionde8545a
(controller) - controller: update requirements1442207
(controller) - controller: using django native JSONFiledab4e836
(controller) - oauth: modify passport api5c54e06
(controller) - controller: eliminate pip warnings870328d
(controller) - controller: remove entrypoint5e5e6ae
(controller) - controller: upgrade celery config607778f
(controller) - controller: add initContainer23dc016
(controller) - chart: set the domain depends certManagerEnabledf3cf20b
(controller) - controller: remove default bash env73f2636
(controller) - controller: modify alpinelinux repositories498e9f2
(controller) - chart: change certManagerEnabled to boolean type27f5308
(controller) - passport: exclude cryptography370b75d
(controller) - controller: use sh env07585b4
(database) - postgres:replace the special words20172dc
(database) - database: remove docker keyword from chartsabb9b88
(database) - docker: use the full name of registrye72f58f
(database) - chart: modify the off-cluster databasea91f64f
(database) - travis: add DEV_REGISTRY614fb76
(database) - tests: use add-host replace linka3428f3
(database) - CICD: use drone239fef1
(database) - drone: add image_registries volumes42858e1
(database) - LICENSE: revert modifications to Apache licensed0fe850
(database) - drone: always pull image34a36ad
(database) - charts: Nn secret is generated during off-cluster064ccf4
(database) - database: create database9228992
(database) - chars: change org to imageTag9f7810c
(database) - database: upgrade to wal-g v1.105783f4
(fluentd) - fluentd:replace the special words0739809
(fluentd) - influxdb:replace monitor-influx with influxf02487c
(fluentd) - fluentd: remove docker keyword from charts2c96cc0
(fluentd) - docker: use the full name of registryb20c429
(fluentd) - charts: remove port config6dd0197
(fluentd) - travis: add DEV_REGISTRYc5bec51
(fluentd) - CICD: use dronef8524b7
(fluentd) - drone: add image_registries volumesa50878a
(fluentd) - LICENSE: revert modifications to Apache license14fe20e
(fluentd) - drone: always pull image4a2f660
(fluentd) - k8s: k8s deprecated api migrationde2dd91
(fluentd) - chars: change org to imageTaga9f1944
(fluentd) - fluentd: upgrade to fluentd1.147cb4e95
(influxdb) - influxdb: change username to user0fdc21b
(influxdb) - influxdb: remove docker keyword from chartsb2acddb
(influxdb) - influxdb: change default pathba88919
(influxdb) - influxdb: add check_env function9117401
(influxdb) - influxdb: modify init_influxdb has_bucket092a3e6
(influxdb) - chart: pod not readiness51de380
(influxdb) - travis: add DEV_REGISTRY66d7667
(influxdb) - docker: replace influxdb base image3aa3094
(influxdb) - CICD: use drone14b9c24
(influxdb) - drone: add image_registries volumes02b4cd1
(logger) - logger:replace the special words114b5d5
(logger) - reids: delete the logger prefix of redis639278a
(logger) - redis: remove logger from redis conf90195e2
(logger) - go: remove GOOS and GOARCH31e2e27
(logger) - logger: remove docker keyword from charts8fbd9fa
(logger) - docker: use the full name of registryb39df2d
(logger) - charts: remove redis\nsqd port config35d6d07
(logger) - travis: add DEV_REGISTRY69aabf5
(logger) - tests: remove docker linke916644
(logger) - CICD: use droned6872b7
(logger) - drone: add image_registries volumes37801da
(logger) - LICENSE: revert modifications to Apache licensecfb4b38
(logger) - drone: always pull image8bda3bf
(logger) - go: bump go mode13ebfc
(logger) - chars: change org to imageTag38e6d8d
(minio) - minio:replace the special wordsd6925dd
(minio) - minio: remove docker keyword from chartsd56bc39
(minio) - docker: use the full name of registrye4696cc
(minio) - travis: add DEV_REGISTRY70c5c79
(minio) - minio: use latest version773cf6c
(minio) - Makefile: remove DEV_REGISTRY ?=5ce5bc6
(minio) - CICD: use drone5da8be3
(minio) - drone: add image_registries volumesc1f0611
(minio) - LICENSE: revert modifications to Apache licenseb73f792
(minio) - drone: always pull image79d1c93
(minio) - go: bump go modc448899
(minio) - chars: change org to imageTag15ee49e
(minio) - minio: migrate deprecated warning9968a1a
(minio) - minio: upgrade to golang1.714fedd2
(monitor) - monitor:replace the special works52c431a
(monitor) - reids: delete the logger prefix of redis2c95b47
(monitor) - redis: remove logger from redis confda9bc56
(monitor) - monitor:remove influxdb53f47b9
(monitor) - grafana: use grafana docker image5bdb188
(monitor) - grafana: use grafana docker imagec0586dd
(monitor) - monitor: remove docker keyword from charts87d02b6
(monitor) - charts: add nodes and persistentvolumes rule1b5598f
(monitor) - monitor: modify grafana dashboard with FLUX and pretty config.tomlbcbc0d5
(monitor) - docker: use the full name of registry9418c9e
(monitor) - monitor: fix upload dashboard error and modify INFLUXDB input589f29a
(monitor) - travis: add DEV_REGISTRYf776f8a
(monitor) - CICD: use drone6ca3060
(monitor) - drone: add image_registries volumes6a9ffb2
(monitor) - LICENSE: revert modifications to Apache license45e41ed
(monitor) - drone: always pull image654d407
(monitor) - k8s: k8s deprecated api migration41e9b9c
(monitor) - chars: change org to imageTag99c10d3
(monitor) - charts: update cert-manager api version9bf83c4
(monitor) - oauth: user oauth passporta128f6d
(monitor) - chart: change certManagerEnabled to boolean type8f897fe
(monitor) - chart: set the domain depends certManagerEnabledba6d793
(nsqd) - README:update travis build status49879c4
(nsqd) - nsqd: minimum git clone codec5e2680
(nsqd) - nsqd: remove docker keyword from charts21dd17b
(nsqd) - docker: use the full name of registry7d86b3c
(nsqd) - charts: remove port configc073d95
(nsqd) - travis: add DEV_REGISTRY55c297c
(nsqd) - CICD: use drone165c2ae
(nsqd) - drone: add image_registries volumes9c6a1f8
(nsqd) - LICENSE: revert modifications to Apache license9283098
(nsqd) - drone: always pull image46acf8a
(nsqd) - k8s: k8s deprecated api migration43caf80
(nsqd) - chars: change org to imageTag6897471
(nsqd) - nsqd: use official image297bc05
(redis) - redis:replace the special wordsf5f8b5e
(redis) - reids: delete the logger prefix of redisaf7b657
(redis) - redis: change logger-redis to redis8dca154
(redis) - redis: remove logger from redis confeaeda2d
(redis) - redis: remove docker keyword from charts53c6358
(redis) - docker: use the full name of registryae37416
(redis) - charts: remove port confige985656
(redis) - travis: add DEV_REGISTRY423336a
(redis) - CICD: use dronebe64ab4
(redis) - drone: add image_registries volumes3bec735
(redis) - LICENSE: revert modifications to Apache license4f934f6
(redis) - drone: always pull image359b878
(redis) - chars: change org to imageTag83b8ac2
(registry) - workflow:replace the special words869b280
(registry) - registry: remove docker keyword from charts999c1e9
(registry) - docker: use the full name of registry5652da9
(registry) - travis: add DEV_REGISTRYcc8c6c2
(registry) - CICD: use dronec7bdbd0
(registry) - CICD: pretty .drone.yaml format5c55a38
(registry) - test: use add-host replace linkf8866f3
(registry) - drone: add image_registries volumes6c8292f
(registry) - LICENSE: revert modifications to Apache license1d50f2c
(registry) - drone: always pull imageefbca6d
(registry) - chars: change org to imageTag2eafc59
(registry-proxy) - registry-proxy: update nginx071bd86
(registry-proxy) - charts: upgrade k8s newer API versionsc72db96
(registry-proxy) - registry-proxy: change travis icon url63ffb92
(registry-proxy) - registry-proxy:replace the special works1d904a6
(registry-proxy) - registry-proxy: remove docker keyword from chartsc8200b1
(registry-proxy) - docker: use the full name of registryd3fa939
(registry-proxy) - travis: add DEV_REGISTRY5a8b353
(registry-proxy) - CICD: use drone703d05a
(registry-proxy) - drone: add image_registries volumesaa71db1
(registry-proxy) - LICENSE: revert modifications to Apache license710c126
(registry-proxy) - drone: always pull image2dcc5e6
(registry-proxy) - chars: change org to imageTagThese release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary.
+fc7d93f
(builder) - builder: use go-dev0c2159e
(builder) - builder: fmt code and add create_bucket script1b88340
(controller) - controller: remove deprecated apia92fdeb
(controller) - routable: ingress support routable1e3eab3
(controller) - maintenance: add maintenance support for ingress56b9dd0
(controller) - crt: support containerd-ctr5fc3b46
(controller) - controller: add ephemeral-storage restrictiond677e52
(controller) - controller: add a volume command5f1323a
(controller) - controller:drycc run cmd add –mount para74c36a5
(controller) - tasks: add distributed async task139c3ca
(controller) - tasks: change nsq reader to asyncf237d74
(controller) - controller:add drycc resource cmd41b46d0
(controller) - controller:add drycc resource cmd improvementc26f7d8
(controller) - controller: add LimitRanges support45b5d1b
(controller) - users: add users status api4e16f9b
(controller) - ps:add ps:stop/start commandc659fa9
(controller) - k8s: add k8s cluster domain31a625d
(controller) - ps:add ps:stop/start command00a779a
(fluentd) - fluentd: support containerd log formatf3f1bd4
(fluentd) - nsqd: add stateless nsqd cluster supportdb7147c
(fluentd) - mirrors: delete aliyun mirrors689c12e
(logger) - nsqd: add stateless nsqd cluster support78ccc5d
(logger) - redis: add redis client cluster support9843f2c
(logger) - k8s: add k8s cluster domain6ba122e
(minio) - minio: add pvc support6973550
(monitor) - monitor: add ingress for monitorcd73305
(monitor) - charts: add volumeName support4769fe9
(monitor) - nsqd: add stateless nsqd cluster support87806df
(monitor) - k8s: add k8s cluster domain4db40c4
(nsqd) - nsqd: add stateless nsqd cluster supportb6f3d4f
(nsqd) - nsqd: add stateless nsqd cluster support74b85bb
(redis) - redis: change redis to statefulsetff98b50
(slugbuilder) - slugbuilder: delete build hookb201c2f
(slugbuilder) - buildpacks: use drycc buildpacks0ec042d
(builder) - test: fix test case error4fb113b
(builder) - build: base image replace by alpine443df48
(builder) - minio: fix not bucket error3dab5b0
(builder) - minio: create bucket error734fca6
(controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scalinga7dcd10
(controller) - controller: test pass93f0f2e
(controller) - controller: fix migrations error4724375
(controller) - controller: fix test error7bacf29
(controller) - charts: fix clusterrole90957f7
(controller) - pod: sort events error440b13e
(controller) - controller: review table structure0a470a6
(controller) - controller: bump tornado 5.1.1e39218b
(controller) - pynsq: no current event loop in thread1d8630e
(controller) - tests: fix test_task.py run error1ff1202
(controller) - controller: fix test cased8c0da3
(controller) - settings: fix env name6d8fd36
(database) - 003_restore_from_backup.sh: ignore script exit 1e0394a9
(database) - minio: fix not bucket errorf35f252
(database) - mc: fix create_bucket error74d6886
(database) - postgres: recovery mode not rune50d0c1
(dockerbuilder) - caddy: fix caddy not startf3bec7a
(fluentd) - influxdb: fix influxdb host and portbc19f27
(fluentd) - charts: skipped value for daemon_environment: Not a table338d623
(logger) - logger: logger not run in alpine7788302
(minio) - minio: bump minio version619eed0
(minio) - fix: use go mod replace dep3b42122
(monitor) - monitor: fix host error67998ef
(monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api2cc361c
(registry) - registry: fix test case548297a
(registry) - minio: fix not bucket error5412ddb
(registry) - minio: create bucket errord0d629e
(slugbuilder) - slugbuilder:fix normalize_storage pathd76ecbe
(slugbuilder) - slugbuilder: use v3 apic505e18
(slugbuilder) - shellcheck: SC2039c893a17
(builder) - builder: fmt codebba5795
(controller) - controller: format coded36082b
(controller) - controller: fix pep866026f2
(controller) - resource: standardize the naming of resource03d7e2c
(controller) - servicecatalog: change servicecatalog to svcat49dbb6d
(controller) - controller: flake8 upgradecbfc108
(monitor) - monitor: format charts and dashboardee85954
(slugbuilder) - slugbuilder: use shellcheck3afed2e
(slugbuilder) - docker: simplify dockerfile36b7f68
(slugrunner) - docker: simplify dockerfile61bb0ef
(builder) - aws: upgrade aws sdk version0f2e074
(builder) - chore: use go mode replace depe9a2219
(builder) - builder: delete glide upbb8c518
(builder) - registry: del quay.iofa6d02f
(builder) - builder: upgrade go.sum9d61e8d
(builder) - build: upgrade go.modd763a98
(builder) - charts: upgrade k8s newer API versionsd1bc1aa
(builder) - pkg: upgrade to new drycc/pkg02b1e98
(builder) - builder: update go mod8e17d65
(builder) - builder: change alpine repositoriesf32b723
(builder) - mirrors: delete aliyun mirrorse33dc61
(builder) - minio: use bin mc replace docker images3ab4f1c
(builder) - builder: update controller-sdk-gob2adfac
(builder) - heroku: remove heroku-16 supportf429ac8
(builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes7197c83
(builder) - go.mod:upgrade require pkg controller-sdk-go5f3e22d
(controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs1db645a
(controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfsfbe8067
(controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs537d667
(controller) - registry: del quay.ioa23c65b
(controller) - deps: update all deps to the latest version546337e
(controller) - charts: upgrade k8s newer API versions06023f8
(controller) - workflow-manager: del workflow-managerbba5736
(controller) - controller: change cluster-issuer location6c43661
(controller) - Certificatechange cluster-issuer location39a4728
(controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml9e96d3f
(controller) - Certificate:upgrade version cert-manager.io/v1alpha28e68049
(controller) - docker: use INDEX_URL replace index.docker.io8fda205
(controller) - cert_manager: change cert_manager_enabled to global6fefb6d
(controller) - charts: change platform_domain to global064b2ad
(controller) - maintenance: remove maintenance supportb8797c9
(controller) - workflow: remove namespace1b20d76
(controller) - quota: add kube quota configd780075
(controller) - pod: add pod default resources support3d72c08
(controller) - rename: rename ingress name0aa6ab9
(controller) - mirrors: delete aliyun mirrors7533a65
(controller) - heroku: remove heroku-16 supporte5a885d
(controller) - controller:check mount volume path9014e74
(controller) - test: optimization Dockerfile.test0b6ebb2
(controller) - tasks: change apply_async parameters835f009
(controller) - wsgi: add tornado 6 support67a4ad7
(controller) - utils: use threads replace asyncioa28949b
(controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUPa903209
(controller) - charts: add custom controller environment variables supporte0e783e
(controller) - ldap: change filter styled760825
(controller) - scheduler: remove debug loga25928e
(controller) - wsgi: remove a wsgi.py file7b2696e
(controller) - log: disable nsq.client info log8d5c07b
(controller) - charts: add default environment025f4a2
(controller) - controller: change quota nameebda60e
(controller) - controller: review pvc code8832ba9
(controller) - controller: change status\binding model type and mount path check container_types7148d04
(controller) - controller: add overcommit cpu and ram support4d2087c
(controller) - limits: modify limits unit verificationaf36970
(controller) - api: check cpu/memory range for api329355b
(controller) - volumes: modify the volume size9dfee09
(controller) - LimitRanges: modify the default limits5205bca
(controller) - controller: improve the details of certificate7ebecdf
(database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z6415e2c
(database) - postgres: upgrade to pg1312e6806
(database) - charts: upgrade k8s newer API versionsd294509
(database) - minio: use canary minio test1bad02e
(database) - mirrors: delete aliyun mirrorsd51420b
(database) - minio: use bin mc replace docker images4133d05
(dockerbuilder) - dockerbuilder: update caddy and kaniko6b4dd18
(dockerbuilder) - minio: use bin mc replace docker images6df9b7c
(fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3c2490f8
(fluentd) - fluentd: upgrade fluentdbe4a56a
(fluentd) - fluentd: add Gemfile.lock2237f75
(fluentd) - charts: upgrade k8s newer API versionsc574065
(fluentd) - charts: upgrade k8s newer API versions52b8084
(fluentd) - router: delete obsolete router code3b3cceb
(fluentd) - fluentd: remove manifests dir25c6702
(fluentd) - nsqd: change var namebd571be
(fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS72aa4e6
(fluentd) - influxdb: change influxdb service namebd61903
(logger) - logger: use go mod replace dep69c63a1
(logger) - logger: update go.mod3aa9cd7
(logger) - registry: del quay.iof058496
(logger) - nsqd: change var name6d9787c
(logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS85ed307
(logger) - logger: standard namingd88e7b6
(minio) - minio: update minio api to v743715d2
(minio) - minio: upgrade minio0e1239b
(minio) - minio: use docker.io replace quay.iof7f047b
(minio) - registry: del quay.ioafa7128
(minio) - build: upgrade go.modaff2db5
(minio) - charts: upgrade k8s newer API versions4547f14
(minio) - pkg: upgrade to new drycc/pkg2769b85
(minio) - minio: use bin mc replace docker images35dde8d
(monitor) - monitor: update grafana influxdb telegraf9e3a949
(monitor) - charts: upgrade k8s newer API versions6af0432
(monitor) - workflow-manager: remove workflow-manager0611c07
(monitor) - router: delete obsolete router codebe04824
(monitor) - cert_manager: change cert_manager_enabled to global3780165
(monitor) - charts: change platform_domain to global50b04e1
(monitor) - influxdb: remove influxdb admin ui6ab4d68
(monitor) - influxdb: remove unuse portf1510bd
(monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetesf36de2c
(monitor) - pvc: upgrade to new formatfc78a0a
(monitor) - workflow: remove namespacee85890f
(monitor) - monitor: monitoring nsqd and redis separately694f6b1
(monitor) - mirrors: delete aliyun mirrors4aea36a
(monitor) - grafana: add ldap support for grafana68fc30f
(nsqd) - nsq: update nsq16f32aa
(nsqd) - charts: upgrade k8s newer API versions04db389
(redis) - reids: update to redis 63f01bab
(redis) - charts: upgrade k8s newer API versions647e4be
(registry) - registry: del quay.io0bbce99
(registry) - charts: upgrade k8s newer API versionsa982b50
(registry) - minio: use bin mc replace docker imagese088da3
(registry-proxy) - ingress: renmae use_native_ingress to use_ingress7e88337
(registry-proxy) - nginx: upgrade nginx to mainline7204d72
(registry-proxy) - registry: optimizing variable naming2eafc59
(registry-proxy) - registry-proxy: update nginx071bd86
(registry-proxy) - charts: upgrade k8s newer API versionsc72db96
(registry-proxy) - registry-proxy: change travis icon urlca9f962
(slugbuilder) - slugbuilder: del BUILDPACK_URL support1b74dd5
(slugbuilder) - slugbuilder: add heroku-20 support54d4ad2
(slugbuilder) - slugbuilder: del quay.ioa78f37e
(slugbuilder) - slugbuilder: add heroku-20 stack94ac94a
(slugbuilder) - minio: use bin mc replace docker images53b4b8b
(slugbuilder) - slugbuilder: modify stack priority58e2bd2
(slugbuilder) - dockerfile: add WORKDIR /tmpb29cd04
(slugbuilder) - slugbuilder: add pre_build.sh9d319f6
(slugbuilder) - slugbuilder: silent mc command outputd1ec3c9
(slugbuilder) - heroku: remove heroku-16 support5048534
(slugbuilder) - slugbuilder: use drycc stack-imagesa116537
(slugrunner) - slugrunner: add heroku-20 supporta1196bf
(slugrunner) - slugrunner: del quay.io64c96d7
(slugrunner) - slugrunner: add heroku-20 stackcc3e226
(slugrunner) - minio: use bin mc replace docker images9130bde
(slugrunner) - shellcheck: shellcheck installer4ea33e1
(slugrunner) - slugrunner: modify stack priority5514e8b
(slugrunner) - heroku: remove heroku-16 supportbe829fb
(slugrunner) - slugrunner: use drycc stack-imagese1e06be
(slugrunner) - slugrunner: remove Dockerfile.heroku-16These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.2.0, please refer to the following change summary.
+9c7cceb
(builder) - builder: add app config to env7fe44fa
(controller) - docker: docker timeout must be an int, float or Noneb196550
(controller) - controller: revert release.check_image_access for nowcc3ec13
(workflow-manager) - glide: bump goautonegef932c4
(builder) - controller-sdk-go: upgrade controller-sdk-go4654cf6
(controller) - django-rest-framework: upgrade to 3.9.314121f1
(controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs385acdc
(controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfsfa312bb
(database) - postgres: set max_connections = 10247ebecdf
(database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb8878f6
(dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb097451
(fluentd) - fluent: upgrade fluent to v1.44341f9a
(minio) - mc: upgrade mc and minioc1ee2a4
(monitor) - monitor: remove copyrights.tar.gz9854260
(registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zacc5627
(slugbuilder) - slugbuilder: internal support for multi buildpackd58907e
(slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb39a0c2
(slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27ZThese release notes for Drycc Workflow v1.2.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.1.0, please refer to the following change summary.
+e5584e3
(controller) - controller: add STACK supportad34dc1
(dockerbuilder) - kaniko: use kaniko replace docker-pyb81430e
(dockerbuilder) - dockerbuilder: change image to image.json format60dde96
(slugbuilder) - slugbuilder: add STACK supportfe8b6e5
(slugrunner) - slugrunner: add STACK support942f050
(builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORTff7a16f
(builder) - registry: remove ecr and gcr registryad13683
(builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK6def637
(builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY5044e22
(builder) - registry: remove registry_secret_prefix2ea39cc
(builder) - controller-go-sdk: upgrade controller-go-sdk6aee0d7
(builder) - registry: optimizing variable namingf9c62d9
(controller) - domain: added reserved domain checkf5a135b
(controller) - migrations: clean old migrations4369b2c
(controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY1057ca5
(controller) - registry: remove registry_secret_prefixd114b3e
(controller) - docker: update docker clientedbe963
(dockerbuilder) - dockerfile: change base image to alpinefb35baf
(dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY946dbf6
(dockerbuilder) - docker: remove insecure support628d853
(dockerbuilder) - proxy: add registry proxyff27cbd
(registry) - env: remove unused env7204d72
(registry-proxy) - registry: optimizing variable naming01.05.2024 in Release
+less than a minute
+Workflow ## v1.7.7 -> v1.7.8 Releases builder v1.6.0 -> v1.7.0 controller v1.8.0 -> v1.9.0 workflow-cli v1.6.0 -> v1.7.0 Features 384c7ee (builder) - domain: add procfile_type 26c8c7f (controller) - domain: add procfile_type bd49789 …
+ +30.04.2024 in Release
+6 minute read
+Workflow ## v1.7.6 -> v1.7.7 Releases builder v1.5.1 -> v1.6.0 controller v1.7.0 -> v1.8.0 database v1.2.1 -> v1.3.0 passport v1.2.0 -> v1.3.0 imagebuilder v1.1.1 -> v1.2.0 fluentbit v0.0.1 -> v0.0.2 logger v1.3.3 -> v1.3.4 …
+ +27.02.2024 in Release
+less than a minute
+Workflow ## v1.7.5 -> v1.7.6 Releases storage v0.0.4 -> v0.0.5 Maintenance 6cb63b6 (storage) - seaweedfs: bump version 3.63
+ +27.02.2024 in Release
+2 minute read
+These release notes for Drycc Workflow v1.7.5 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.4, please refer to the following change summary. …
+ +29.01.2024 in Release
+2 minute read
+These release notes for Drycc Workflow v1.7.2 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.1, please refer to the following change summary. …
+ +08.12.2023 in Release
+10 minute read
+These release notes for Drycc Workflow v1.7.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.6.0, please refer to the following change summary. …
+ +21.10.2022 in Release
+16 minute read
+These release notes for Drycc Workflow v1.6.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.5.0, please refer to the following change summary. …
+ +06.10.2022 in Release
+11 minute read
+These release notes for Drycc Workflow v1.5.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary. …
+ +06.10.2021 in Release
+9 minute read
+These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary. …
+ +06.10.2020 in Release
+2 minute read
+These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.2.0, please refer to the following change summary. …
+ ++This is the multi-page printable view of this section. +Click here to print. +
+Drycc Workflow is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage applications.
+We welcome your input! If you have feedback, please submit an issue. If you’d like to participate in development, please read the “Working on Documentation” section below and submit a pull request.
+ +06.10.2018 in News
+less than a minute
+Drycc Workflow is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage applications. +We welcome your input! If you have feedback, please submit an issue. If …
+ +06.10.2019 in Release
+2 minute read
+These release notes for Drycc Workflow v1.2.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.1.0, please refer to the following change summary. …
+ +06.10.2018 in News
+less than a minute
+Drycc Workflow is an open source Container as a Service (CaaS) that adds a developer-friendly layer to any Kubernetes cluster, making it easy to deploy and manage applications. +We welcome your input! If you have feedback, please submit an issue. If …
+ ++This is the multi-page printable view of this section. +Click here to print. +
+6c1cf5e
(builder) - charts: reuses the value from an existing secret and config65ae63c
(builder) - pipeline: add dryccfile supportbb7b11d
(builder) - auth: add tokens api39d022f
(controller) - ps: add pod logs support86056d0
(controller) - charts: reuses the value from an existing secret and config4cf005c
(controller) - limits: add limits plan supportbf60e4b
(controller) - controller: add init job98f77a8
(controller) - pipeline: add dryccfile support8ce9a83
(controller) - cert-manager: add tls events7034f5d
(controller) - config: deploy according to procfile_type5554d8f
(controller) - config: add typed_values2c5bbad
(controller) - auth: add token api410d34e
(database) - charts: reuses the value from an existing secret and config693e4d1
(imagebuilder) - pipeline: add dryccfile support7d9cc06
(imagebuilder) - config: add typed values854e171
(passport) - charts: reuses the value from an existing secret and config7ac9255
(passport) - oauth2: add authorization code for any grant type4517547
(rabbitmq) - charts: reuses the value from an existing secret and configbccfcb4
(redis) - charts: reuses the value from an existing secret and configd887605
(registry) - charts: reuses the value from an existing secret and configff09e5b
(storage) - charts: reuses the value from an existing secret and configc6e2ac8
(timeseries) - charts: reuses the value from an existing secret and config22c4c77
(workflow-cli) - apps: change drycc run to asynca9e6369
(workflow-cli) - ps: add pod logs support2bc31c8
(workflow-cli) - limits: add limits plan supportf40398a
(workflow-cli) - pipeline: add dryccfile support03638ff
(workflow-cli) - tls: add tls events9113627
(workflow-cli) - config: add typed values43ee760
(workflow-cli) - auth: add tokens api50dfe64
(builder) - woodpecker: CI_SYSTEM_ARCH env removedab09b24
(controller) - healthcheck: delete outdated code52019b5
(controller) - services: default PORT change errorf57ae42
(controller) - certificate: failed to create certificate30c3f54
(controller) - woodpecker: CI_SYSTEM_ARCH env removeddbba43a
(controller) - service: update port errore0459c5
(controller) - copy: use deepcopy replace copy2122479
(controller) - charts: failed to call webhook53d9977
(controller) - signals: config limits handle errorafda287
(controller) - limits: always set defaultb350cb8
(database) - woodpecker: CI_SYSTEM_ARCH env removedb48a422
(fluentbit) - woodpecker: CI_SYSTEM_ARCH env removed7cebca2
(gateway) - cert-manager: auto tls error190c19b
(imagebuilder) - woodpecker: CI_SYSTEM_ARCH env removed2c6a6f9
(logger) - woodpecker: CI_SYSTEM_ARCH env removed10bb98d
(monitor) - woodpecker: CI_SYSTEM_ARCH env removedf8225dc
(passport) - woodpecker: CI_SYSTEM_ARCH env removed06db66c
(prometheus) - woodpecker: CI_SYSTEM_ARCH env removedf4aff72
(rabbitmq) - woodpecker: CI_SYSTEM_ARCH env removed88c18ff
(redis) - woodpecker: CI_SYSTEM_ARCH env removed5dcc19d
(registry) - woodpecker: CI_SYSTEM_ARCH env removed092a939
(registry-proxy) - woodpecker: CI_SYSTEM_ARCH env removed3597ac9
(storage) - woodpecker: CI_SYSTEM_ARCH env removed5a49b35
(timeseries) - woodpecker: CI_SYSTEM_ARCH env removed0c4a48a
(workflow-cli) - tls: change issuer options06a2511
(workflow-cli) - tls: info error2f7617e
(builder) - go: bump controller-sdk-go versionaae2f29
(builder) - charts: add diagnostic mode7304980
(builder) - woodpecker: migrations woodpecker-ci to 230b648b
(builder) - charts: change canary app version2afa006
(builder) - controller-sdk-go: bump versiond127a90
(builder) - config: add typed values32fdfd0
(controller) - charts: add diagnostic mode0974942
(controller) - woodpecker: migrations woodpecker-ci to 2f401e08
(controller) - python: bump python 3.12c565959
(controller) - celery: remove retrieve_resource task47be1a1
(controller) - requirements: bump drf 3.15.199f7468
(controller) - charts: add config to values.yaml7d17f5c
(controller) - scale: prohibit scale when there is a running pipelinef09e1c9
(controller) - resource: sort services and planse817505
(controller) - limits: change default cpu and gpu name5531b2f
(controller) - auth: add password login27473f7
(controller) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfsc1ee1c7
(controller) - deps: bump aiohttp from 3.9.3 to 3.9.4 in /rootfsaffbcb5
(database) - postgres: add patroni and postgres params (#15)f9e4eda
(database) - dockerfile: install vi008b7b6
(database) - dockerfile: install vim instand of vidbbfee1
(database) - charts: add diagnostic mode2e26c33
(database) - woodpecker: migrations woodpecker-ci to 2a1b81f2
(database) - charts: change canary app versionbc725e8
(fluentbit) - charts: add diagnostic mode5d73886
(fluentbit) - woodpecker: migrations woodpecker-ci to 2b85072d
(fluentbit) - charts: change canary app version761174d
(gateway) - gateway: change secrets name1c304da
(gateway) - woodpecker: migrations woodpecker-ci to 2b919a4c
(gateway) - charts: change canary app version3cea298
(imagebuilder) - charts: allow all dns653bcbe
(imagebuilder) - woodpecker: migrations woodpecker-ci to 259daeab
(imagebuilder) - charts: change canary app version2834a5a
(logger) - charts: add diagnostic mode6685492
(logger) - woodpecker: migrations woodpecker-ci to 2191cdaf
(logger) - charts: change canary app versionb3c3cfa
(monitor) - charts: add diagnostic mode796799d
(monitor) - grafana: add node metrics dashboardef2a222
(monitor) - woodpecker: migrations woodpecker-ci to 29c83090
(monitor) - charts: change canary app version1a97c2c
(passport) - charts: add diagnostic mode353e1ae
(passport) - logger: add oauth2_provider logger configfe735c0
(passport) - woodpecker: migrations woodpecker-ci to 241d6144
(passport) - charts: change canary app version979d474
(passport) - python: bump python 3.12e9f41a1
(passport) - requirements: bump drf 3.15.1f479f4d
(passport) - charts: add migrate jobad9abf6
(passport) - passport: migrations add run_before95ac667
(passport) - passport: optimize the use of master and slave database rules204f7fc
(passport) - deps: bump gunicorn from 21.2.0 to 22.0.0 in /rootfs90a6410
(prometheus) - woodpecker: migrations woodpecker-ci to 22d8eb44
(prometheus) - charts: change canary app version9687a17
(rabbitmq) - charts: add diagnostic mode35d3d5b
(rabbitmq) - woodpecker: migrations woodpecker-ci to 26a6564d
(rabbitmq) - charts: change canary app versioncb6722f
(redis) - charts: add diagnostic mode9553497
(redis) - woodpecker: migrations woodpecker-ci to 21c8dc07
(redis) - charts: change canary app version9fa2a32
(registry) - charts: add diagnostic mode9b09e51
(registry) - woodpecker: migrations woodpecker-ci to 27dbd390
(registry) - charts: change canary app versione1d2a33
(registry-proxy) - charts: add diagnostic mode3eabfdd
(registry-proxy) - charts: remove default limitsf8754da
(registry-proxy) - woodpecker: migrations woodpecker-ci to 27df7316
(registry-proxy) - charts: change canary app version861d3b8
(storage) - filer: modify the default parameters of the filer5fa08da
(storage) - woodpecker: migrations woodpecker-ci to 222c4620
(storage) - charts: change canary app version6c1e29c
(timeseries) - postgres: add patroni paramse280d3f
(timeseries) - dockerfile: install vi5213617
(timeseries) - dockerfile: install vim instand of via569a57
(timeseries) - charts: add diagnostic modeb93ec70
(timeseries) - woodpecker: migrations woodpecker-ci to 2ff3b870
(timeseries) - charts: change canary app versione334f74
(workflow-cli) - healthcheck: delete outdated healthcheck style4f8b960
(workflow-cli) - auth: add password loginThese release notes for Drycc Workflow v1.7.5 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.4, please refer to the following change summary.
+95d130a
(controller) - controller: volume support nfsee2ee15
(controller) - controller: container entrypoint error03ea4f8
(controller) - controller: class property have been deprecated in python 3.115f04d17
(controller) - controller: miss err msg27972a3
(controller) - controller: load_db_state_to_k8s erra005d62
(controller) - controller: volume repeat path no errorc7a5ba6
(rabbitmq) - rabbitmq: cpu usage to high45c2077
(workflow-cli) - workflow-cli: miss err msgbc738bd
(workflow-cli) - workflow-cli: volumes list format35e1c06
(builder) - builder: bump golang 1.2226caa36
(controller) - deps: bump aiohttp from 3.9.0 to 3.9.2 in /rootfs (#118)3d938c4
(controller) - deps: bump django from 4.2.7 to 4.2.10e625c2f
(logger) - logger: bump golang 1.22bfa500d
(redis) - redis: headless svc does not require ports330209a
(registry) - registry: headless svc does not require ports48c42eb
(storage) - storage: change volume index to leveldbf4fde9d
(storage) - storage: add volume size limit33e3684
(workflow-cli) - workflow-cli: volume support nfs48d5950
(workflow-cli) - workflow-cli: bump golang 1.226cb63b6
(storage) - seaweedfs: bump version 3.63These release notes for Drycc Workflow v1.7.2 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.1, please refer to the following change summary.
+2fe80a6
(controller) - resources: after resources instance update, could not delete (#111)a4082ad
(controller) - controller: resource status and bindinge9bfccc
(controller) - controller: fix multiple volumes mount at one dir error (#116)58d2b4c
(logger) - logger: redis conn error block7cb2700
(prometheus) - prometheus: prometheus config basic_auth7838c6b
(storage) - storage: random accesskey secretkeyd9dcdfb
(storage) - storage: pod restart loses data3cbdd29
(storage) - storage: tipd cannot start after deleting podbe7e11f
(storage) - storage: jq command not found878f674
(storage) - storage: charts updateStrategy error06cfe56
(timeseries) - timeseries: the data node ip is incorrect7f29f5a
(controller) - resources: retrieve resource instance response add message (#112)4a84dcd
(controller) - controller: add deploy default annotations (#113)829d7e5
(controller) - controller: modify url match service name (#114)30abf6d
(controller) - controller: transfer app ownership in asyncdc6f45e
(controller) - controller: add channel for pod execaf4f3a7
(controller) - controller: avoid error when secret no data field (#117)ca27956
(controller) - controller: add pod default securityb2e9c64
(prometheus) - charts: node-exporter mount root (#2)3cdb2b6
(storage) - storage: bump seaweedfs 3.6100dd2fd
(storage) - storage: add csi daemonset updateStrategy48e763c
(storage) - storage: add drycc storage upgrade document841df90
(storage) - storage: bump seaweedfs 3.62cefd52e
(timeseries) - timeseries: add check data node existsad1c46e
(workflow-cli) - resources: resources instance add message9f955c2
(workflow-cli) - workflow-cli: add short options cpu65399ef
(workflow-cli) - workflow-cli: add tty resize supportThese release notes for Drycc Workflow v1.7.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.6.0, please refer to the following change summary.
+fcbebda
(builder) - builder: use TCPRoute expose serviced02bb5d
(controller) - controller: support app dns policy config9aa968e
(controller) - controller: add svc type support62e2d34
(controller) - controller: improve the services api4393755
(controller) - controller: use gateway replace ingress323045d
(controller) - controller: add canary support3f81c97
(controller) - gateways: add addresses field4e64aa7
(controller) - gateways: add addresses field02ad581
(monitor) - grafana: add pd tikv dashboard2a9e2b0
(monitor) - monitor: add storage monitor41d5057
(monitor) - grafana: data source change to prometheusec035d1
(monitor) - monitor: usegateway replace ingressc694c98
(monitor) - grafana: add drycc storage seaweedfs dashboard1e1fdc8
(passport) - passport: use gateway replace ingressffdb408
(prometheus) - prometheus: use gateway replace ingress04152b9
(rabbitmq) - rabbitmq: use gateway replace ingress0499500
(builder) - builder: manifest error642491d
(builder) - builder: no build log873d146
(controller) - controller: do not set entrypoint when no procfiled9028c5
(controller) - controller: pip8 error3efcfb7
(controller) - controller: manifest error18a3a1a
(controller) - controller: miss service error94f796c
(controller) - controller: drycc run pod should not restart80f3161
(controller) - controller: monitor query errorb76f2c5
(controller) - controller: read websocket delayb6e068e
(controller) - controller: metrics sql tpl, gateway pod should not restart, cleanup old rs, update monitor datatbase configad9adc6
(controller) - controller: rabbitmq sharding err6773907
(controller) - controller: default k8s pod annotaionsffcf1f9
(controller) - controller: under-indented for visual indent3afd0cf
(controller) - controller: charts env error769bb8b
(database) - database: manifest error769bb8b
(database) - database: label conflict error6a321c5
(database) - database: link error558feae
(fluentbit) - fluentbit: build charts error98d8a2a
(gateway) - fixup8b5dde1
(gateway) - gateway: secretName702866d
(gateway) - gateway: build statusf55dac1
(imagebuilder) - imagebuilder: manifest errorac13b5f
(imagebuilder) - imagebuilder: build svg6b7bbc5
(logger) - logger: manifest error0136b5c
(monitor) - monitor: manifest errorf03d975
(passport) - passport: DRYCC_GRAFANA_DOMAIN errorb530ea8
(passport) - passport: manifest errorbe5a0a7
(passport) - passport: change passport1596c7f
(rabbitmq) - rabbitmq: manifest error0dc4f6f
(rabbitmq) - rabbitmq: images-shard error43293ae
(redis) - redis: manifest errorca13b7d
(registry) - registry: manifest errorab5c793
(registry) - registry: garbage collect errorab0fabc
(registry-proxy) - registry-proxy: manifest errordfc7236
(registry-proxy) - registry-proxy: daemon yaml format42c03be
(storage) - storage: seaweedfs csi error453e41a
(timeseries) - timeseries: could not register nodebdd02eb
(builder) - builder: use dynamic clusterrole name66b4b25
(builder) - builder: upgrade new controller-go-sdk219d86f
(builder) - builder: upgrade go.mod91f2f14
(builder) - builder: use woodpecker replace drone9abca16
(builder) - woodpecker: use woodpecker ci build statusf43dd50
(builder) - deps: bump golang.org/x/net from 0.2.0 to 0.7.00384c69
(builder) - builder: add chart appVersione3149b9
(builder) - builder: upgrade codename to bookwormd88ea1b
(builder) - builder: add codename build-argba59030
(builder) - builder: upgrade go.mod1114dd7
(builder) - builder: bump common 1.1.2fe50b62
(builder) - builder: change drycc gateway listener namedb3950c
(builder) - builder: remove gateway route5a508bb
(builder) - builder: use podman replace dockerbbb9029
(builder) - deps: bump golang.org/x/net from 0.12.0 to 0.17.0f4e5d6c
(builder) - builder: remove health url9111c8f
(builder) - builder: remove io/ioutil1f36e3d
(controller) - deps: bump django from 4.1.2 to 4.1.6 in /rootfse4ab434
(controller) - controller: use woodpecker replace drone9f0301e
(controller) - deps: bump django from 4.1.6 to 4.1.7 in /rootfs3932423
(controller) - woodpecker: use woodpecker ci build statusae8b6b4
(controller) - setting: support KUBERNETES_LIMITS env configc10b9bc
(controller) - controller: using the api_version instead of hard codinge6908cd
(controller) - controller: upgrade requirementsb0eba0c
(controller) - controller: add route rules serializer2e4b6a4
(controller) - controller: add chart appVersion7d32b55
(controller) - controller: upgrade to bookwormf2dc8dd
(controller) - controller: add codename build-arg5739b83
(controller) - controller: use timescaledb replace influxdb53892cb
(controller) - controller: add timeseries0fe0eae
(controller) - controller: upgrade requirements18b2a91
(controller) - deps: bump aiohttp from 3.8.4 to 3.8.5 in /rootfsf50874a
(controller) - controller: bump common 1.1.2956cd08
(controller) - controller: change drycc gateway listener name9ab3ead
(controller) - controller: remove passport url checka24c7b0
(controller) - controller: remove gateway routef7e539a
(controller) - controller: change celery priorityab77a52
(controller) - controller: use podman replace docker8e27501
(controller) - controller: dynamic app storage class385978b
(controller) - controller: list_pods datetime formatb20362c
(controller) - deps: bump django from 4.2.3 to 4.2.7 in /rootfse11ae1b
(controller) - controller: add cluster migrateca6e9df
(controller) - controller: async mount9a7fbfc
(controller) - controller: remove FOSSA3d55279
(controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfsd498a11
(controller) - controller: add measure loalancers249a985
(controller) - deps: bump aiohttp from 3.8.5 to 3.8.6 in /rootfsb967f58
(controller) - deps: bump aiohttp from 3.8.6 to 3.9.0 in /rootfs (#107)8ca9ed6
(controller) - controller: no longer restrict reserved domain9ff6649
(database) - database: add init database configure9b4cd26
(database) - database: use dynamic clusterrole nameb59cde4
(database) - database: remove minio require86462f8
(database) - database: use woodpecker replace drone1e8555a
(database) - database: add chart appVersion1b762d5
(database) - database: upgrade codename to bookworm9ffe1fd
(database) - database: add codename build-arg69466d7
(database) - database: add database extensionbeb4b62
(database) - database: bump common 1.1.267e2714
(database) - database: use podman replace docker8f328f8
(fluentbit) - fluentbit: no limit buffer size for kube apifc0552c
(fluentbit) - fluentbit: use podman replace docker63a6cab
(fluentbit) - fluentbit: change fluentbit match220f81a
(fluentbit) - fluentbit: run as no-rootaec1393
(fluentbit) - fluentbit: change configmap name1af4fd2
(fluentbit) - fluentbit: change default stream namebef90ad
(gateway) - gateway: add route for gatewayd523ddb
(gateway) - gateway: change drycc gateway listener named9137f4
(gateway) - gateway: add chart appVersion0425dd4
(gateway) - gateway: add customListeners3982b86
(imagebuilder) - imagebuilder: use woodpecker replace drone3e4e7a3
(imagebuilder) - imagebuilder: add chart appVersion8df6e8e
(imagebuilder) - imagebuilder: upgrade stack versiona5601f7
(imagebuilder) - imagebuilder: add drycc_app env07465f8
(imagebuilder) - imagebuilder: upgrade to bookworm00d22d2
(imagebuilder) - imagebuilder: add codename build-arg0b7a24e
(imagebuilder) - imagebuilder: upgrade podman/mc/caddya7d8be8
(imagebuilder) - imagebuilder: use podman replace docker6b2da83
(logger) - logger: use woodpecker replace drone8245b25
(logger) - woodpecker: use woodpecker ci build statusf811a74
(logger) - logger: add chart appVersion413f6f6
(logger) - logger: upgrade codename to bookworm2ac6b10
(logger) - logger: add codename build-arg2581426
(logger) - logger: bump redis to v9364b25a
(logger) - logger: bump common 1.1.2dc169a3
(logger) - logger: use fluentbit replace fluentdd855d91
(logger) - logger: use podman replace dockerf767235
(monitor) - monitor: add off-cluster passport configureab23936
(monitor) - monitor: use dynamic clusterrole name47beee0
(monitor) - monitor: change tikv secret keyaf7703f
(monitor) - grafana: remove panel when component off-cluster1b870c2
(monitor) - monitor: use woodpecker replace drone4a5f1f1
(monitor) - grafana: up ldap api_url config143cabe
(monitor) - monitor: add prometheus architecture diagram93091c2
(monitor) - woodpecker: use woodpecker ci build status0b7045a
(monitor) - grafana: add dashboard kubernetes_deployment_metrics2fb1839
(monitor) - woodpecker: pipeline config VERSION, when build container imagee272416
(monitor) - monitor: add chart appVersionabc0e53
(monitor) - monitor: upgrade codename to bookworm86cc01b
(monitor) - monitor: add codename build-arg1cd849f
(monitor) - monitor: add postgresql outputsc3205c0
(monitor) - monitor: change default agent config8c802c0
(monitor) - monitor: add timeseries databasee9abc40
(monitor) - monitor: bump common 1.1.26af66cd
(monitor) - monitor: change drycc gateway listener named02d718
(monitor) - monitor: remove gateway route3509c29
(monitor) - monitor: use podman replace dockered7bfa2
(monitor) - monitor: optimize env PROMETHEUS_URLda89bef
(passport) - passport: charts codereview61c4a96
(passport) - passport: support init app config9101006
(passport) - passport: add initApplications to charts7dd7fa4
(passport) - passport: use woodpecker replace drone4400199
(passport) - woodpecker: use woodpecker ci build status6b2c546
(passport) - passport: change secret name to drycc-passport-auto-tlsc8bd824
(passport) - passport: upgrade requirementsaee5aef
(passport) - passport: add chart appVersion2d81953
(passport) - passport: upgrade codename to bookworm9e66242
(passport) - passport: add codename build-arg0fca998
(passport) - passport: upgrade requirements3482528
(passport) - passport: bump common 1.1.20c5ec93
(passport) - passport: change drycc gateway listener namef7b8f53
(passport) - passport: remove gateway routebaf69da
(passport) - passport: use podman replace dockerfcd45dd
(passport) - passport: add cluster migrateda6d32a
(prometheus) - prometheus: add prometheus-config683de9e
(prometheus) - prometheus: use podman replace docker3323300
(prometheus) - prometheus: remove gateway routeda1d356
(prometheus) - prometheus: change drycc gateway listener name4e7a936
(prometheus) - prometheus: bump common 1.1.244c1c6f
(prometheus) - prometheus: add codename build-argd1f1dda
(prometheus) - prometheus: upgrade codename to bookworm0836fc1
(prometheus) - prometheus: add chart appVersion9e13232
(prometheus) - prometheus: add LICENSEf53e14a
(rabbitmq) - rabbitmq: remove auto user0ec7277
(rabbitmq) - rabbitmq: use woodpecker replace dronef376a30
(rabbitmq) - woodpecker: use woodpecker ci build status51405d8
(rabbitmq) - rabbitmq: add chart appVersion463ca03
(rabbitmq) - rabbitmq: upgrade codename to bookworm1978a71
(rabbitmq) - rabbitmq: add codename build-arg139277f
(rabbitmq) - rabbitmq: bump common 1.1.2be49741
(rabbitmq) - rabbitmq: change drycc gateway listener name6d22518
(rabbitmq) - rabbitmq: remove gateway route0eb7833
(rabbitmq) - rabbitmq: add check shards9211063
(rabbitmq) - rabbitmq: erlang vm tuning optimization648a78d
(rabbitmq) - rabbitmq: use podman replace docker0b43a4d
(rabbitmq) - rabbitmq: add x-random exchangead1c4da
(redis) - redis: use woodpecker replace drone3f37f92
(redis) - redis: add chart appVersione3bef7a
(redis) - redis: upgrade codename to bookworm4e806d4
(redis) - redis: add codename build-argd5023be
(redis) - redis: bump common 1.1.298f5d6f
(redis) - redis: use podman replace docker063f29e
(registry) - registry: use woodpecker replace drone17bf8ae
(registry) - woodpecker: use woodpecker ci build status7bbad15
(registry) - registry: add chart appVersion279154f
(registry) - registry: upgrade codename to bookworm3e4ae84
(registry) - registry: add codename build-argfa322d6
(registry) - registry: bump common 1.1.26c18fe0
(registry) - registry: use podman replace docker0bc8472
(registry) - registry: remove health url5dacd9f
(registry) - registry: add wait-for-port checkfdeefc3
(registry) - registry: use headless08bf9f8
(registry) - registry: change registry port to 500040bcea2
(registry) - registry: add registry push test871b8e7
(registry) - registry: add default env7f3b3ac
(registry) - registry: bump registry 2.8.3569f15d
(registry-proxy) - registry-proxy: use woodpecker replace dronecc33caf
(registry-proxy) - woodpecker: use woodpecker ci build status0002aab
(registry-proxy) - registry-proxy: add chart appVersion40af10b
(registry-proxy) - registry-proxy: upgrade codename to bookwormc56b9df
(registry-proxy) - registry-proxy: add codename build-arg9d5bfe0
(registry-proxy) - registry-proxy: use podman replace dockere6a3350
(registry-proxy) - registry-proxy: change worker_processes to 1726f39d
(storage) - storage: add volume compactionMBpsa5aa2d8
(storage) - storage: add threshold to vacuum and reclaim spacese687d04
(storage) - storage: delete disk type in single disk case75ee2e4
(storage) - storage: change datanode replicas to 4c5fd7ba
(storage) - storage: delete useless envb3826ea
(storage) - storage: add ssd hdd dir29881a0
(storage) - storage: add balance cronjobc5a0f51
(storage) - storage: add defaultReplication for seaweedfs master543c7a2
(timeseries) - timeseries: use podman replace docker5376024
(timeseries) - timeseries: update timeseries-service-replica52e8520
(timeseries) - timeseries: bump common 1.1.2f82657c
(timeseries) - timeseries: add start scriptThese release notes for Drycc Workflow v1.6.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.5.0, please refer to the following change summary.
+52517d9
(builder) - builder: update controller-sdk-go1d78ca0
(builder) - builder: add affinity26b6980
(builder) - builder: switch charts to ocibfd4385
(controller) - controller: add get manager user status874208d
(controller) - controller: unified measurement modelcadf98f
(controller) - controller: add admission webhooke0050c2
(controller) - controller: new measurement modela11ba58
(controller) - controller: multi pod restart uses asyncfb3c15d
(controller) - controller: add check app owner status3d78b76
(controller) - controller: add resource services api3d6a201
(controller) - controller: add search apps api01c443a
(controller) - controller: add KUBERNETES_CPU_MEMORY_RATIO parameter7c26232
(controller) - controller: add volume size limit3bee749
(controller) - controller: add annotations support23cd97c
(controller) - controller: traefik v2 supporte37b7db
(controller) - controller: add affinityb3b367b
(controller) - controller: add volume expand supporta4e154a
(controller) - controller: add database replica support2f37216
(controller) - controller: switch wsgi to asgib3314a5
(controller) - controller: add pod exec api75df2dc
(controller) - controller: add stream support for app logs4229bad
(controller) - ccontroller: switch charts to oci89bb19b
(database) - database: upgrade to pg149f45a5d
(database) - database: add hugepages supportc4008c9
(database) - database: add affinity411a7b2
(database) - postgres: use patroni64e5cb0
(database) - database: switch charts to oci2bab823
(fluentd) - fluentd: switch charts to oci337ba62
(imagebuilder) - imagebuilder: run podman as rootless4396ffa
(imagebuilder) - imagebuilder: switch to oci chartsf37ae09
(influxdb) - influxdb: add affinity04503b2
(influxdb) - influxdb: add influxdb ha41ddad5
(influxdb) - influxdb: switch charts to oci2006480
(logger) - logger: use redis stream replace nsqdab23d17
(logger) - logger: add affinity81d4e9d
(logger) - logger: switch charts to ocic3d9796
(monitor) - monitor: add affinitycd9de3c
(monitor) - monitor: switch to oci charts318a73f
(passport) - passport: add change user confirm79ef100
(passport) - passport: add re login at authorize6927bb5
(passport) - passport: add affinity3146a09
(passport) - passport: add google reCAPTCHA802abcd
(passport) - passport: add replica database supporta0dcd1b
(passport) - passport: switch wsgi to asgi4c9dbba
(passport) - passport: switch charts to oci74825f7
(rabbitmq) - rabbitmq: add rabbitmq managentment ingress12cf7d6
(rabbitmq) - rabbitmq: add affinity103417d
(rabbitmq) - rabbitmq: switch charts to oci5d428bb
(redis) - redis: add affinitya88c1a9
(redis) - redis: switch charts to oci541585d
(registry) - registry: add affinitye9ca9d4
(registry) - registry: add garbage-collect cronjobec62a59
(registry) - registry: switch charts to ocifde0b07
(registry-proxy) - registry-proxy: switch charts to ocibe14eb4
(storage) - minio: add affinity51af696
(storage) - storage: add k8s csi support76a75d9
(storage) - storage: add cluster health checkera17dc8c
(storage) - storage: switch charts to ocie4f44fb
(builder) - builder: no error returne38dfc7
(builder) - builderControllerHost/ControllerPort init errorff9069f
(controller) - controller: influxdb query errorf7f5069
(controller) - controller: authentication 5007e297a8
(controller) - controller: add check remote user status9db28e1
(controller) - controller: celery MaxRetriesExceededError4bcff08
(controller) - controller: wrong named69fde2
(controller) - controller: traefik ingress create errora3ad743
(controller) - fixup(controller: user login error662c8dd
(controller) - controller: change influxdb port957bdf6
(controller) - controller: validate rsa key pairing before storage419ec4c
(controller) - controller: kubernetes pod/exec cluster rolea67edaa
(controller) - controller: Cannot routing:disablee09e214
(controller) - controller: allowlist cannot remove318b126
(controller) - controller: domains update error92855eb
(database) - database: premission deniedbde945a
(database) - fixup(postgres: support arm, fix Failed to build psutil7854d45
(database) - fixup(postgres: user name converted to lowercase letters57b2a07
(fluentd) - fluentd: ifconfig_path not found20e72b9
(imagebuilder) - imagebuilder: upgrade pack version651db8a
(imagebuilder) - imagebuilder: chown uid gid orderd2e9164
(influxdb) - influxdb: proxy not running3a1d361
(monitor) - monitor: charts namingd754ae0
(monitor) - monitor: telegraf init error63f9e34
(monitor) - monitor: affinity error95ae1e5
(passport) - passport: yarn build fail3f5365e
(passport) - passport: wrong name907f17b
(passport) - passport: change uid gid to 1001e3911e0
(passport) - passport: ‘registration_done’ not found2ace5f0
(passport) - passport: ui styleb3ba1e1
(passport) - passport privacy policy link172e9c8
(passport) - passport: check databaseReplicaUrl errora3aeb70
(rabbitmq) - passport: change uid gid to 10015c73dcf
(redis) - reids: DRYCC_REGISTY misspellingd7e3baf
(redis) - redis: env misscadaa91
(registry) - registry: set gid uid to 1001d524217
(registry) - registry: storage run error854f912
(registry) - registry: chown uid gid ordere642bb7
(registry-proxy) - registry-proxy: containerPort error8dfd029
(registry-proxy) - registry-proxy: chown uid gid orderbbea364
(storage) - minio: premission denied97deba1
(storage) - storage: node unimplemented errorb9bdeff
(storage) - storage: pd can not connect each other1edb10c
(controller) - controller: database convention over configuration1960cc3
(database) - database: database name convention over configuration06d1f5d
(imagebuilder) - imagebuilder: URL to Urlb8a8941
(passport) - passport: database convention over configuration8e9a199
(builder) - builder: upgrade controller-sdk-go4840151
(builder) - builder: use exec runner replace docker runner68ccfb1
(builder) - builder: canonical charts naming8f971cb
(builder) - builder: provide any additional service annotationsfe2c55d
(builder) - dockerfile: use drycc/base image2b5e706
(builder) - dockerfile: change user and workdir7a6c8d3
(builder) - builder: set gid uid to 1001fe494f7
(builder) - dockerfile: use uid gida7c8752
(builder) - builder: change nodes to pod affinityeb2e94c
(builder) - database: bump mc 2022.04.01.23.44.48cfaae66
(builder) - builder: use registry.drycc.cc replace docker.iod7d2890
(builder) - builder: change default imagebuilder registryecfdb19
(builder) - imagebuilder: change python-dev registry6da17f4
(builder) - builder: https://github.com/minio/minio/issues/143311a57e5b
(builder) - builder: https://github.com/minio/minio/issues/14331f1464fa
(builder) - builder: https://github.com/minio/minio/issues/13799b1e1c4f
(builder) - builder: use env replace creds volume71a4145
(builder) - builder: bump go.mod3567688
(builder) - builder: fine management affinity73ea38b
(builder) - builder: change storage to minio1f91321
(builder) - builder: use testify replace assertd148b9c
(builder) - builder: add check storage healthb768101
(builder) - builder: change initContainers1b3bec3
(builder) - builder: add replicas5cb0d61
(builder) - builder: upgrade to latest controller-sdk-go98b9d58
(builder) - builder: upgrade new require65817c3
(builder) - builder: change drycc.cc to www.drycc.cc4e3f9d0
(controller) - controller: add celery retry mechanismf6716fe
(controller) - controller: change cronjob nameeb60693
(controller) - controller: refine celery task priority66905e9
(controller) - controller: change manager authea20c41
(controller) - controller: remove start/stop api4c8fc80
(controller) - controller: improve tasks error handlingcf7402e
(controller) - controller: add blocklist api80f14dd
(controller) - controller: use get_user_model replace auth.Userffc7bb7
(controller) - controller: use JSONField replace ArrayField370df8c
(controller) - controller: add validate metric29084ce
(controller) - controller: use user id request manager api718fe12
(controller) - controller change urlpatterns order71f4042
(controller) - controller: measurements uses lowercase letterse5123ea
(controller) - controller: change resource unit to number18fee9a
(controller) - deps: bump celery from 5.1.2 to 5.2.2 in /rootfsffca6c1
(controller) - controller: use exec runner replace docker runner9ec12e1
(controller) - controller: simplify drone configuration4b4749e
(controller) - controller: set default CSRF_COOKIE_SECURE false2ef6338
(controller) - deps: bump django from 3.2.5 to 3.2.10 in /rootfsc7570d0
(controller) - deps: bump django from 3.2.10 to 3.2.11 in /rootfs8b17bc1
(controller) - controller: canonical charts namingc928fb0
(controller) - controller: use rabbitmq clusterf917185
(controller) - controller: provide any additional service annotations22a8f63
(controller) - deps: bump django from 3.2.11 to 3.2.12 in /rootfs3cc3b00
(controller) - dockerfile: use drycc/base imageee274f6
(controller) - controller: set venv profilece6b069
(controller) - controller: set gid uid to 10013a105d3
(controller) - dockerfile: use uid gid15f9b0e
(controller) - controller: code review01e6fd9
(controller) - controller: use passport user id893ee31
(controller) - oauth2: update user info pipline3028fb4
(controller) - user: set AnonymousUser username5daf82d
(controller) - controller: set worker_cancel_long_running_tasks_on_connection_loss61f2c53
(controller) - controller: change nodes to pod affinity88feb1d
(controller) - imagebuilder: python=3.10.4 rabbitmq=3.9.14914e03f
(controller) - controller: use registry.drycc.cc replace docker.ioa5bb548
(controller) - controller: change python-dev registry3ecdd7c
(controller) - controller: add a separate rabbitmqUrl configuration967cb11
(controller) - controller: remove APP_STORAGE473d2b5
(controller) - controller: use env replace creds volumee410d4c
(controller) - deps: bump django from 3.2.12 to 3.2.13 in /rootfsc6ef777
(controller) - controller: simplified passport config0fd3233
(controller) - controller: remove settings hardcodea64e99c
(controller) - controller: change passport config62aba25
(controller) - controller: set cronjob timezone to utc760b70b
(controller) - controller: change default ratio8dffc3a
(controller) - controller: fine management affinity26043c4
(controller) - controller: change default app storage608bd8d
(controller) - deps: bump django from 3.2.13 to 3.2.14 in /rootfs18ed0c2
(controller) - controller: remove conjob affinityadd6712
(controller) - controller: add volume expand support use patchcc1ad13
(controller) - controller: add startupProbe0e9a603
(controller) - controller: add clearsocial cronjobeb6f05d
(controller) - controller: change initContainers762c676
(controller) - controller: change replicasabd7e8c
(controller) - deps: bump django from 3.2.14 to 3.2.15 in /rootfs07fdf1b
(controller) - controller: remove database conn_max_ageef8e41f
(controller) - controller: add database replica check79143f2
(controller) - controller: upgrade new requirea624048
(controller) - controller: add app.refresh func annotationb22d367
(controller) - controller: optimize app refresh timingfe98f0c
(database) - database: use exec runner replace docker runner5e00c11
(database) - database: canonical charts namingd2cb860
(database) - database: disable huge_pages197d80d
(database) - database: add persistence1c3e645
(database) - database: provide any additional service annotations37730ab
(database) - dockerfile: use drycc/base image5014112
(database) - dockerfile: change entrypoint29b538e
(database) - database: change nodes to pod affinityc2bb074
(database) - database: bump python 3.10.4 and mc 2022.04.01.23.44.48077a4e9
(database) - database: use registry.drycc.cc replace docker.io560bdb9
(database) - database: change python-dev registry1e54b55
(database) - database: https://github.com/minio/minio/issues/14331d646672
(database) - database: https://github.com/minio/minio/issues/13799a6ac4e3
(database) - database: use env replace creds volume9618d87
(database) - database: fine management affinityb823273
(database) - database: change minio to storage7bd5a90
(database) - database: add check storage health20c6d96
(database) - database: fix storage run error8bde830
(database) - database: upgrade to pg 14.5a33b5e5
(fluentd) - fluentd: update pluginseed7a78
(fluentd) - fluentd: update filter kubernetes settingcc83dd8
(fluentd) - fluentd: update elasticsearch store setting and support exclude specific container logsba2feb2
(fluentd) - fluentd: use exec runner replace docker runnerd528676
(fluentd) - fluentd: simplify drone configurationdece82d
(fluentd) - fluentd: canonical charts naming4e0a802
(fluentd) - fluend: replace nsqd with redis15ceca0
(fluentd) - dockerfile: use drycc/base imagea7f619f
(fluentd) - dockerfile: change workdir9adf5ed
(fluentd) - database: bump fluentd 1.14.650c14c2
(fluentd) - fluentd: use registry.drycc.cc replace docker.io83171b1
(fluentd) - fluentd: change python-dev registryec83581
(fluentd) - fluentd: unified reids declaration07c63e2
(fluentd) - fluentd: upgrade fluentd 1.15.265df9be
(imagebuilder) - imagebuilder: update pack version66cab35
(imagebuilder) - imagebuilder: use dind replace go-dev0c82060
(imagebuilder) - imagebuilder: use exec runner replace docker runner8146da9
(imagebuilder) - imagebuilder: canonical charts naming7d97241
(imagebuilder) - dockerfile: use drycc/base image07e805c
(imagebuilder) - imagebuilder: change default buildpack8d1038d
(imagebuilder) - imagebuilder: upgrade podman to 4.0.162d3687
(imagebuilder) - imagebuilder: change workdir to /workspaceda8bfb0
(imagebuilder) - imagebuilder: change uid gid to 1001d44e3bc
(imagebuilder) - imagebuilder: upgrade stack5b0c7e6
(imagebuilder) - imagebuilder: use registry.drycc.cc replace docker.iof74cbf6
(imagebuilder) - imagebuilder: add defaultBuildpacksURL941d493
(imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/14331449be91
(imagebuilder) - imagebuilder: https://github.com/minio/minio/issues/1379963b0523
(imagebuilder) - imagebuilder: use env replace creds volume4e8a6e5
(imagebuilder) - imagebuilder: add imagebuilder config2d891f5
(imagebuilder) - imagebuilder: change minio to storageaddceda
(imagebuilder) - imagebuilder: upgrade new requirea6e569f
(imagebuilder) - imagebuilder: pack_build add –env-file parameter6191ff5
(influxdb) - influxdb: use exec runner replace docker runnerdc3f8c7
(influxdb) - influxdb: canonical charts naming6b5c819
(influxdb) - influxdb: new ingress style68b381d
(influxdb) - influxdb: provide any additional service annotationsea20eb8
(influxdb) - dockerfile: use drycc/base image64c0a71
(influxdb) - influxdb: set gid uid to 1001a709ca1
(influxdb) - influxdb: use DRYCC_UID DRYCC_GID env740dff0
(influxdb) - influxdb: use common affinity templatee035673
(influxdb) - influxdb: change nodes to pod affinityf1cefbd
(influxdb) - influxdb: use registry.drycc.cc replace docker.ioa00100e
(influxdb) - influxdb: fine management affinity9d165ef
(influxdb) - influxdb: add probebee7fff
(influxdb) - influxdb: upgrade to influxdb 2.4.0254914c
(logger) - logger: use exec runner replace docker runner8d91c68
(logger) - logger: canonical charts namingb6d2182
(logger) - logger: provide any additional service annotationsc35e59a
(logger) - dockerfile: use drycc/base imagea63c070
(logger) - logger: change workdir to /workspacea594b28
(logger) - logger: set gid uid to 10019a90e22
(logger) - dockerfile: use uid gid36493b4
(logger) - logger: use common affinity template897a3a5
(logger) - logger: change nodes to pod affinity03b32ab
(logger) - logger: use registry.drycc.cc replace docker.ioa50ba5f
(logger) - logger: change python-dev registry23187a3
(logger) - logger: unified reids declarationaaa129a
(logger) - logger: fine management affinitybe4f656
(logger) - logger: add replicas7c25459
(logger) - charts: add NetworkPolicy6810149
(logger) - logger: remove memory storagea918c50
(logger) - logger: add .vscode to .gitignorea415210
(logger) - logger: add log follow support59b1da3
(logger) - logger: upgrade new require27cc151
(monitor) - monitor: use exec runner replace docker runner07d6a9d
(monitor) - monitor: canonical charts naming1054357
(monitor) - monitor: use redis default porte3673df
(monitor) - monitor: remove nsqdfc9dd3e
(monitor) - monitor: new ingress style856a898
(monitor) - monitor: add default user env9857535
(monitor) - monitor: add random user38b5a04
(monitor) - grafana: oauth auto login5dfc579
(monitor) - monitor: upgrade versione121b5a
(monitor) - monitor: provide any additional service annotations84462a0
(monitor) - dockerfile: use drycc/base imageb9e8ce8
(monitor) - monitor: chore(imagebuilder): change uid gid to 100105ee8ab
(monitor) - dockerfile: use uid gide1fa68e
(monitor) - monitor: use common affinity templateb8f302b
(monitor) - monitor: change nodes to pod affinity4fc991f
(monitor) - database: bump telegraf 1.22.0 and grafana 8.4.521a2f6a
(monitor) - monitor: use registry.drycc.cc replace docker.ioacc976f
(monitor) - monitor: change python-dev registry62d76c1
(monitor) - monitor: unified reids declarationb3c57ad
(monitor) - monitor: optimize oauth2 configuration70af6b0
(monitor) - monitor: change passport config69f9a88
(monitor) - monitor: fine management affinity2fb278f
(monitor) - monitor: rename influxdb port17548ff
(monitor) - grafana: update dashborad69d7bbd
(monitor) - grafana: influx dashborad disk size75db1b0
(monitor) - monitor: upgrade new grafana/telegraf80504a1
(monitor) - grafana: update influx and redis dashboardf7078cb
(monitor) - monitor:chown use env91ae0dd
(passport) - passport: optimize login display2d3bbbc
(passport) - passport: change drycc logo59790a7
(passport) - passport: make user email uniquefaea034
(passport) - passport: use strtobool1fbf2bc
(passport) - passport: use yarn replace npm119cac8
(passport) - passport: use exec runner replace docker runnercff5062
(passport) - passport: set default CSRF_COOKIE_SECURE false9cc0210
(passport) - passport: canonical charts naming9ab3896
(passport) - passport: new ingress style259ccc9
(passport) - passport: provide any additional service annotationsaf1bbcd
(passport) - dockerfile: use drycc/base image9ae5373
(passport) - passport: set venv profile8f61090
(passport) - dockerfile: use uid gidfcaf72d
(passport) - passport: upgrade npm package546dcd5
(passport) - passport: add license4bda2d6
(passport) - passport: use minify73b0fd1
(passport) - passport: use common affinity template278fe7a
(passport) - passport: change nodes to pod affinity3cd93d3
(passport) - passport: add reactive370b493
(passport) - passport: add footer483cbd6
(passport) - passport: use h_captcha replace re_captcha3d1675e
(passport) - database: bump python 3.10.4 and node 16.14.286a7835
(passport) - passport: use registry.drycc.cc replace docker.io2d65355
(passport) - passport: change python-dev registry90c1444
(passport) - passport: unified reids declaration2e0e417
(passport) - passport: fix firefox footerad274be
(passport) - passport: use bulecssf986d8b
(passport) - passport: add main footer3e52867
(passport) - passport: dynamic settings for vue38adabc
(passport) - passport: change passport configf8d6b60
(passport) - passport: fine management affinity2cbd79d
(passport) - passport: remove database conn_max_age7122797
(passport) - passport: change drycc.cc to www.drycc.cc8cc84cd
(rabbitmq) - rabbitmq: use exec runner replace docker runnerf35930f
(rabbitmq) - rabbitmq: add rabbitmq cluster supportfbfa3ba
(rabbitmq) - rabbitmq: canonical charts namingca60701
(rabbitmq) - rabbitmq: use volumeClaimTemplatesfe5d1b4
(rabbitmq) - rabbitmq: add sharding support9c4ab97
(rabbitmq) - rabbitmq: provide any additional service annotations348a88a
(rabbitmq) - dockerfile: use drycc/base image2388be1
(rabbitmq) - rabbitmq: upgrade erlang to 24.2.2db2eaa5
(rabbitmq) - dockerfile: use uid gid772afd1
(rabbitmq) - rabbitmq: change to wait pid file2bfc25e
(rabbitmq) - rabbitmq: use common affinity template11d505e
(rabbitmq) - rabbitmq: change nodes to pod affinity69d63f1
(rabbitmq) - database: bump erlang 24.3.3 and rabbitmq 3.9.148380299
(rabbitmq) - rabbitmq: use registry.drycc.cc replace docker.iob3f69f1
(rabbitmq) - rabbitmq: add check rabbitmqLocaltion5327c76
(rabbitmq) - rabbitmq: fine management affinity5c66b5a
(rabbitmq) - rabbitmq: change probe27bebf9
(rabbitmq) - rabbitmq: add start-rabbitmq script86ee6a7
(rabbitmq) - rabbitmq: upgrade to rabbitmq 3.10.71f29683
(redis) - redis: use exec runner replace docker runnera5041fc
(redis) - redis: canonical charts naming64468c2
(redis) - redis: add redis persistencede5d753
(redis) - redis: provide any additional service annotationsf644639
(redis) - dockerfile: use drycc/base image98051d2
(redis) - redis: premission deniedbcb548e
(redis) - dockerfile: use uid gid524aa41
(redis) - redis: use common affinity template26c9466
(redis) - redis: change nodes to pod affinityb67d7a2
(redis) - redis: use registry.drycc.cc replace docker.io839ec50
(redis) - redis: use env replace creds volume237ca86
(redis) - redis: fine management affinitybdd968d
(redis) - redis: upgrade neew require8b2910f
(registry) - registry: use exec runner replace docker runnereedbe78
(registry) - registry: canonical charts naming0241615
(registry) - registry: provide any additional service annotations9b58da4
(registry) - dockerfile: use drycc/base imageab6acb7
(registry) - registry: change workdir to /workspacef368bf7
(registry) - registry: use DRYCC_UID DRYCC_GID envf4b9041
(registry) - registry: use common affinity templatec2e87ca
(registry) - registry: change nodes to pod affinityfeb6aba
(registry) - database: bump mc 2022.04.01.23.44.48956932b
(registry) - rregistry: use registry.drycc.cc replace docker.iodeda8d8
(registry) - registry: move registry-secret.yaml from workflow to registryf52c7bf
(registry) - registry: change python-dev registry007fe03
(registry) - registry: https://github.com/minio/minio/issues/14331d620c6d
(registry) - registry: https://github.com/minio/minio/issues/1379985e6b73
(registry) - registry: use env replace creds volume6a1155d
(registry) - registry: fine management affinity7b8ebae
(registry) - registry: change minio to storage1338951
(registry) - registry: add check storage health2fa769d
(registry) - registry: change probef187cbf
(registry) - registry: add replicas09d8a7b
(registry) - registry: upgrade to mc 2022.08.28.20.08.114b187b8
(registry-proxy) - registry-proxy: use exec runner replace docker runner29ffbbe
(registry-proxy) - registry-proxy: canonical charts naming6d783ba
(registry-proxy) - registry-proxy: remove use_cni8cf05cf
(registry-proxy) - dockerfile: use drycc/base image090e286
(registry-proxy) - registry-proxy: chore(imagebuilder): change uid gid to 10017cf6120
(registry-proxy) - registry-proxy: use DRYCC_UID DRYCC_GID env3a00697
(registry-proxy) - registry-proxy: use registry.drycc.cc replace docker.io30e69e8
(registry-proxy) - registry-proxy: add registry basic auth proxy942abce
(registry-proxy) - registry-proxy: upgrade to nginx 1.23.15ea3297
(storage) - minio: use exec runner replace docker runner8306add
(storage) - minio: canonical charts namingc917e9f
(storage) - minio: provide any additional service annotations042c732
(storage) - dockerfile: use drycc/base image7b47b82
(storage) - minio: change workdir to /workspace6f3531e
(storage) - minio: use DRYCC_UID DRYCC_GID env9795fb1
(storage) - minio: use common affinity templatea7b09c5
(storage) - minio: change nodes to pod affinity7607342
(storage) - database: bump mc 2022.04.01.23.44.48 and minio 2022.04.01.03.41.39ea2b2f1
(storage) - minio: use registry.drycc.cc replace docker.io445b501
(storage) - minio: https://github.com/minio/minio/issues/14331f19fbc7
(storage) - minio: use env replace creds volume8982e2e
(storage) - minio: use minio to distributed06bec73
(storage) - minio: fine management affinity9b8f006
(storage) - storage: remove assert59d64b9
(storage) - storage: change listen to POD_IP60044ee
(storage) - storage: add juicefs mount options189f944
(storage) - storage: remove volumeName302fe89
(storage) - storage: mv to minio dir6ec586d
(storage) - storage: change readinessProbee andlivenessProbe0e028df
(storage) - storage: add minio pdbcf9bd2d
(storage) - storage: add check storage health svc2dd5c9f
(storage) - storage: add volumeBindingModefa2effc
(storage) - storage: remove databaseBucketd166cc7
(storage) - charts: format network-policy named06bcce
(storage) - storage: upgrade to golang 1.19c2ca05c
(storage) - storage: upgrade new requireThese release notes for Drycc Workflow v1.5.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary.
+0f5f8e4
(builder) - builder: multi-platform supportf269d06
(builder) - build: add buildx supportjkjkk:q5e72fe8
(builder) - registry: use docker build25d8a4c
(builder) - docker: dealing with the change of docker in kubenetes 1.207a3e1c5
(builder) - charts: set the default chart version46b75ff
(builder) - builder: add cloud native buildpacks support2db2054
(builder) - builder: unified build model4b7f9d9
(builder) - builder: add initContainersb78c936
(controller) - token: add get token apibac52a5
(controller) - tasks: use celery replace nsqdb9b0c58
(controller) - build: add buildx support205dcb3
(controller) - influxdb: add influxdb clientff15849
(controller) - influxdb: upgrade to influxdb 2.x4016244
(controller) - controller: push data to influxfcfce2e
(controller) - workflow-manager: add workflow-manager support00e9bfb
(controller) - influxdb: review influxdb codedd644d5
(controller) - docker: dealing with the change of docker in kubenetes 1.20118278b
(controller) - charts: set the default chart version122a9cd
(controller) - oauth2: add oauth2 support559a5b6
(controller) - controller: use cncf buildpacks replace slugrunner96130e6
(controller) - charts: database configuration optimization of passport and controller2ea8508
(controller) - oauth: using passport authentication868c437
(database) - database: multi-platform supporteadd5da
(database) - build: add buildx supportb6eea4c
(database) - docker: dealing with the change of docker in kubenetes 1.2004a88db
(database) - charts: set the default chart version92ed309
(database) - database: add initContaineree6b78f
(fluentd) - build: add buildx supportf523e30
(fluentd) - docker: dealing with the change of docker in kubenetes 1.20ee47b53
(fluentd) - charts: set the default chart version80a51af
(influxdb) - influxdb: modify influxdb naming rulesfb10030
(influxdb) - influxdb: use influxdb v20e87ad8
(influxdb) - docker: dealing with the change of docker in kubenetes 1.209d10801
(influxdb) - charts: set the default chart versiond825c9f
(logger) - build: add buildx supportb139576
(logger) - docker: dealing with the change of docker in kubenetes 1.2088f84ea
(logger) - charts: set the default chart version5ccae3e
(logger) - dockerfile: remove chmod cmd193aefc
(logger) - logger: add initContainersbaee330
(minio) - minio: multi-platform supportad5d055
(minio) - build: add buildx support19868d4
(minio) - docker: dealing with the change of docker in kubenetes 1.204bd84b8
(minio) - charts: set the default chart version79d1f2f
(monitor) - database: multi-platform support88e5a7f
(monitor) - build: add buildx support5672e99
(monitor) - influxdb: modify influxdb naming rules8672103
(monitor) - influxdb: use influxdb v266cb4c8
(monitor) - docker: dealing with the change of docker in kubenetes 1.209576eb3
(monitor) - charts: set the default chart version30809c9
(monitor) - monitor: add initContainers70d140c
(nsqd) - nsqd: using self compiled nsq binary1073d4f
(nsqd) - nsqd: use GOPATH replace /goe498480
(nsqd) - build: add buildx supportcf9b7d5
(nsqd) - docker: dealing with the change of docker in kubenetes 1.20c335856
(nsqd) - charts: set the default chart versionefba713
(redis) - build: add buildx supportc7a3b53
(redis) - docker: dealing with the change of docker in kubenetes 1.204cdad7b
(redis) - charts: set the default chart version652b443
(registry) - registry: multi-platform support4060176
(registry) - registry: use docker build7102a03
(registry) - docker: dealing with the change of docker in kubenetes 1.206c8600d
(registry) - charts: set the default chart version33a51c9
(registry) - registry: add initContainersbef70dc
(registry-proxy) - build: add buildx supportd2319c1
(registry-proxy) - docker: dealing with the change of docker in kubenetes 1.2002fafed
(registry-proxy) - charts: set the default chart version5499c9a
(controller) - gunicorn: gunicorn not running06e9e88
(controller) - controller: error loading shared library01b5bd0
(controller) - controller: upgrade celery config6e32d55
(controller) - controller: fix update resources bug0e0d53f
(controller) - chart: set the domain depends certManagerEnabled2ac4ca8
(controller) - passport: error loading shared library libexpat.so.1a0dd517
(fluentd) - fluentd: drone build6eca2a3
(logger) - logger: golang lint63b0aa0
(registry) - drone: charts url error472cfcc
(controller) - controller organize README.md documentd9d6e29
(redis) - redis: delete links that do not exist1468f57
(controller) - controller: add command unittest9999bfd
(builder) - builder:replace the special wordscda8b58
(builder) - builder: remove docker keyword from chartsdc575dd
(builder) - builder: use imagebuilder replace dockerbuilderd3bb183
(builder) - docker: use the full name of registry5fe34d1
(builder) - travis: add DEV_REGISTRY7e36453
(builder) - CICD: use drone52b8d9d
(builder) - drone: add image_registries volumes65963f4
(builder) - k8s: add privileged to dindd345fcf
(builder) - LICENSE: revert modifications to Apache license7975c99
(builder) - drone: always pull image59633dd
(builder) - builder: modify launch imagebuild pod8d14e67
(builder) - builder: use Procfile in anywhere5357fa8
(builder) - go: bump go mod8d26ac0
(builder) - k8s: k8s deprecated api migration0af620d
(builder) - chars: change org to imageTagae84303
(builder) - builder: run imagebuider replace pod with job3b2c496
(builder) - builder: change docs website5679a4c
(builder) - builder: upgrade to golang1.17a214503
(controller) - controller:replace whitelist with allowlist375ddcc
(controller) - ps:drycc ps:list show autoscale numc32e409
(controller) - ldap: canot register when ldap is enabledc46580a
(controller) - controller:modify redis configfa9e87b
(controller) - chart:modify controller charts6f9fd08
(controller) - nsq: remove nsq994b2dc
(controller) - docker-buildx: add check-dockera720c3a
(controller) - controller: remove docker keyword from chartse9a5c84
(controller) - docker: use the full name of registrya26614a
(controller) - controller: add rabbitmq env3df229d
(controller) - controller: modify database config && remove redis port config && add env prefix with DRYCC257e94b
(controller) - controller: CELERY_BROKER use rabbitmq and modify celery-deployment cronjobf4d6ec3
(controller) - chart: pretty chart format63e6195
(controller) - influxdb: modify influxdb code0f6d408
(controller) - CICD: use drone87bad28
(controller) - python: upgrade to python3.9e8f7560
(controller) - volumes: modify mount summary6cf6c6b
(controller) - drone: add image_registries volumesa9397e8
(controller) - oauth: modify token Authenticationc7f8c8b
(controller) - deps: bump django from 2.2.14 to 2.2.18 in /rootfsa1a08aa
(controller) - deps: bump djangorestframework from 3.11.0 to 3.11.2 in /rootfsefd78b4
(controller) - deps: bump django from 2.2.18 to 2.2.20 in /rootfs649b044
(controller) - deps: bump django from 2.2.20 to 2.2.22 in /rootfs41b742b
(controller) - deps: bump django from 2.2.22 to 2.2.24 in /rootfs22ffe5d
(controller) - LICENSE: revert modifications to Apache licensec98b468
(controller) - drone: always pull image20e6edb
(controller) - chart: modify the problem of using buildpackdb16879
(controller) - controller: pretty pods list printba6f456
(controller) - test: pretty pods list print5fce4b7
(controller) - k8s: k8s deprecated api migratione9e0bcb
(controller) - oauth: using passport authentication0311172
(controller) - chars: change org to imageTag150eff1
(controller) - charts: update cert-manager api versionde8545a
(controller) - controller: update requirements1442207
(controller) - controller: using django native JSONFiledab4e836
(controller) - oauth: modify passport api5c54e06
(controller) - controller: eliminate pip warnings870328d
(controller) - controller: remove entrypoint5e5e6ae
(controller) - controller: upgrade celery config607778f
(controller) - controller: add initContainer23dc016
(controller) - chart: set the domain depends certManagerEnabledf3cf20b
(controller) - controller: remove default bash env73f2636
(controller) - controller: modify alpinelinux repositories498e9f2
(controller) - chart: change certManagerEnabled to boolean type27f5308
(controller) - passport: exclude cryptography370b75d
(controller) - controller: use sh env07585b4
(database) - postgres:replace the special words20172dc
(database) - database: remove docker keyword from chartsabb9b88
(database) - docker: use the full name of registrye72f58f
(database) - chart: modify the off-cluster databasea91f64f
(database) - travis: add DEV_REGISTRY614fb76
(database) - tests: use add-host replace linka3428f3
(database) - CICD: use drone239fef1
(database) - drone: add image_registries volumes42858e1
(database) - LICENSE: revert modifications to Apache licensed0fe850
(database) - drone: always pull image34a36ad
(database) - charts: Nn secret is generated during off-cluster064ccf4
(database) - database: create database9228992
(database) - chars: change org to imageTag9f7810c
(database) - database: upgrade to wal-g v1.105783f4
(fluentd) - fluentd:replace the special words0739809
(fluentd) - influxdb:replace monitor-influx with influxf02487c
(fluentd) - fluentd: remove docker keyword from charts2c96cc0
(fluentd) - docker: use the full name of registryb20c429
(fluentd) - charts: remove port config6dd0197
(fluentd) - travis: add DEV_REGISTRYc5bec51
(fluentd) - CICD: use dronef8524b7
(fluentd) - drone: add image_registries volumesa50878a
(fluentd) - LICENSE: revert modifications to Apache license14fe20e
(fluentd) - drone: always pull image4a2f660
(fluentd) - k8s: k8s deprecated api migrationde2dd91
(fluentd) - chars: change org to imageTaga9f1944
(fluentd) - fluentd: upgrade to fluentd1.147cb4e95
(influxdb) - influxdb: change username to user0fdc21b
(influxdb) - influxdb: remove docker keyword from chartsb2acddb
(influxdb) - influxdb: change default pathba88919
(influxdb) - influxdb: add check_env function9117401
(influxdb) - influxdb: modify init_influxdb has_bucket092a3e6
(influxdb) - chart: pod not readiness51de380
(influxdb) - travis: add DEV_REGISTRY66d7667
(influxdb) - docker: replace influxdb base image3aa3094
(influxdb) - CICD: use drone14b9c24
(influxdb) - drone: add image_registries volumes02b4cd1
(logger) - logger:replace the special words114b5d5
(logger) - reids: delete the logger prefix of redis639278a
(logger) - redis: remove logger from redis conf90195e2
(logger) - go: remove GOOS and GOARCH31e2e27
(logger) - logger: remove docker keyword from charts8fbd9fa
(logger) - docker: use the full name of registryb39df2d
(logger) - charts: remove redis\nsqd port config35d6d07
(logger) - travis: add DEV_REGISTRY69aabf5
(logger) - tests: remove docker linke916644
(logger) - CICD: use droned6872b7
(logger) - drone: add image_registries volumes37801da
(logger) - LICENSE: revert modifications to Apache licensecfb4b38
(logger) - drone: always pull image8bda3bf
(logger) - go: bump go mode13ebfc
(logger) - chars: change org to imageTag38e6d8d
(minio) - minio:replace the special wordsd6925dd
(minio) - minio: remove docker keyword from chartsd56bc39
(minio) - docker: use the full name of registrye4696cc
(minio) - travis: add DEV_REGISTRY70c5c79
(minio) - minio: use latest version773cf6c
(minio) - Makefile: remove DEV_REGISTRY ?=5ce5bc6
(minio) - CICD: use drone5da8be3
(minio) - drone: add image_registries volumesc1f0611
(minio) - LICENSE: revert modifications to Apache licenseb73f792
(minio) - drone: always pull image79d1c93
(minio) - go: bump go modc448899
(minio) - chars: change org to imageTag15ee49e
(minio) - minio: migrate deprecated warning9968a1a
(minio) - minio: upgrade to golang1.714fedd2
(monitor) - monitor:replace the special works52c431a
(monitor) - reids: delete the logger prefix of redis2c95b47
(monitor) - redis: remove logger from redis confda9bc56
(monitor) - monitor:remove influxdb53f47b9
(monitor) - grafana: use grafana docker image5bdb188
(monitor) - grafana: use grafana docker imagec0586dd
(monitor) - monitor: remove docker keyword from charts87d02b6
(monitor) - charts: add nodes and persistentvolumes rule1b5598f
(monitor) - monitor: modify grafana dashboard with FLUX and pretty config.tomlbcbc0d5
(monitor) - docker: use the full name of registry9418c9e
(monitor) - monitor: fix upload dashboard error and modify INFLUXDB input589f29a
(monitor) - travis: add DEV_REGISTRYf776f8a
(monitor) - CICD: use drone6ca3060
(monitor) - drone: add image_registries volumes6a9ffb2
(monitor) - LICENSE: revert modifications to Apache license45e41ed
(monitor) - drone: always pull image654d407
(monitor) - k8s: k8s deprecated api migration41e9b9c
(monitor) - chars: change org to imageTag99c10d3
(monitor) - charts: update cert-manager api version9bf83c4
(monitor) - oauth: user oauth passporta128f6d
(monitor) - chart: change certManagerEnabled to boolean type8f897fe
(monitor) - chart: set the domain depends certManagerEnabledba6d793
(nsqd) - README:update travis build status49879c4
(nsqd) - nsqd: minimum git clone codec5e2680
(nsqd) - nsqd: remove docker keyword from charts21dd17b
(nsqd) - docker: use the full name of registry7d86b3c
(nsqd) - charts: remove port configc073d95
(nsqd) - travis: add DEV_REGISTRY55c297c
(nsqd) - CICD: use drone165c2ae
(nsqd) - drone: add image_registries volumes9c6a1f8
(nsqd) - LICENSE: revert modifications to Apache license9283098
(nsqd) - drone: always pull image46acf8a
(nsqd) - k8s: k8s deprecated api migration43caf80
(nsqd) - chars: change org to imageTag6897471
(nsqd) - nsqd: use official image297bc05
(redis) - redis:replace the special wordsf5f8b5e
(redis) - reids: delete the logger prefix of redisaf7b657
(redis) - redis: change logger-redis to redis8dca154
(redis) - redis: remove logger from redis confeaeda2d
(redis) - redis: remove docker keyword from charts53c6358
(redis) - docker: use the full name of registryae37416
(redis) - charts: remove port confige985656
(redis) - travis: add DEV_REGISTRY423336a
(redis) - CICD: use dronebe64ab4
(redis) - drone: add image_registries volumes3bec735
(redis) - LICENSE: revert modifications to Apache license4f934f6
(redis) - drone: always pull image359b878
(redis) - chars: change org to imageTag83b8ac2
(registry) - workflow:replace the special words869b280
(registry) - registry: remove docker keyword from charts999c1e9
(registry) - docker: use the full name of registry5652da9
(registry) - travis: add DEV_REGISTRYcc8c6c2
(registry) - CICD: use dronec7bdbd0
(registry) - CICD: pretty .drone.yaml format5c55a38
(registry) - test: use add-host replace linkf8866f3
(registry) - drone: add image_registries volumes6c8292f
(registry) - LICENSE: revert modifications to Apache license1d50f2c
(registry) - drone: always pull imageefbca6d
(registry) - chars: change org to imageTag2eafc59
(registry-proxy) - registry-proxy: update nginx071bd86
(registry-proxy) - charts: upgrade k8s newer API versionsc72db96
(registry-proxy) - registry-proxy: change travis icon url63ffb92
(registry-proxy) - registry-proxy:replace the special works1d904a6
(registry-proxy) - registry-proxy: remove docker keyword from chartsc8200b1
(registry-proxy) - docker: use the full name of registryd3fa939
(registry-proxy) - travis: add DEV_REGISTRY5a8b353
(registry-proxy) - CICD: use drone703d05a
(registry-proxy) - drone: add image_registries volumesaa71db1
(registry-proxy) - LICENSE: revert modifications to Apache license710c126
(registry-proxy) - drone: always pull image2dcc5e6
(registry-proxy) - chars: change org to imageTagThese release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary.
+fc7d93f
(builder) - builder: use go-dev0c2159e
(builder) - builder: fmt code and add create_bucket script1b88340
(controller) - controller: remove deprecated apia92fdeb
(controller) - routable: ingress support routable1e3eab3
(controller) - maintenance: add maintenance support for ingress56b9dd0
(controller) - crt: support containerd-ctr5fc3b46
(controller) - controller: add ephemeral-storage restrictiond677e52
(controller) - controller: add a volume command5f1323a
(controller) - controller:drycc run cmd add –mount para74c36a5
(controller) - tasks: add distributed async task139c3ca
(controller) - tasks: change nsq reader to asyncf237d74
(controller) - controller:add drycc resource cmd41b46d0
(controller) - controller:add drycc resource cmd improvementc26f7d8
(controller) - controller: add LimitRanges support45b5d1b
(controller) - users: add users status api4e16f9b
(controller) - ps:add ps:stop/start commandc659fa9
(controller) - k8s: add k8s cluster domain31a625d
(controller) - ps:add ps:stop/start command00a779a
(fluentd) - fluentd: support containerd log formatf3f1bd4
(fluentd) - nsqd: add stateless nsqd cluster supportdb7147c
(fluentd) - mirrors: delete aliyun mirrors689c12e
(logger) - nsqd: add stateless nsqd cluster support78ccc5d
(logger) - redis: add redis client cluster support9843f2c
(logger) - k8s: add k8s cluster domain6ba122e
(minio) - minio: add pvc support6973550
(monitor) - monitor: add ingress for monitorcd73305
(monitor) - charts: add volumeName support4769fe9
(monitor) - nsqd: add stateless nsqd cluster support87806df
(monitor) - k8s: add k8s cluster domain4db40c4
(nsqd) - nsqd: add stateless nsqd cluster supportb6f3d4f
(nsqd) - nsqd: add stateless nsqd cluster support74b85bb
(redis) - redis: change redis to statefulsetff98b50
(slugbuilder) - slugbuilder: delete build hookb201c2f
(slugbuilder) - buildpacks: use drycc buildpacks0ec042d
(builder) - test: fix test case error4fb113b
(builder) - build: base image replace by alpine443df48
(builder) - minio: fix not bucket error3dab5b0
(builder) - minio: create bucket error734fca6
(controller) - autoscale: Fix for autoscale on k8s-1.9+ without breaking manual scalinga7dcd10
(controller) - controller: test pass93f0f2e
(controller) - controller: fix migrations error4724375
(controller) - controller: fix test error7bacf29
(controller) - charts: fix clusterrole90957f7
(controller) - pod: sort events error440b13e
(controller) - controller: review table structure0a470a6
(controller) - controller: bump tornado 5.1.1e39218b
(controller) - pynsq: no current event loop in thread1d8630e
(controller) - tests: fix test_task.py run error1ff1202
(controller) - controller: fix test cased8c0da3
(controller) - settings: fix env name6d8fd36
(database) - 003_restore_from_backup.sh: ignore script exit 1e0394a9
(database) - minio: fix not bucket errorf35f252
(database) - mc: fix create_bucket error74d6886
(database) - postgres: recovery mode not rune50d0c1
(dockerbuilder) - caddy: fix caddy not startf3bec7a
(fluentd) - influxdb: fix influxdb host and portbc19f27
(fluentd) - charts: skipped value for daemon_environment: Not a table338d623
(logger) - logger: logger not run in alpine7788302
(minio) - minio: bump minio version619eed0
(minio) - fix: use go mod replace dep3b42122
(monitor) - monitor: fix host error67998ef
(monitor) - influxdb: replace drycc-monitor-influxapi to drycc-monitor-influx-api2cc361c
(registry) - registry: fix test case548297a
(registry) - minio: fix not bucket error5412ddb
(registry) - minio: create bucket errord0d629e
(slugbuilder) - slugbuilder:fix normalize_storage pathd76ecbe
(slugbuilder) - slugbuilder: use v3 apic505e18
(slugbuilder) - shellcheck: SC2039c893a17
(builder) - builder: fmt codebba5795
(controller) - controller: format coded36082b
(controller) - controller: fix pep866026f2
(controller) - resource: standardize the naming of resource03d7e2c
(controller) - servicecatalog: change servicecatalog to svcat49dbb6d
(controller) - controller: flake8 upgradecbfc108
(monitor) - monitor: format charts and dashboardee85954
(slugbuilder) - slugbuilder: use shellcheck3afed2e
(slugbuilder) - docker: simplify dockerfile36b7f68
(slugrunner) - docker: simplify dockerfile61bb0ef
(builder) - aws: upgrade aws sdk version0f2e074
(builder) - chore: use go mode replace depe9a2219
(builder) - builder: delete glide upbb8c518
(builder) - registry: del quay.iofa6d02f
(builder) - builder: upgrade go.sum9d61e8d
(builder) - build: upgrade go.modd763a98
(builder) - charts: upgrade k8s newer API versionsd1bc1aa
(builder) - pkg: upgrade to new drycc/pkg02b1e98
(builder) - builder: update go mod8e17d65
(builder) - builder: change alpine repositoriesf32b723
(builder) - mirrors: delete aliyun mirrorse33dc61
(builder) - minio: use bin mc replace docker images3ab4f1c
(builder) - builder: update controller-sdk-gob2adfac
(builder) - heroku: remove heroku-16 supportf429ac8
(builder) - builder: set GIT_LOCK_TIMEOUT to 30 minutes7197c83
(builder) - go.mod:upgrade require pkg controller-sdk-go5f3e22d
(controller) - deps: bump django from 1.11.21 to 1.11.22 in /rootfs1db645a
(controller) - deps: bump django from 1.11.22 to 1.11.23 in /rootfsfbe8067
(controller) - deps: bump django from 1.11.23 to 1.11.29 in /rootfs537d667
(controller) - registry: del quay.ioa23c65b
(controller) - deps: update all deps to the latest version546337e
(controller) - charts: upgrade k8s newer API versions06023f8
(controller) - workflow-manager: del workflow-managerbba5736
(controller) - controller: change cluster-issuer location6c43661
(controller) - Certificatechange cluster-issuer location39a4728
(controller) - controller:change cluster-issuer location del controller-cluster-issuer.yaml9e96d3f
(controller) - Certificate:upgrade version cert-manager.io/v1alpha28e68049
(controller) - docker: use INDEX_URL replace index.docker.io8fda205
(controller) - cert_manager: change cert_manager_enabled to global6fefb6d
(controller) - charts: change platform_domain to global064b2ad
(controller) - maintenance: remove maintenance supportb8797c9
(controller) - workflow: remove namespace1b20d76
(controller) - quota: add kube quota configd780075
(controller) - pod: add pod default resources support3d72c08
(controller) - rename: rename ingress name0aa6ab9
(controller) - mirrors: delete aliyun mirrors7533a65
(controller) - heroku: remove heroku-16 supporte5a885d
(controller) - controller:check mount volume path9014e74
(controller) - test: optimization Dockerfile.test0b6ebb2
(controller) - tasks: change apply_async parameters835f009
(controller) - wsgi: add tornado 6 support67a4ad7
(controller) - utils: use threads replace asyncioa28949b
(controller) - ldap: add AUTH_LDAP_USER_FLAGS_BY_GROUPa903209
(controller) - charts: add custom controller environment variables supporte0e783e
(controller) - ldap: change filter styled760825
(controller) - scheduler: remove debug loga25928e
(controller) - wsgi: remove a wsgi.py file7b2696e
(controller) - log: disable nsq.client info log8d5c07b
(controller) - charts: add default environment025f4a2
(controller) - controller: change quota nameebda60e
(controller) - controller: review pvc code8832ba9
(controller) - controller: change status\binding model type and mount path check container_types7148d04
(controller) - controller: add overcommit cpu and ram support4d2087c
(controller) - limits: modify limits unit verificationaf36970
(controller) - api: check cpu/memory range for api329355b
(controller) - volumes: modify the volume size9dfee09
(controller) - LimitRanges: modify the default limits5205bca
(controller) - controller: improve the details of certificate7ebecdf
(database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Z6415e2c
(database) - postgres: upgrade to pg1312e6806
(database) - charts: upgrade k8s newer API versionsd294509
(database) - minio: use canary minio test1bad02e
(database) - mirrors: delete aliyun mirrorsd51420b
(database) - minio: use bin mc replace docker images4133d05
(dockerbuilder) - dockerbuilder: update caddy and kaniko6b4dd18
(dockerbuilder) - minio: use bin mc replace docker images6df9b7c
(fluentd) - deps-dev: update rake requirement from ~> 10.0 to ~> 12.3c2490f8
(fluentd) - fluentd: upgrade fluentdbe4a56a
(fluentd) - fluentd: add Gemfile.lock2237f75
(fluentd) - charts: upgrade k8s newer API versionsc574065
(fluentd) - charts: upgrade k8s newer API versions52b8084
(fluentd) - router: delete obsolete router code3b3cceb
(fluentd) - fluentd: remove manifests dir25c6702
(fluentd) - nsqd: change var namebd571be
(fluentd) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS72aa4e6
(fluentd) - influxdb: change influxdb service namebd61903
(logger) - logger: use go mod replace dep69c63a1
(logger) - logger: update go.mod3aa9cd7
(logger) - registry: del quay.iof058496
(logger) - nsqd: change var name6d9787c
(logger) - nsqd: change DRYCC_NSQD_ADDRESSES to DRYCC_NSQD_ADDRS85ed307
(logger) - logger: standard namingd88e7b6
(minio) - minio: update minio api to v743715d2
(minio) - minio: upgrade minio0e1239b
(minio) - minio: use docker.io replace quay.iof7f047b
(minio) - registry: del quay.ioafa7128
(minio) - build: upgrade go.modaff2db5
(minio) - charts: upgrade k8s newer API versions4547f14
(minio) - pkg: upgrade to new drycc/pkg2769b85
(minio) - minio: use bin mc replace docker images35dde8d
(monitor) - monitor: update grafana influxdb telegraf9e3a949
(monitor) - charts: upgrade k8s newer API versions6af0432
(monitor) - workflow-manager: remove workflow-manager0611c07
(monitor) - router: delete obsolete router codebe04824
(monitor) - cert_manager: change cert_manager_enabled to global3780165
(monitor) - charts: change platform_domain to global50b04e1
(monitor) - influxdb: remove influxdb admin ui6ab4d68
(monitor) - influxdb: remove unuse portf1510bd
(monitor) - monitor: update grafana dashboard,telegraf inputs.kubernetesf36de2c
(monitor) - pvc: upgrade to new formatfc78a0a
(monitor) - workflow: remove namespacee85890f
(monitor) - monitor: monitoring nsqd and redis separately694f6b1
(monitor) - mirrors: delete aliyun mirrors4aea36a
(monitor) - grafana: add ldap support for grafana68fc30f
(nsqd) - nsq: update nsq16f32aa
(nsqd) - charts: upgrade k8s newer API versions04db389
(redis) - reids: update to redis 63f01bab
(redis) - charts: upgrade k8s newer API versions647e4be
(registry) - registry: del quay.io0bbce99
(registry) - charts: upgrade k8s newer API versionsa982b50
(registry) - minio: use bin mc replace docker imagese088da3
(registry-proxy) - ingress: renmae use_native_ingress to use_ingress7e88337
(registry-proxy) - nginx: upgrade nginx to mainline7204d72
(registry-proxy) - registry: optimizing variable naming2eafc59
(registry-proxy) - registry-proxy: update nginx071bd86
(registry-proxy) - charts: upgrade k8s newer API versionsc72db96
(registry-proxy) - registry-proxy: change travis icon urlca9f962
(slugbuilder) - slugbuilder: del BUILDPACK_URL support1b74dd5
(slugbuilder) - slugbuilder: add heroku-20 support54d4ad2
(slugbuilder) - slugbuilder: del quay.ioa78f37e
(slugbuilder) - slugbuilder: add heroku-20 stack94ac94a
(slugbuilder) - minio: use bin mc replace docker images53b4b8b
(slugbuilder) - slugbuilder: modify stack priority58e2bd2
(slugbuilder) - dockerfile: add WORKDIR /tmpb29cd04
(slugbuilder) - slugbuilder: add pre_build.sh9d319f6
(slugbuilder) - slugbuilder: silent mc command outputd1ec3c9
(slugbuilder) - heroku: remove heroku-16 support5048534
(slugbuilder) - slugbuilder: use drycc stack-imagesa116537
(slugrunner) - slugrunner: add heroku-20 supporta1196bf
(slugrunner) - slugrunner: del quay.io64c96d7
(slugrunner) - slugrunner: add heroku-20 stackcc3e226
(slugrunner) - minio: use bin mc replace docker images9130bde
(slugrunner) - shellcheck: shellcheck installer4ea33e1
(slugrunner) - slugrunner: modify stack priority5514e8b
(slugrunner) - heroku: remove heroku-16 supportbe829fb
(slugrunner) - slugrunner: use drycc stack-imagese1e06be
(slugrunner) - slugrunner: remove Dockerfile.heroku-16These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.2.0, please refer to the following change summary.
+9c7cceb
(builder) - builder: add app config to env7fe44fa
(controller) - docker: docker timeout must be an int, float or Noneb196550
(controller) - controller: revert release.check_image_access for nowcc3ec13
(workflow-manager) - glide: bump goautonegef932c4
(builder) - controller-sdk-go: upgrade controller-sdk-go4654cf6
(controller) - django-rest-framework: upgrade to 3.9.314121f1
(controller) - deps: bump djangorestframework from 3.9.3 to 3.9.4 in /rootfs385acdc
(controller) - deps: bump django from 1.11.20 to 1.11.21 in /rootfsfa312bb
(database) - postgres: set max_connections = 10247ebecdf
(database) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb8878f6
(dockerbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb097451
(fluentd) - fluent: upgrade fluent to v1.44341f9a
(minio) - mc: upgrade mc and minioc1ee2a4
(monitor) - monitor: remove copyrights.tar.gz9854260
(registry) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zacc5627
(slugbuilder) - slugbuilder: internal support for multi buildpackd58907e
(slugbuilder) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27Zb39a0c2
(slugrunner) - mc: upgrade mc to RELEASE.2019-05-23T01-33-27ZThese release notes for Drycc Workflow v1.2.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.1.0, please refer to the following change summary.
+e5584e3
(controller) - controller: add STACK supportad34dc1
(dockerbuilder) - kaniko: use kaniko replace docker-pyb81430e
(dockerbuilder) - dockerbuilder: change image to image.json format60dde96
(slugbuilder) - slugbuilder: add STACK supportfe8b6e5
(slugrunner) - slugrunner: add STACK support942f050
(builder) - registry: remove env DRYCC_REGISTRY_PROXY_PORTff7a16f
(builder) - registry: remove ecr and gcr registryad13683
(builder) - builder: change DRYCC_BUILD_TYPE to DRYCC_STACK6def637
(builder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY5044e22
(builder) - registry: remove registry_secret_prefix2ea39cc
(builder) - controller-go-sdk: upgrade controller-go-sdk6aee0d7
(builder) - registry: optimizing variable namingf9c62d9
(controller) - domain: added reserved domain checkf5a135b
(controller) - migrations: clean old migrations4369b2c
(controller) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY1057ca5
(controller) - registry: remove registry_secret_prefixd114b3e
(controller) - docker: update docker clientedbe963
(dockerbuilder) - dockerfile: change base image to alpinefb35baf
(dockerbuilder) - registry: rename DRYCC_REGISTRY_SERVICE to DRYCC_REGISTRY_PROXY946dbf6
(dockerbuilder) - docker: remove insecure support628d853
(dockerbuilder) - proxy: add registry proxyff27cbd
(registry) - env: remove unused env7204d72
(registry-proxy) - registry: optimizing variable naming01.05.2024 in Release
+less than a minute
+Workflow ## v1.7.7 -> v1.7.8 Releases builder v1.6.0 -> v1.7.0 controller v1.8.0 -> v1.9.0 workflow-cli v1.6.0 -> v1.7.0 Features 384c7ee (builder) - domain: add procfile_type 26c8c7f (controller) - domain: add procfile_type bd49789 …
+ +30.04.2024 in Release
+6 minute read
+Workflow ## v1.7.6 -> v1.7.7 Releases builder v1.5.1 -> v1.6.0 controller v1.7.0 -> v1.8.0 database v1.2.1 -> v1.3.0 passport v1.2.0 -> v1.3.0 imagebuilder v1.1.1 -> v1.2.0 fluentbit v0.0.1 -> v0.0.2 logger v1.3.3 -> v1.3.4 …
+ +27.02.2024 in Release
+less than a minute
+Workflow ## v1.7.5 -> v1.7.6 Releases storage v0.0.4 -> v0.0.5 Maintenance 6cb63b6 (storage) - seaweedfs: bump version 3.63
+ +27.02.2024 in Release
+2 minute read
+These release notes for Drycc Workflow v1.7.5 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.4, please refer to the following change summary. …
+ +29.01.2024 in Release
+2 minute read
+These release notes for Drycc Workflow v1.7.2 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.7.1, please refer to the following change summary. …
+ +08.12.2023 in Release
+10 minute read
+These release notes for Drycc Workflow v1.7.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.6.0, please refer to the following change summary. …
+ +21.10.2022 in Release
+16 minute read
+These release notes for Drycc Workflow v1.6.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.5.0, please refer to the following change summary. …
+ +06.10.2022 in Release
+11 minute read
+These release notes for Drycc Workflow v1.5.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary. …
+ +06.10.2021 in Release
+9 minute read
+These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.4.0, please refer to the following change summary. …
+ +06.10.2020 in Release
+2 minute read
+These release notes for Drycc Workflow v1.3.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.2.0, please refer to the following change summary. …
+ +06.10.2019 in Release
+2 minute read
+These release notes for Drycc Workflow v1.2.0 provide an overview of the release and document the known issues with Drycc Workflow and its flavours. For details of the changes applied since v1.1.0, please refer to the following change summary. …
+ +Drycc is an open source project that anyone in the community can use, improve, and enjoy. We'd love you to join us! Here's a few ways to find out what's happening and get involved.
+ +Using or want to use Drycc? Find out more here:
+ +If you want to get more involved by contributing to Drycc, join us here:
+ ++ You can find out how to contribute to Drycc in our + Contribution Guidelines. +
+Drycc is an open source project that anyone in the community can use, improve, and enjoy. We'd love you to join us! Here's a few ways to find out what's happening and get involved.
+ +Using or want to use Drycc? Find out more here:
+ +If you want to get more involved by contributing to Drycc, join us here:
+ ++ You can find out how to contribute to Drycc in our + Contribution Guidelines. +
++This is the multi-page printable view of this section. +Click here to print. +
+A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).
+ +Drycc Workflow is an open source container cloud platform.
+Usually we also call it Container as a Service(CaaS) that adds a developer-friendly layer +to any Kubernetes cluster, making it easy to deploy and manage applications.
+Drycc Workflow includes capabilities for building and deploying from source via git push
, simple
+application configuration, creating and rolling back releases, managing domain names and SSL
+certificates, providing seamless edge routing, aggregating logs, and sharing applications with
+teams. All of this is exposed through a simple REST API and command line interface.
To get started with Workflow, follow our Quick Start guide.
+Take a deep dive into Drycc Workflow in our Concepts, Architecture, and +Components sections.
+Feel like contibuting some code or want to get started as a maintainer? Pick an issue tagged as an +easy fix or help wanted and start contributing!
+ +Get started with Drycc Workflow in three easy steps.
+This guide will help you set up a cluster suitable for evaluation, development and testing. When you are ready for staging and production, view our production checklist.
+For the quickstart we will install Drycc Workflow.
+For the quickstart we will install Drycc Workflow CLI.
+Last but not least, login and deploy your first application.
+ +If you have a pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop. Then this chapter is very suitable for you.
+Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:
+If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.
+Some basic software needs to be installed before installing drycc workflow.
+K8s requires a large number of ports. If you are not sure what they are, please close the local firewall or open these ports. +At the same time, because k8s you need system time, you need to ensure that the system time is correct.
+The command used to install a NFSv4 client differs depending on the Linux distribution.
+For Debian and Ubuntu, use this command:
+$ apt-get install nfs-common
+
For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:
+$ yum install nfs-utils
+
For Debian and Ubuntu, use this command:
+$ apt-get install curl
+
For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:
+$ yum install curl
+
Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.
+This configuration only contains the minimum requirements that can meet the operation.
+Drycc performance depends on the performance of the database. To ensure optimal speed, we recommend using an SSD when possible. Disk performance will vary on ARM devices utilizing an SD card or eMMC.
+Drycc needs a root domain name under your full control and points this domain name to the server to be installed.
+Suppose there is a wildcard domain pointing to the current server to install drycc, which is the name *.dryccdoman.com
.
+We need to set the PLATFORM_DOMAIN
environment variables before installation.
$ export PLATFORM_DOMAIN=dryccdoman.co
+
Of course, if it is a test environment, we can also use nip.io
, an IP to domain name service.
+For example, your host IP is 59.46.3.190
, we will get the following domain name 59.46.3.190.nip.io
$ export PLATFORM_DOMAIN=59.46.3.190.nip.io
+
Before installation, please make sure whether your installation environment is a public network. +If it is an intranet environment and there is no public IP, you need to disable the automatic certificate.
+$ export CERT_MANAGER_ENABLED=false
+
Then you can use the installation script available at https://www.drycc.cc/install.sh to install drycc as a service on systemd and openrc based systems.
+$ curl -sfL https://www.drycc.cc/install.sh | bash -
+
!!! important +If you are in China, you need to use mirror acceleration:
+```
+$ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash -
+```
+
+Node can be a simple agent or a server; Server has the function of agent. Multiple servers have high availability, but the number of servers should not +exceed 7 at most. There is no limit to the number of agents.
+$ cat /var/lib/rancher/k3s/server/node-token
+K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa
+
We assume that the IP address of the cluster master is 192.168.6.240
, in that way.
$ export K3S_URL=https://192.168.6.240:6443
+$ export K3S_TOKEN="K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa"
+
!!! important +If you are in China, you need to use mirror acceleration:
+```
+$ export INSTALL_DRYCC_MIRROR=cn
+```
+
+$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent
+
When using this method to install drycc, the following environment variables can be used to configure the installation:
+ENVIRONMENT VARIABLE | +DESCRIPTION | +
---|---|
PLATFORM_DOMAIN | +Required item, specify drycc’s domain name | +
DRYCC_ADMIN_USERNAME | +Required item, specify drycc’s admin username | +
DRYCC_ADMIN_PASSWORD | +Required item, specify drycc’s admin password | +
CERT_MANAGER_ENABLED | +Whether to use automatic certificate. It is false by default |
+
CHANNEL | +By default, stable channel will be installed. You can also specify testing |
+
REGISTRY_FILE | +The config.yaml file path used by k3s containers registry |
+
KUBERNETES_SERVICE_HOST | +Set with the HOST of the loadbalancer that was in front of kube-apiserver | +
KUBERNETES_SERVICE_PORT | +Set with the PORT of the loadbalancer that was in front of kube-apiserver | +
METALLB_CONFIG_FILE | +The metallb config file path, layer 2 network is used by default | +
INSTALL_DRYCC_MIRROR | +Specify the accelerated mirror location. Currently, only cn is supported |
+
BUILDER_REPLICAS | +Number of builder replicas to deploy | +
CONTROLLER_API_REPLICAS | +Number of controller api replicas to deploy | +
CONTROLLER_CELERY_REPLICAS | +Number of controller celery replicas to deploy | +
CONTROLLER_WEBHOOK_REPLICAS | +Number of controller webhook replicas to deploy | +
CONTROLLER_APP_RUNTIME_CLASS | +RuntimeClass is a feature for selecting the container runtime configuration. | +
CONTROLLER_APP_STORAGE_CLASS | +StorageClass allocated by drycc volumes ; default storageClass is used by default |
+
REDIS_REPLICAS | +Number of redis replicas to deploy | +
REDIS_PERSISTENCE_SIZE | +The size of the persistence space allocated to redis , which is 5Gi by default |
+
REDIS_PERSISTENCE_STORAGE_CLASS | +StorangeClass of redis ; default storangeclass is used by default |
+
STORAGE_CSI_STATEFULSET_REPLICAS | +Number of storage csi controller replicas to deploy | +
STORAGE_MAINNODE_TIPD_REPLICAS | +Number of storage mainode tipd replicas to deploy | +
STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE | +The size of the persistence space allocated to mainnode tipd , which is 10Gi by default |
+
STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode tipd ; default storangeclass is used by default |
+
STORAGE_MAINNODE_WEED_REPLICAS | +Number of storage mainode weed replicas to deploy | +
STORAGE_MAINNODE_WEED_PREALLOCATE | +Preallocate disk space for volumes, false is used by default |
+
STORAGE_MAINNODE_WEED_SIZE_LIMIT_MB | +Master stops directing writes to oversized volumes, 30000 is used by default |
+
STORAGE_MAINNODE_WEED_DEFAULT_REPLICATION | +default replication type if not specified, which is 000 by default |
+
STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to mainnode weed , which is 10Gi by default |
+
STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode weed ; default storangeclass is used by default |
+
STORAGE_METANODE_TIKV_REPLICAS | +Number of storage metanode tikv replicas to deploy | +
STORAGE_METANODE_TIKV_PERSISTENCE_SIZE | +The size of the persistence space allocated to metanode tikv , which is 10Gi by default |
+
STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode tikv ; default storangeclass is used by default |
+
STORAGE_METANODE_WEED_REPLICAS | +Number of storage metanode weed replicas to deploy | +
STORAGE_METANODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to metanode weed , which is 10Gi by default |
+
STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode weed ; default storangeclass is used by default |
+
STORAGE_DATANODE_WEED_REPLICAS | +Number of storage datanode weed replicas to deploy | +
STORAGE_DATANODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to datanode weed , which is 20Gi by default |
+
STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of datanode weed ; default storangeclass is used by default |
+
MONITOR_GRAFANA_PERSISTENCE_SIZE | +The size of the persistence space allocated to monitor.grafana , which is 5Gi by default |
+
MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS | +StorangeClass of monitor grafana; default storangeclass is used by default |
+
LOGGER_REPLICAS | +Number of logger replicas to deploy | +
RABBITMQ_REPLICAS | +Number of rabbitmq replicas to deploy | +
RABBITMQ_PERSISTENCE_SIZE | +The size of the persistence space allocated to rabbitmq , which is 5Gi by default |
+
RABBITMQ_PERSISTENCE_STORAGE_CLASS | +StorangeClass of rabbitmq ; default storangeclass is used by default |
+
DATABASE_REPLICAS | +Number of database replicas to deploy | +
DATABASE_PERSISTENCE_SIZE | +The size of the persistence space allocated to database , which is 5Gi by default |
+
DATABASE_PERSISTENCE_STORAGE_CLASS | +StorangeClass of database ; default storangeclass is used by default |
+
TIMESERIES_REPLICAS | +Number of timeseries replicas to deploy | +
TIMESERIES_PERSISTENCE_SIZE | +The size of the persistence space allocated to timeseries , which is 5Gi by default |
+
TIMESERIES_PERSISTENCE_STORAGE_CLASS | +StorangeClass of timeseries ; default storangeclass is used by default |
+
PASSPORT_REPLICAS | +Number of passport replicas to deploy | +
REGISTRY_REPLICAS | +Number of registry replicas to deploy | +
HELMBROKER_REPLICAS | +Number of helmbroker api replicas to deploy | +
HELMBROKER_CELERY_REPLICAS | +Number of helmbroker celery replicas to deploy | +
HELMBROKER_PERSISTENCE_SIZE | +The size of the persistence space allocated to helmbroker , which is 5Gi by default |
+
HELMBROKER_PERSISTENCE_STORAGE_CLASS | +StorangeClass of helmbroker ; default storangeclass is used by default |
+
PROMETHEUS_SERVER_RETENTION | +Prometheus data retention period (default if not specified is 15 days) | +
PROMETHEUS_SERVER_PERSISTENCE_SIZE | +The size of the persistence space allocated to prometheus-server , which is 10Gi by default |
+
PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS | +StorangeClass of prometheus-server ; default storangeclass is used by default |
+
K3S_DATA_DIR | +The config of k3s data dir; If not set, the default path is used | +
ACME_SERVER | +ACME Server url, default use letsencrypt | +
ACME_EAB_KEY_ID | +The key ID of which your external account binding is indexed by the external account | +
ACME_EAB_KEY_SECRET | +The key Secret of which your external account symmetric MAC key | +
Since the installation script will install k3s, other environment variables can refer to k3s installation environment variables.
+If you installed drycc using an installation script, you can uninstall the entire drycc using this script.
+$ curl -sfL https://www.drycc.cc/uninstall.sh | bash -
+
+The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. +Use the CLI to create and configure and manage applications.
+Install the drycc
client for Linux or Mac OS X with:
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+
!!! important +Users in Chinese mainland can use the following methods to speed up installation:
+```
+$ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash -
+```
+
+Others please visit: https://github.com/drycc/workflow-cli/releases
+The installer places the drycc
binary in your current directory, but you
+should move it somewhere in your $PATH:
$ sudo ln -fs $PWD/drycc /usr/local/bin/drycc
+
or:
+$ sudo mv $PWD/drycc /usr/local/bin/drycc
+
Check your work by running drycc version
:
$ drycc version
+v1.1.0
+
Update workflow cli to latest release.
+drycc update
+
!!! note +Note that version numbers may vary as new releases become available
+ +Drycc workflow requires a wildcard DNS record to dynamically map app names to the router.
+User should already have DNS set up pointing to their known host. The $hostname
value can be calculated by prepending drycc.
to the value set in global.platformDomain
.
Workflow use the passport component to create and authorize users.
+If you already have an account, use drycc login
to authenticate against the Drycc Workflow API.
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+
Or you can login with username and password
+$ drycc login http://drycc.example.com --username=demo --password=demo
+Configuration file written to /root/.drycc/client.json
+
Drycc Workflow supports three different types of applications, Buildpacks, +Dockerfiles and Container Images. Our first application will be a simple Container +Image-based application, so you don’t have to wrestle with checking out code.
+Run drycc create
to create a new application on Drycc Workflow. If you do not
+specify a name for your application, Workflow automatically generates a
+friendly (and sometimes funny) name.
$ drycc create --no-remote
+Creating Application... done, created proper-barbecue
+If you want to add a git remote for this app later, use `drycc git:remote -a proper-barbecue`
+
Our application has been created and named proper-barbecue
. As with the
+drycc
hostname, any HTTP traffic to proper-barbecue
will be automatically
+routed to your application pods by the edge router.
Let’s use the CLI to tell the platform to deploy an application and then use curl to send a request to the app:
+$ drycc pull drycc/example-go -a proper-barbecue
+Creating build... done
+$ curl http://proper-barbecue.$hostname
+Powered by Drycc
+
!!! note
+If you see a 404 error, make sure you specified your application name with -a <appname>
!
Workflow’s edge router knows all about application names and automatically
+sends traffic to the right application. The router sends traffic for
+proper-barbecue.104.197.125.75.nip.io
to your app, just like
+drycc.104.197.125.75.nip.io
was sent to the Workflow API service.
Next, let’s change some configuration using the CLI. Our example app is built
+to read configuration from the environment. By using drycc config:set
we can
+change how the application behaves:
$ drycc config:set POWERED_BY="Container Images + Kubernetes" -a proper-barbecue
+Creating config... done
+
+UUID OWNER NAME VALUE
+04bb6e45-9221-4843-a1f9-acc7fded3b06 dev POWERED_BY Container Images + Kubernetes
+
Behind the scenes, Workflow creates a new release for your application and uses +Kubernetes to provide a zero-downtime rolling deploy to the new release!
+Validate that our configuration change has worked:
+$ curl http://proper-barbecue.104.197.125.75.nip.io
+Powered by Container Images + Kubernetes
+
Last, let’s scale our application by adding more application processes. Using the CLI you can easily add and remove +additional processes to service requests:
+$ drycc scale web=2 -a proper-barbecue
+Scaling processes... but first, coffee!
+done in 36s
+
+NAME RELEASE STATE PTYPE STARTED
+proper-barbecue-v18-web-rk644 v18 up web 2023-12-08T03:09:25UTC
+proper-barbecue-v18-web-0ag04 v18 up web 2023-12-08T03:09:25UTC
+
Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow.
+There is a lot more you can do with Drycc Workflow, play around with the CLI:
+!!! important +In order to have permission to push an app you must add a SSH key to your user on the Drycc Workflow. +For more information, please check Users and SSH Keys and Troubleshooting Workflow.
+drycc rollback -a proper-barbecue
drycc logs -a proper-barbecue
The Twelve-Factor App is a methodology for building modern +applications that can be scaled across a distributed system.
+Twelve-factor is a valuable synthesis of years of experience with +software-as-a-service apps in the wild, particularly on the +Heroku platform.
+Workflow is designed to run applications that adhere to the Twelve-Factor App +methodology and best practices.
+Kubernetes is an open-source cluster manager developed by Google and +donated to the Cloud Native Compute Foundation. Kubernetes manages all +the activity on your cluster, including: desired state convergence, stable +service addresses, health monitoring, service discovery, and DNS resolution.
+Workflow builds upon Kubernetes abstractions like Services, +Deployments and Pods to provide a developer-friendly experience. +Building containers directly from application source code, aggregating logs, +and managing deployment configurations and app releases are just some of the +features Workflow adds.
+Drycc Workflow is a set of Kubernetes-native components, installable via +Helm. Systems engineers who are familiar with Kubernetes will feel right +at home running Workflow.
+See the components overview for more detail.
+[Container][] is an open source project to build, ship and run any +application as a lightweight, portable, self-sufficient container.
+If you have not yet converted your application to containers, Workflow provides
+a simple and straightforward “source to Container image” capability. Supporting
+multiple language runtimes via community buildpacks, building your application
+in a container can be as easy as git push drycc master
.
Applications which use either a Dockerfile or reference external Container +images are launched unmodified.
+Workflow is designed around the concept of an application, or app.
+Applications come in one of three forms:
+git
repositorygit
repositoryApplications are identified by a unique name for easy reference. If you do not +specify a name when creating your application, Workflow generates one for you. +Workflow also manages related information, including domain names, SSL +certificates, and developer-provided configuration.
+The builder component processes incoming git push drycc master
requests
+and manages your application packaging.
If your application is using a buildpack, builder will launch an ephemeral +job to extract and execute the packaging instructions. The resulting +application artifact is stored by the platform for execution during the run +stage.
+If instead builder finds a Dockerfile, it follows those instructions to +create a Container image. The resulting artifact is stored in a Drycc-managed registry which +will be referenced during the run stage.
+If another system already builds and packages your application, that container +artifact can be used directly. When referencing an external Container +image, the builder component doesn’t attempt to repackage your +app.
+During the release stage, a build is combined with application configuration +to create a new, numbered release. New releases are created any time a new +build is created or application configuration is changed. Tracking releases as a +“write-only ledger” this way makes it easy to rollback to any previous release.
+The run stage deploys the new release to the underlying Kubernetes cluster by +changing the Deployment object which references the new release. +By managing the desired replica count, Workflow +orchestrates a zero-downtime, rolling update of your application. Once +successfully updated, Workflow removes the last reference to the old release. +Note that during the deploy, your application will be running in a mixed mode.
+Workflow treats all persistent services such as databases, caches, storage, +messaging systems, and other backing services as resources managed +separately from your application. This philosophy aligns with Twelve-Factor +best practices.
+Applications attach to backing services using environment variables. +Because apps are decoupled from backing services, they are free to +scale up independently, to use services provided by other apps, or to switch +to external or third-party vendor services.
+All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.
+Operators use Helm to configure and install the Workflow components which +interface directly with the underlying Kubernetes cluster. Service discovery, +container availability and networking are all delegated to Kubernetes, while +Workflow provides a clean and simple developer experience.
+Drycc Workflow provides additional functionality to your Kubernetes cluster, including:
+All platform components and applications deployed via Workflow expect to be +running on an existing Kubernetes cluster. This means that you can happily run +your Kubernetes-native workloads next to applications that are managed through +Drycc Workflow.
+ +By default Workflow creates per-application Namespaces and Services so you can +easily connect your applications to other on-cluster services through standard +Kubernetes mechanisms.
+ +The router component is responsible for routing HTTP/s traffic to your
+Applications as well as proxying git push
and platform API traffic.
By default, the router component is deployed as a Kubernetes service with type
+LoadBalancer
; which, depending on your configuration, will provision a
+cloud-native load balancer automatically.
The router automatically discovers routable Applications, SSL/TLS certificates +and application-specific configurations through the use of Kubernetes +annotations. Any changes to router configuration or certificates are applied +within seconds.
+Drycc Workflow no longer dictates a specific topology or server count for your +deployment. The platform components will happily run on single-server +configurations as well as multi-server production clusters.
+ +All Workflow components are deployed as services (and associated controllers) in your Kubernetes cluster. +If you are interested we have a more detailed exploration of the Workflow architecture.
+All of the componentry for Workflow is built with composability in mind. If you +need to customize one of the components for your specific deployment or need +the functionality in your own project we invite you to give it a shot!
+Project Location: drycc/controller
+The controller component is an HTTP API server which serves as the endpoint for
+the drycc
CLI. The controller provides all of the platform functionality as
+well as interfacing with your Kubernetes cluster. The controller persists all
+of its data to the database component.
Project Location: drycc/passport
+The passport component exposes a web API and provide OAuth2 authentication.
+Project Location: drycc/postgres
+The database component is a managed instance of PostgreSQL which holds a +majority of the platforms state. Backups and WAL files are pushed to object +storage via WAL-E. When the database is restarted, backups are fetched and +replayed from object storage so no data is lost.
+Project Location: drycc/builder
+The builder component is responsible for accepting code pushes via Git and +managing the build process of your Application. The builder process is:
+git push
requests over SSHBuilder currently supports both buildpack and Dockerfile based builds.
+Project Location: drycc/imagebuilder
+For Buildpack-based deploys, the builder component will launch a one-shot Job
+in the drycc
namespace. This job runs imagebuilder
component which handles
+default and custom buildpacks (specified by .packbuilder
). The completed image
+is pushed to the managed Container registry on cluster. For more information
+about buildpacks see using buildpacks.
Unlike buildpack-based, For Applications which contain a Dockerfile
in the root
+of the repository, it generates a Container image (using the underlying Container engine).
+For more information see using Dockerfiles.
Project Location: drycc/storage
+All of the Workflow components that need to persist data will ship them to the +object storage that was configured for the cluster.For example, database ships +its WAL files, registry stores Container images, and slugbuilder stores slugs.
+Workflow supports either on or off-cluster storage. For production deployments +we highly recommend that you configure off-cluster object storage.
+To facilitate experimentation, development and test environments, the default charts for +Workflow include on-cluster storage via storage.
+If you also feel comfortable using Kubernetes persistent volumes you may +configure storage to use persistent storage available in your environment.
+Project Location: drycc/registry
+The registry component is a managed container registry which holds application +images generated from the builder component. Registry persists the Container image +images to either local storage (in development mode) or to object storage +configured for the cluster.
+The logging subsystem consists of two components. Fluentbit handles log shipping +and logger maintains a ring-buffer of application logs.
+Project Location: drycc/fluentbit
+Fluentbit is deployed to your Kubernetes cluster via Daemon Sets. Fluentbit
+subscribes to all container logs, decorates the output with Kubernetes metadata
+and can be configured to drain logs to multiple destinations. By default,
+Fluentbit ships logs to the logger component, which powers drycc logs
.
Project Location: drycc/logger
+The logger
component receives log streams from fluentbit
, collating by
+Application name. Logger does not persist logs to disk, instead maintaining an
+in-memory ring buffer. For more information on logger see the project
+documentation.
Project Location: drycc/monitor
+The monitoring subsystem consists of two components: Telegraf and Grafana.
+Telegraf is the is the metrics collection agent that runs using the daemon set API. It runs on +every worker node in the cluster, fetches information about the pods currently running and ships it +to Prometheus.
+Grafana is a standalone graphing application. It natively supports Prometheus as a datasource and +provides a robust engine for creating dashboards on top of timeseries data. Workflow provides a few +dashboards out of the box for monitoring Drycc Workflow and Kubernetes. The dashboards can be used +as a starting point for creating more custom dashboards to suit a user’s needs.
+Project Location: drycc/prometheus
+Prometheus is a system monitoring and alerting system. It was opensourced by SoundCloud in 2012 and is +the second project both to join and to graduate within Cloud Native Computing Foundation after Kubernetes. +Prometheus stores all metrics data as time series, i.e metrics information is stored along with the +timestamp at which it was recorded, optional key-value pairs called as labels can also be stored along +with metrics.
+Project Location: drycc/rabbitmq
+RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.
+Project Location: drycc/rabbitmq
+Helm Broker is a Service Broker that exposes Helm charts as Service Classes in Service Catalog. +To do so, Helm Broker uses the concept of addons. An addon is an abstraction layer over a Helm chart +which provides all information required to convert the chart into a Service Class.
+Project Location: drycc/rabbitmq
+Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.
+Drycc Workflow requires Kubernetes v1.16.15 or later.
+Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using istio or kong.
+Workflow supports the use of ACME to manage automatic certificates, cert-manager is also one of the necessary components, if you use cert-manager EAB, you need to set the clusterResourceNamespace
to the namespace of drycc.
Workflow supports stateful apps. You can create and use them through the ‘drycc volumes’ command. If you want to use this feature, you must have a StorageClass
that supports ReadWriteMany
.
Workflow also supports the OSB API through the ‘drycc resources’ command. If you want to use this function, you need to install service-catalog.
+A variety of Drycc Workflow components rely on an object storage system to do their work, including storing application +slugs, Container images and database logs.
+Drycc Workflow ships with drycc storage by default, which provides in-cluster.
+Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob +Storage. See configuring object storage for setup instructions.
+When deploying Drycc Workflow, it’s important to provision machines with adequate resources. Drycc is a highly-available +distributed system, which means that Drycc components and your deployed applications will move around the cluster onto +healthy hosts as hosts leave the cluster for various reasons (failures, reboots, autoscalers, etc.). Because of this, +you should have ample spare resources on any machine in your cluster to withstand the additional load of running +services for failed machines.
+Drycc Workflow components use about 2.5GB of memory across the cluster, and require approximately 30GB of hard disk +space. Because it may need to handle additional load if another one fails, each machine has minimum requirements of:
+Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your +application footprint as well.
+Running smaller machines will likely result in increased system load and has been known to result in component failures +and instability.
+ +Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running:
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.gatewayClass=istio \
+ --set global.platformDomain=drycc.cc \
+ --set builder.service.type=LoadBalancer
+
Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort:
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.gatewayClass=istio \
+ --set global.platformDomain=drycc.cc \
+ --set builder.service.type=NodePort \
+ --set builder.service.nodePort=32222
+
If you want to use Load Balancer on a bare machine, you can look at metallb
+Where global.platformDomain
is a required parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using drycc.cc
for $hostname
.
Helm will install a variety of Kubernetes resources in the drycc
namespace.
+Wait for the pods that Helm launched to be ready. Monitor their status by running:
$ kubectl --namespace=drycc get pods
+
You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running:
+$ kubectl get gatewayclass --namespace drycc
+
Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component’s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.
+Here, it can be seen that the controller, builder and registry all took a few loops waiting for storage before they were able to start:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-hy3xv 1/1 Running 5 5m
+drycc-controller-g3cu8 1/1 Running 5 5m
+drycc-controller-celery-cmxxn 3/3 Running 0 5m
+drycc-database-rad1o 1/1 Running 0 5m
+drycc-logger-fluentbit-1v8uk 1/1 Running 0 5m
+drycc-logger-fluentbit-esm60 1/1 Running 0 5m
+drycc-logger-sm8b3 1/1 Running 0 5m
+drycc-storage-4ww3t 1/1 Running 0 5m
+drycc-registry-asozo 1/1 Running 1 5m
+drycc-rabbitmq-0 1/1 Running 0 5m
+
Now that Workflow has been deployed with the global.gatewayClass
, we will need a Kubernetes gateway in place to begin routing traffic.
Here is an example of how to use istio as an gateway for Workflow. Of course, you are welcome to use any controller you wish.
+$ helm repo add istio https://istio-release.storage.googleapis.com/charts
+$ helm repo update
+$ kubectl create namespace istio-system
+$ helm install istio-base istio/base -n istio-system
+$ helm install istiod istio/istiod -n istio-system --wait
+$ kubectl create namespace istio-ingress
+$ helm install istio-ingress istio/gateway -n istio-ingress --wait
+
User must install drycc and then set up a hostname, and assumes the *.$host
convention.
We need to point the *.$host
record to the public IP address of your gateway. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.
$ kubectl get gateway --namespace drycc
+NAME CLASS ADDRESS PROGRAMMED AGE
+gateway istio 138.91.243.152 True 36d
+
If we were using drycc.cc
as a hostname, we would need to create the following A DNS records.
Name | +Type | +Value | +
---|---|---|
*.drycc.cc | +A | +138.91.243.152 | +
Once all of the pods are in the READY
state, and *.$host
resolves to the external IP found above, the preparation of gateway has been completed!
After installing Workflow, register a user and deploy an application.
+If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can
+access both internal and external networks, and then expose 80
and 443
.
If help is required getting started with Kubernetes and +Drycc Workflow, follow the quickstart guide for assistance.
+Check that the helm
command is available and the version is v2.5.0 or newer.
$ helm version
+Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+
Drycc Workflow includes everything it needs to run out of the box. However, these defaults are aimed at simplicity rather than +production readiness. Production and staging deployments of Workflow should, at a minimum, use off-cluster storage +which is used by Workflow components to store and backup critical data. Should an operator need to completely re-install +Workflow, the required components can recover from off-cluster storage. See the documentation for configuring object +storage for more details.
+More rigorous installations would benefit from using outside sources for the following things:
+Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.
+If the version of helm is 3.0 +; you need to create the namespace in advance:
+kubectl create ns drycc
+
If you want to change it, set the variable when using helm.
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set builder.imageRegistry=quay.io \
+ --set imagebuilder.imageRegistry=quay.io \
+ --set controller.imageRegistry=quay.io \
+ --set database.imageRegistry=quay.io \
+ --set fluentbit.imageRegistry=quay.io \
+ --set redis.imageRegistry=quay.io \
+ --set rabbitmq.imageRegistry=quay.io \
+ --set logger.imageRegistry=quay.io \
+ --set storage.imageRegistry=quay.io \
+ --set monitor.imageRegistry=quay.io \
+ --set registry.imageRegistry=quay.io \
+ --set registry-proxy.imageRegistry=quay.io \
+ --set global.platformDomain=drycc.cc
+
Helm will install a variety of Kubernetes resources in the drycc
namespace.
+Wait for the pods that Helm launched to be ready. Monitor their status by running:
$ kubectl --namespace=drycc get pods
+
If it’s preferred to have kubectl
automatically update as the pod states change, run (type Ctrl-C to stop the watch):
$ kubectl --namespace=drycc get pods -w
+
Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component’s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.
+Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-574483744-l15zj 1/1 Running 0 4m
+drycc-controller-3953262871-pncgq 1/1 Running 2 4m
+drycc-controller-celery-cmxxn 3/3 Running 0 4m
+drycc-database-83844344-47ld6 1/1 Running 0 4m
+drycc-logger-176328999-wjckx 1/1 Running 4 4m
+drycc-logger-fluentbit-zxnqb 1/1 Running 0 4m
+drycc-redis-304849759-1f35p 1/1 Running 0 4m
+drycc-storage-676004970-nxqgt 1/1 Running 0 4m
+drycc-monitor-grafana-432627134-lnl2h 1/1 Running 0 4m
+drycc-monitor-telegraf-wmcmn 1/1 Running 1 4m
+drycc-registry-756475849-lwc6b 1/1 Running 1 4m
+drycc-registry-proxy-96c4p 1/1 Running 0 4m
+drycc-rabbitmq-0 1/1 Running 0 4m
+
Once all of the pods are in the READY
state, Drycc Workflow is up and running!
For more installation parameters, please check the values.yaml file of workflow.
+After installing Workflow, register a user and deploy an application.
+User must to set up a hostname, and assumes the drycc-builder.$host
convention.
We need to point the drycc-builder.$host
record to the public IP address of your builder. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.
$ kubectl get svc drycc-builder --namespace drycc
+NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+drycc-builder 10.0.25.3 138.91.243.152 2222:31625/TCP 33m
+
If we were using drycc.cc
as a hostname, we would need to create the following A DNS records.
Name | +Type | +Value | +
---|---|---|
drycc-builder.drycc.cc | +A | +138.91.243.152 | +
Once all of the pods are in the READY
state, and drycc-builder.$host
resolves to the external IP found above, Workflow is up and running!
After installing Workflow, register a user and deploy an application.
+If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can
+access both internal and external networks, and then expose 80
and 443
.
Drycc Workflow ships with Storage by default, which provides in-cluster.
+Every component that relies on object storage uses two inputs for configuration:
+storage-creds
The helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster object storage. Drycc Workflow currently supports Google Compute Storage, Amazon S3, Azure Blob Storage and OpenStack Swift Storage.
+Create storage buckets for each of the Workflow subsystems: builder
, registry
, and database
.
Depending on your chosen object storage you may need to provide globally unique bucket names. If you are using S3, use hyphens instead of periods in the bucket names. Using periods in the bucket name will cause an ssl certificate validation issue with S3.
+If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.
+If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.
+If you are using AWS S3 and your Kubernetes nodes are configured with appropriate IAM API keys via InstanceRoles, you do not need to create API credentials. Do, however, validate that the InstanceRole has appropriate permissions to the configured buckets!
+Operators should configure object storage by editing the Helm values file before running helm install
. To do so:
helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml
global/storage
parameter to reference the platform you are using, e.g. s3
, azure
, gcs
, or swift
!!! note
+All values will be automatically (base64) encoded except the key_json
values under gcs
/gcr
. These must be base64-encoded. This is to support cleanly passing said encoded text via helm --set
cli functionality rather than attempting to pass the raw JSON data. For example:
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.platformDomain=youdomain.com
+ --set global.storage=gcs,gcs.key_json="$(cat /path/to/gcs_creds.json | base64 -w 0)"
+
+You are now ready to run helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
using your desired object storage.
By default, Drycc Workflow ships with the database component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster object storage. Currently, for object storage, which is utilized by several Workflow components, only off-cluster solutions such as S3 or GCS are recommended in production environments. Experience has shown that many operators already opting for off-cluster object storage similarly prefer to host Postgres off-cluster as well, using Amazon RDS or similar. When excercising both options, a Workflow installation becomes entirely stateless, and is thus restored or rebuilt with greater ease should the need ever arise.
+First, provision a PostgreSQL RDBMS using the cloud provider or other infrastructure of your choice. Take care to ensure that security groups or other firewall rules will permit connectivity from your Kubernetes worker nodes, any of which may play host to the Workflow controller component.
+Take note of the following:
+Within the off-cluster RDBMS, manually provision the following:
+If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will typically look like this:
+$ psql -h <host> -p <port> -d postgres -U <"postgres" or your own username>
+> create user <drycc username; typically "drycc"> with password '<password>';
+> create database <database name; typically "drycc"> with owner <drycc username>;
+> \q
+
The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.
+helm inspect values drycc/workflow > values.yaml
values.yaml
:
+databaseLocation
parameter to off-cluster
.[database]
configuration section to properly reflect all connection details.[controller]
configuration section to properly reflect platformDomain details.You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
as usual.
Drycc Workflow ships with a registry component by default, which provides an in-cluster Container registry backed by the platform-configured object storage. Operators might want to use an off-cluster registry for performance or security reasons.
+Every component that relies on a registry uses two inputs for configuration:
+DRYCC_REGISTRY_LOCATION
registry-secret
The Helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster registry. Drycc Workflow supports external registries which provide either short-lived tokens that are valid only for a specified amount of time or long-lived tokens (basic username/password) which are valid forever for authenticating to them. For those registries which provide short lived tokens for authentication, Drycc Workflow will generate and refresh them such that the deployed apps will only have access to the short-lived tokens and not to the actual credentials for the registries.
+When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by Kubernetes. This will increase security and overall speed, however the port
information can no longer be discovered. Instead the port
information can be set via drycc config:set PORT=<port>
prior to deploying the application.
Drycc Workflow currently supports:
+helm inspect values drycc/workflow > values.yaml
registryLocation
parameter to reference the registry location you are using: off-cluster
, ecr
, gcr
+* Update the values in the section which corresponds to your registry location type.You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
using your desired registry.
Here we show how the relevant parts of the fetched values.yaml
file might look like after configuring for a particular off-cluster registry:
After following the docs and creating a registry, e.g. myregistry
, with its corresponding login server of myregistry.azurecr.io
, the following values should be supplied:
global:
+...
+ registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+ registry:
+ hostname: "myregistry.azurecr.io"
+ organization: "myorg"
+ username: "myusername"
+ password: "mypassword"
+...
+
Note: The mandatory organization field (here myorg
) will be created as an ACR repository if it does not already exist.
global:
+...
+ registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+ registry:
+ hostname: "quay.io"
+ organization: "myorg"
+ username: "myusername"
+ password: "mypassword"
+...
+
+The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.
+Install the latest drycc
client for Linux or Mac OS X with:
+$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
The installer puts drycc
in your current directory, but you should move it
+somewhere in your $PATH:
$ ln -fs $PWD/drycc /usr/local/bin/drycc
+
+The Drycc client comes with comprehensive documentation for every command.
+Use drycc help
to explore the commands available to you:
$ drycc help
+The Drycc command-line client issues API calls to a Drycc controller.
+
+Usage: drycc <command> [<args>...]
+
+Auth commands::
+
+ login login to a controller
+ logout logout from the current controller
+
+Subcommands, use `drycc help [subcommand]` to learn more::
+...
+
+To get help on subcommands, use drycc help [subcommand]
:
$ drycc help apps
+Valid commands for apps:
+
+apps:create create a new application
+apps:list list accessible applications
+apps:info view info about an application
+apps:open open the application in a browser
+apps:logs view aggregated application logs
+apps:run run a command in an ephemeral app container
+apps:destroy destroy an application
+apps:transfer transfer app ownership to another user
+
+Use `drycc help [command]` to learn more
+
+The CLI reads from the default client
profile, which is located on your
+workstation at $HOME/.drycc/client.json
.
Easily switch between multiple Drycc Workflow installations or users by setting
+the $DRYCC_PROFILE
environment variable or by using the -c
flag.
There are two ways to set the $DRYCC_PROFILE
option.
$HOME/.drycc/<name>.json
.Examples:
+$ DRYCC_PROFILE=production drycc login drycc.production.com
+...
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration saved to /home/testuser/.drycc/production.json
+$ DRYCC_PROFILE=~/config.json drycc login drycc.example.com
+...
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration saved to /home/testuser/config.json
+
+The configuration flag works identically to and overrides $DRYCC_PROFILE
:
$ drycc whoami -c ~/config.json
+You are drycc at drycc.example.com
+
+If your workstation uses a proxy to reach the network where the cluster lies,
+set the http_proxy
or https_proxy
environment variable to enable proxy support:
$ export http_proxy="http://proxyip:port"
+$ export https_proxy="http://proxyip:port"
+
+!!! note +Configuring a proxy is generally not necessary for local Minikube clusters.
+Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features.
+If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, drycc resource:command
will execute drycc-resource
with the argument list command
. In full form:
$ # these two are identical
+$ drycc accounts:list
+$ drycc-accounts list
+
+Any flags after the command will also be sent to the plugin as an argument:
+$ # these two are identical
+$ drycc accounts:list --debug
+$ drycc-accounts list --debug
+
+But flags preceding the command will not:
+$ # these two are identical
+$ drycc --debug accounts:list
+$ drycc-accounts list
+
+
+Workflow use the passport component to create and authorize users, it can config options for LDAP authentication or browse passport web site to register users.
+If you already have an account, use drycc login
to authenticate against the Drycc Workflow API.
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration file written to /root/.drycc/client.json
+
+Or you can login with username and password +$ drycc login http://drycc.example.com –username=demo –password=demo +Configuration file written to /root/.drycc/client.json
+Logout of an existing controller session using drycc logout
.
$ drycc logout
+Logged out as drycc
+
+You can verify your client configuration by running drycc whoami
.
$ drycc whoami
+You are drycc at http://drycc.example.com
+
+!!! note
+Session and client configuration is stored in the ~/.drycc/client.json
file.
For Dockerfile and Buildpack based application deploys via git push
, Drycc Workflow identifies users via SSH
+keys. SSH keys are pushed to the platform and must be unique to each user. Users may have multiple SSH keys as needed.
If you do not already have an SSH key or would like to create a new key for Drycc Workflow, generate a new key using
+ssh-keygen
:
$ ssh-keygen -f ~/.ssh/id_drycc -t rsa
+Generating public/private rsa key pair.
+Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in /Users/admin/.ssh/id_drycc.
+Your public key has been saved in /Users/admin/.ssh/id_drycc.pub.
+The key fingerprint is:
+3d:ac:1f:f4:83:f7:64:51:c1:7e:7f:80:b6:70:36:c9 admin@plinth-23437.local
+The key's randomart image is:
++--[ RSA 2048]----+
+| .. |
+| ..|
+| . o. .|
+| o. E .o.|
+| S == o..o|
+| o +. .o|
+| . o + o .|
+| . o = |
+| . . |
++-----------------+
+$ ssh-add ~/.ssh/id_drycc
+Identity added: /Users/admin/.ssh/id_drycc (/Users/admin/.ssh/id_drycc)
+
By publishing the public half of your SSH key to Drycc Workflow the component responsible for receiving git push
+will be able to authenticate the user and ensure that they have access to the destination application.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
You can always view the keys associated with your user as well:
+$ drycc keys:list
+ID OWNER KEY
+admin@plinth-23437.local admin ssh-rsa abc AAAAB3Nz...3437.local
+admin@subgenius.local admin ssh-rsa 123 AAAAB3Nz...nius.local
+
Remove keys by their name:
+$ drycc keys:remove admin@plinth-23437.local
+Removing admin@plinth-23437.local SSH Key... don
+
+An Application is deployed to Drycc using git push
or the drycc
client.
Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled +horizontally, applications must follow the Twelve-Factor App methodology and store any application state in external +backing services.
+For example, if your application persists state to the local filesystem – common with content management systems like
+Wordpress and Drupal – it cannot be scaled horizontally using drycc scale
.
Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.
+!!! important +if you haven’t yet, now is a good time to install the client and register.
+Before deploying an application, users must first authenticate against the Drycc Controller +using the URL supplied by their Drycc administrator.
+$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+
Or you can login with username and password
+$ drycc login http://drycc.example.com --username=demo --password=demo
+Configuration file written to /root/.drycc/client.json
+
Drycc Workflow supports three different ways of building applications:
+Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.
+Learn how to deploy applications using Buildpacks.
+Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing.
+Learn how to deploy applications using Dockerfiles.
+Deploying a Container image onto Drycc allows you to take a Container image from either a public +or a private registry and copy it over bit-for-bit, ensuring that you are running the same +image in development or in your CI pipeline as you are in production.
+Learn how to deploy applications using Container images.
+It is possible to configure a few of the globally tunable settings on per application basis using config:set
.
Setting | +Description | +
---|---|
DRYCC_DISABLE_CACHE | +if set, this will disable the [imagebuilder cache][] (default: not set) | +
DRYCC_DEPLOY_BATCHES | +the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) | +
DRYCC_DEPLOY_TIMEOUT | +deploy timeout in seconds per deploy batch (default: 120) | +
IMAGE_PULL_POLICY | +the kubernetes [image pull policy][pull-policy] for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”) | +
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT | +how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) | +
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS | +how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) | +
Deploy timeout in seconds - There are 2 deploy methods, Deployments (see below) and RC (versions prior to 2.4) and this setting affects those a bit differently.
+Deployments behave a little bit differently from the RC based deployment strategy.
+Kubernetes takes care of the entire deploy, doing rolling updates in the background. As a result, there is only an overall deployment timeout instead of a configurable per-batch timeout.
+The base timeout is multiplied with DRYCC_DEPLOY_BATCHES
to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.
This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES
.
The base timeout is extended as well with healthchecks using initialDelaySeconds
on liveness
and readiness
where the bigger of those two is applied.
+Additionally the timeout system accounts for slow image pulls by adding an additional 10 minutes when it has seen an image pull take over 1 minute. This allows the timeout values to be reasonable without having to account for image pull slowness in the base deploy timeout.
Workflow uses Deployments for deploys. In prior versions ReplicationControllers were used with the ability to turn on Deployments via DRYCC_KUBERNETES_DEPLOYMENTS=1
.
The advantage of Deployments is that rolling-updates will happen server-side in Kubernetes instead of in Drycc Workflow Controller, +along with a few other Pod management related functionality. This allows a deploy to continue even when the CLI connection is interrupted.
+Behind the scenes your application deploy will be built up of a Deployment object per process type, +each having multiple ReplicaSets (one per release) which in turn manage the Pods running your application.
+Drycc Workflow will behave the same way with DRYCC_KUBERNETES_DEPLOYMENTS
enabled or disabled (only applicable to versions prior to 2.4).
+The changes are behind the scenes. Where you will see differences while using the CLI is drycc ps:list
will output Pod names differently.
Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.
+For Buildpack based application deploys via git push
, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.
See this document for instructions on how to generate an SSH key.
+Run drycc keys:add
to upload your SSH key to Drycc Workflow.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
Read more about adding/removing SSH Keys here.
+If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow.
+$ git clone https://github.com/drycc/example-go.git
+$ cd example-go
+
+Use drycc create
to create an application on the Controller.
$ drycc create
+Creating application... done, created skiing-keypunch
+Git remote drycc added
+
+Use git push drycc master
to deploy your application.
$ git push drycc master
+Counting objects: 75, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (48/48), done.
+Writing objects: 100% (75/75), 18.28 KiB | 0 bytes/s, done.
+Total 75 (delta 30), reused 58 (delta 22)
+remote: --->
+Starting build... but first, coffee!
+---> Waiting podman running.
+---> Process podman started.
+---> Waiting caddy running.
+---> Process caddy started.
+---> Building pack
+---> Using builder registry.drycc.cc/drycc/buildpacks:bookworm
+Builder 'registry.drycc.cc/drycc/buildpacks:bookworm' is trusted
+Pulling image 'registry.drycc.cc/drycc/buildpacks:bookworm'
+Resolving "drycc/buildpacks" using unqualified-search registries (/etc/containers/registries.conf)
+Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm...
+Getting image source signatures
+...
+---> Skip generate base layer
+---> Python Buildpack
+---> Downloading and extracting Python 3.10.0
+---> Installing requirements with pip
+Collecting Django==3.2.8
+Downloading Django-3.2.8-py3-none-any.whl (7.9 MB)
+Collecting gunicorn==20.1.0
+Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB)
+Collecting sqlparse>=0.2.2
+Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
+Collecting pytz
+Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB)
+Collecting asgiref<4,>=3.3.2
+Downloading asgiref-3.4.1-py3-none-any.whl (25 kB)
+Requirement already satisfied: setuptools>=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0->-r requirements.txt (line 2)) (57.5.0)
+Installing collected packages: sqlparse, pytz, asgiref, gunicorn, Django
+Successfully installed Django-3.2.8 asgiref-3.4.1 gunicorn-20.1.0 pytz-2021.3 sqlparse-0.4.2
+---> Generate Launcher
+...
+Build complete.
+Launching App...
+...
+Done, skiing-keypunch:v2 deployed to Workflow
+
+Use 'drycc open' to view this application in your browser
+
+To learn more, use 'drycc help' or visit https://www.drycc.cc
+
+To ssh://git@drycc.staging-2.drycc.cc:2222/skiing-keypunch.git
+ * [new branch] master -> master
+
+$ curl -s http://skiing-keypunch.example.com
+Powered by Drycc
+Release v2 on skiing-keypunch-v2-web-02zb9
+
+Because a Buildpacks-style application is detected, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of pods running that process.
For convenience, a number of buildpacks come bundled with Drycc:
+Drycc will cycle through the bin/detect
script of each buildpack to match the code you
+are pushing.
!!! note +If you’re testing against the [Scala Buildpack][], the Builder requires at least +512MB of free memory to execute the Scala Build Tool.
+To use a custom buildpack, you need create a .pack_builder
file in your root path app.
$ tee > .pack_builder << EOF
+ > registry.drycc.cc/drycc/buildpacks:bookworm
+ > EOF
+
+On your next git push
, the custom buildpack will be used.
To pull code from private repositories, set the SSH_KEY
environment variable to a private key
+which has access. Use either the path of a private key file or the raw key material:
$ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa
+$ drycc config:set SSH_KEY="""-----BEGIN RSA PRIVATE KEY-----
+(...)
+-----END RSA PRIVATE KEY-----"""
+
+For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public
+key exists in your GitHub settings. Then set SSH_KEY
to the corresponding SSH private key
+and set .pack_builder
to the builder image:
$ tee > .pack_builder << EOF
+ > registry.drycc.cc/drycc/buildpacks:bookworm
+ > EOF
+$ git add .buildpack
+$ git commit -m "chore(buildpack): modify the pack_builder"
+$ git push drycc master
+
+Which way to build a project conforms to the following principles:
+container
buildpack
container
is used by defaultDRYCC_STACK
to container
or buildpack
determine which stack to use.Drycc supports deploying applications via Dockerfiles. A Dockerfile automates the steps for crafting a [Container Image][]. +Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment.
+For Dockerfile based application deploys via git push
, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.
See this document for instructions on how to generate an SSH key.
+Run drycc keys:add
to upload your SSH key to Drycc Workflow.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
Read more about adding/removing SSH Keys here.
+If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow.
+$ git clone https://github.com/drycc/helloworld.git
+$ cd helloworld
+
+In order to deploy Dockerfile applications, they must conform to the following requirements:
+EXPOSE
directive to expose exactly one port.CMD
directive to define the default process that will run within the container.!!! note
+Note that if you are using a private registry of any kind (gcr
or other) the application environment must include a $PORT
config variable that matches the EXPOSE
’d port, example: drycc config:set PORT=5000
. See Configuring Registry for more info.
Use drycc create
to create an application on the Controller.
$ drycc create
+Creating application... done, created folksy-offshoot
+Git remote drycc added
+
+Use git push drycc master
to deploy your application.
$ git push drycc master
+Counting objects: 13, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (13/13), done.
+Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done.
+Total 13 (delta 2), reused 0 (delta 0)
+-----> Building Docker image
+Uploading context 4.096 kB
+Uploading context
+Step 0 : FROM drycc/base:latest
+ ---> 60024338bc63
+Step 1 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> cf9ef8c5caa7
+Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> 515b1faf3bd8
+Step 3 : RUN mkdir -p /go
+ ---> Using cache
+ ---> ebf4927a00e9
+Step 4 : ENV GOPATH /go
+ ---> Using cache
+ ---> c6a276eded37
+Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH
+ ---> Using cache
+ ---> 2ba6f6c9f108
+Step 6 : ADD . /go/src/github.com/drycc/helloworld
+ ---> 94ab7f4b977b
+Removing intermediate container 171b7d9fdb34
+Step 7 : RUN cd /go/src/github.com/drycc/helloworld && go install -v .
+ ---> Running in 0c8fbb2d2812
+github.com/drycc/helloworld
+ ---> 13b5af931393
+Removing intermediate container 0c8fbb2d2812
+Step 8 : ENV PORT 80
+ ---> Running in 9b07da36a272
+ ---> 2dce83167874
+Removing intermediate container 9b07da36a272
+Step 9 : CMD ["/go/bin/helloworld"]
+ ---> Running in f7b215199940
+ ---> b1e55ce5195a
+Removing intermediate container f7b215199940
+Step 10 : EXPOSE 80
+ ---> Running in 7eb8ec45dcb0
+ ---> ea1a8cc93ca3
+Removing intermediate container 7eb8ec45dcb0
+Successfully built ea1a8cc93ca3
+-----> Pushing image to private registry
+
+ Launching... done, v2
+
+-----> folksy-offshoot deployed to Drycc
+ http://folksy-offshoot.local3.dryccapp.com
+
+ To learn more, use `drycc help` or visit https://www.drycc.cc
+
+To ssh://git@local3.dryccapp.com:2222/folksy-offshoot.git
+ * [new branch] master -> master
+
+$ curl -s http://folksy-offshoot.local3.dryccapp.com
+Welcome to Drycc!
+See the documentation at http://docs.drycc.cc/ for more information.
+
+Because a Dockerfile application is detected, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of containers
+running that process.
As of Workflow v2.13.0, users can inject their application config into the Container image using +Container build arguments. To opt into this, users must add a new environment variable +to their application:
+$ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1
+
Every environment variable set with drycc config:set
will then be available for use inside the
+user’s Dockerfile. For example, if a user runs drycc config:set POWERED_BY=Workflow
,
+the user can utilize that build argument in their Dockerfile:
ARG POWERED_BY
+RUN echo "Powered by $POWERED_BY" > /etc/motd
+
+Drycc supports deploying applications via an existing Docker Image. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.
+Start by cloning an example application:
+$ git clone https://github.com/drycc/example-dockerfile-http.git
+$ cd example-dockerfile-http
+
+Next use your local docker
client to build the image and push
+it to DockerHub.
$ docker build -t <username>/example-dockerfile-http .
+$ docker push <username>/example-dockerfile-http
+
+In order to deploy Docker images, they must conform to the following requirements:
+EXPOSE
directive to expose exactly one port.CMD
directive to define the default process that will run within the container.!!! note
+Note that if you are using a private registry of any kind (gcr
or other) the application environment must include a $PORT
config variable that matches the EXPOSE
’d port, example: drycc config:set PORT=5000
. See Configuring Registry for more info.
Use drycc create
to create an application on the controller.
$ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http
+$ drycc create example-dockerfile-http --no-remote
+Creating application... done, created example-dockerfile-http
+
+!!! note
+For all commands except for drycc create
, the drycc
client uses the name of the current directory
+as the app name if you don’t specify it explicitly with --app
.
Use drycc pull
to deploy your application from DockerHub or
+a public registry.
$ drycc pull <username>/example-dockerfile-http:latest
+Creating build... done, v2
+
+$ curl -s http://example-dockerfile-http.local3.dryccapp.com
+Powered by Drycc
+
+Because you are deploying a Docker image, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of Containers
+running that process.
To deploy Docker images from a private registry or from a private repository, use drycc registry
+to attach credentials to your application. These credentials are the same as you’d use when running
+docker login
at your private registry.
To deploy private Docker images, take the following steps:
+drycc registry:set username=<the-user> password=<secret> -a <application-name>
drycc pull
as normal, against an image in the private registryWhen using a GCR.io Long Lived Token, the JSON blob will have to be compacted first using a
+tool like jq and then used in the password field in drycc registry:set
. For the username, use
+_json_key
. For example:
drycc registry:set username=_json_key password="$(cat google_cloud_cred.json | jq -c .)"
+
When using a private registry the docker images are no longer pulled into the Drycc Internal Registry via
+the Drycc Workflow Controller but rather is managed by Kubernetes. This will increase security and overall speed,
+however the application port
information can no longer be discovered. Instead the application port
information can be set via
+drycc config:set PORT=80
prior to setting the registry information.
!!! note +Currently GCR.io and ECR in short lived auth token mode are not supported.
+ +Drycc Workflow manages your application as a set of processes that can be named, scaled and configured according to their +role. This gives you the flexibility to easily manage the different facets of your application. For example, you may have +web-facing processes that handle HTTP traffic, background worker processes that do async work, and a helper process that +streams from the Twitter API.
+By using a Procfile, either checked in to your application or provided via the CLI you can specify the name of the type
+and the application command that should run. To spawn other process types, use drycc scale <ptype>=<n>
to scale those
+types accordingly.
In the absence of a Procfile, a single, default process type is assumed for each application.
+Applications built using Buildpacks via git push
implicitly receive a web
process type, which starts
+the application server. Rails 4, for example, has the following process type:
web: bundle exec rails server -p $PORT
+
+All applications utilizing Dockerfiles have an implied web
process type, which runs the
+Dockerfile’s CMD
directive unmodified:
$ cat Dockerfile
+FROM centos:latest
+COPY . /app
+WORKDIR /app
+CMD python -m SimpleHTTPServer 5000
+EXPOSE 5000
+
+For the above Dockerfile-based application, the web
process type would run the Container CMD
of python -m SimpleHTTPServer 5000
.
Applications utilizing remote Container images, a web
process type is also implied, and runs the CMD
+specified in the Container image.
!!! note
+The web
process type is special as they’is the default process type that will
+receive HTTP traffic from Workflow’s routers. Other process types can be named arbitrarily.
If you use Buildpack or Dockerfile builds and want to override or specify additional process
+types, simply include a file named Procfile
in the root of your application’s source tree.
The format of a Procfile
is one process type per line, with each line containing the command to invoke:
<process type>: <command>
+
+The syntax is defined as:
+<process type>
– a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc.<command>
– a command line to launch the process, such as rake jobs:work
.This example Procfile specifies two types, web
and sleeper
. The web
process launches a web server on port 5000 and
+a simple process which sleeps for 900 seconds and exits.
$ cat Procfile
+web: bundle exec ruby web.rb -p ${PORT:-5000}
+sleeper: sleep 900
+
If you are using remote Container images, you may define process types by either running drycc pull
with a
+Procfile
in your working directory, or by passing a stringified Procfile to the --procfile
CLI option.
For example, passing process types inline:
+$ drycc pull drycc/example-go:latest --procfile="web: /app/bin/boot"
+
Read a Procfile
in another directory:
$ drycc pull drycc/example-go:latest --procfile="$(cat deploy/Procfile)"
+
Or via a Procfile located in your current, working directory:
+$ cat Procfile
+web: /bin/boot
+sleeper: echo "sleeping"; sleep 900
+
+
+$ drycc pull -a steely-mainsail drycc/example-go
+Creating build... done
+
+$ drycc scale sleeper=1 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 0s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+steely-mainsail-sleeper-76c45b967c-4qm6w v3 up sleeper 1/1 0 2023-12-08T02:25:00UTC
+steely-mainsail-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
!!! note
+Only process types of web
will be scaled to 1 automatically. If you have additional process types
+remember to scale the process counts after creation.
To remove a process type simply scale it to 0:
+$ drycc scale sleeper=0 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 3s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+steely-mainsail-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
Applications deployed on Drycc Workflow scale out via the process model. Use drycc scale
to control the number of
+containers that power your app.
$ drycc scale web=5 -a iciest-waggoner
+Scaling processes... but first, coffee!
+done in 3s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+iciest-waggoner-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-8p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-9p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-1p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-2p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
If you have multiple process types for your application you may scale the process count for each type separately. For +example, this allows you to manage web process independently from background workers. For more information on process +types see our documentation for Managing App Processes.
+In this example, we are scaling the process type web
to 5 but leaving the process type background
with one worker.
$ drycc scale web=5
+Scaling processes... but first, coffee!
+done in 4s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-7lord v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-jn957 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vwhnh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
Scaling a process down, by reducing the process count, sends a TERM
signal to the processes, followed by a SIGKILL
+if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP
+client connections.
For example, scaling from 5 processes to 3:
+$ drycc scale web=3
+Scaling processes... but first, coffee!
+done in 1s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vwhnh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg9 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
Autoscale allows adding a minimum and maximum number of pods on a per process type basis. This is accomplished by specifying a target CPU usage across all available pods.
+This feature is built on top of Horizontal Pod Autoscaling in Kubernetes or HPA for short.
+!!! note +This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature.
+$ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75
+Applying autoscale settings for process type web on scenic-icehouse... done
+
And then review the scaling rule that was created for web
$ drycc autoscale:list
+PTYPE PERCENT MIN MAX
+web 75 3 8
+
Remove scaling rule
+$ drycc autoscale:unset web
+Removing autoscale for process type web on scenic-icehouse... done
+
For autoscaling to work CPU requests have to be specified on each application Pod (can be done via drycc limits --cpu
). This allows the autoscale policies to do the appropriate calculations and make decisions on when to scale up and down.
Scale up can only happen if there was no rescaling within the last 3 minutes. Scale down will wait for 5 minutes from the last rescaling. That information and more can be found at HPA algorithm page.
+List the containers:
+$ drycc ps
+NAME RELEASE STATE PTYPEE READY RESTARTS STARTED
+python-getting-started-web-69b7d4bfdc-kl4xf v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+=== python-getting-started Processes
+--- web:
+python-getting-started-web-69b7d4bfdc-kl4xf up (v2)
+
fetch the container logs:
+$ drycc ps:logs -f python-getting-started-web-69b7d4bfdc-kl4xf
+[2024-05-24 07:14:39 +0000] [1] [INFO] Starting gunicorn 20.1.0
+[2024-05-24 07:14:39 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
+[2024-05-24 07:14:39 +0000] [1] [INFO] Using worker: gevent
+[2024-05-24 07:14:39 +0000] [8] [INFO] Booting worker with pid: 8
+[2024-05-24 07:14:39 +0000] [9] [INFO] Booting worker with pid: 9
+[2024-05-24 07:14:39 +0000] [10] [INFO] Booting worker with pid: 10
+[2024-05-24 07:14:39 +0000] [11] [INFO] Booting worker with pid: 11
+
List the containers:
+$ drycc ps:describe python-getting-started-web-69b7d4bfdc-kl4xf
+Container: python-getting-started-web
+Image: drycc/python-getting-started:latest
+Command:
+Args:
+ - gunicorn
+ - -c
+ - gunicorn_config.py
+ - helloworld.wsgi:application
+State: running
+ startedAt: "2024-05-24T07:14:39Z"
+Ready: true
+Restart Count: 0
+
Delete the containers. +Due to the set number of replicas, a new container will be launched to meet the quantity requirement.
+$ drycc ps:delete python-getting-started-web-69b7d4bfdc-kl4xf
+Deleting python-getting-started-web-69b7d4bfdc-kl4xf from python-getting-started... done
+
Verify that the container is running:
+$ drycc ps
+NAME RELEASE STATE PTYPEE READY RESTARTS STARTED
+python-getting-started-web-69b7d4bfdc-kl4xf v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+=== python-getting-started Processes
+--- web:
+python-getting-started-web-69b7d4bfdc-kl4xf up (v2)
+
Get a shell to the running container:
+$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash
+
In your shell, list the root directory:
+# Run this inside the container
+ls /
+
Running individual commands in a container
+$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date
+
Use “drycc ps –help” for a list of global command-line (applies to all commands).
+If you need to restart an application process, you may use drycc pts:restart
. Behind the scenes, Drycc Workflow instructs
+Kubernetes to terminate the old process and launch a new one in its place.
$ drycc ps
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v2 up web 1/1 0 2023-12-08T02:50:21UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+$ drycc pts:restart scenic-icehouse-background
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v2 up web 1/1 0 2023-12-08T02:50:21UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 starting web 1/1 0 2023-12-08T02:25:00UTC
+
Notice that the process name has changed from scenic-icehouse-background-3291896318-yf8kh
to
+scenic-icehouse-background-3291896318-yd87g
. In a multi-node Kubernetes cluster, this may also have the effect of scheduling
+the Pod to a new node.
Use “drycc pts –help” for a list of pts command-line (process types info).
+$ drycc pts
+NAME RELEASE READY UP-TO-DATE AVAILABLE STARTED
+web v2 3/3 1 1 2023-12-08T02:25:00UTC
+background v2 1/1 1 1 2023-12-08T02:25:00UTC
+
$ drycc pts:describe web
+Container: python-getting-started-web
+Image: drycc/python-getting-started:latest
+Command:
+Args:
+ - gunicorn
+ - -c
+ - gunicorn_config.py
+ - helloworld.wsgi:application
+Limits:
+ cpu 1
+ ephemeral-storage 2Gi
+ memory 1Gi
+Liveness: http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3
+Readiness: http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3
+
+A Drycc application stores config in environment variables.
+Use drycc config
to modify environment variables for a deployed application.
$ drycc help config
+Valid commands for config:
+
+config:list list environment variables for an app
+config:set set environment variables for an app
+config:unset unset environment variables for an app
+config:pull extract environment variables to .env
+config:push set environment variables from .env
+
+Use `drycc help [command]` to learn more.
+
+When config is changed, a new release is created and deployed automatically.
+You can set multiple environment variables with one drycc config:set
command,
+or with drycc config:push
and a local .env file.
$ drycc config:set FOO=1 BAR=baz && drycc config:pull
+$ cat .env
+FOO=1
+BAR=baz
+$ echo "TIDE=high" >> .env
+$ drycc config:push
+Creating config... done, v4
+
+=== yuppie-earthman
+DRYCC_APP: yuppie-earthman
+FOO: 1
+BAR: baz
+TIDE: high
+
+It can also modify environment variables for a process type of application.
+$ drycc config:set FOO=1 BAR=baz --ptype=web
+
+Drycc treats backing services like databases, caches and queues as attached resources. +Attachments are performed using environment variables.
+For example, use drycc config
to set a DATABASE_URL
that attaches
+the application to an external PostgreSQL database.
$ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db
+=== peachy-waxworks
+DATABASE_URL: postgres://user:pass@example.com:5432/db
+
+Detachments can be performed with drycc config:unset
.
By default, apps using the [Imagebuilder][] will reuse the latest image data. +When deploying applications that depend on third-party libraries that have to be fetched, +this could speed up deployments a lot. In order to make use of this, the buildpack must implement +the cache by writing to the cache directory. Most buildpacks already implement this, but when using +custom buildpacks, it might need to be changed to make full use of the cache.
+In some cases, cache might not speed up your application. To disable caching, you can set the
+DRYCC_DISABLE_CACHE
variable with drycc config:set DRYCC_DISABLE_CACHE=1
. When you disable the
+cache, Drycc will clear up files it created to store the cache. After having it turned off, run
+drycc config:unset DRYCC_DISABLE_CACHE
to re-enable the cache.
Use the following procedure to clear the cache:
+$ drycc config:set DRYCC_DISABLE_CACHE=1
+$ git commit --allow-empty -m "Clearing Drycc cache"
+$ git push drycc # (if you use a different remote, you should use your remote name)
+$ drycc config:unset DRYCC_DISABLE_CACHE
+
+By default, Workflow only checks that the application starts in their Container. If it is preferred +to have Kubernetes respond to application health, a health check may be added by configuring a +health check probe for the application.
+The health checks are implemented as Kubernetes container probes. A liveness
+and a readiness
probe can be configured, and each probe can be of type httpGet
, exec
, or
+tcpSocket
depending on the type of probe the container requires.
A liveness probe is useful for applications running for long periods of time, eventually +transitioning to broken states and cannot recover except by restarting them.
+Other times, a readiness probe is useful when the container is only temporarily unable to serve, +and will recover on its own. In this case, if a container fails its readiness probe, the container +will not be shut down, but rather the container will stop receiving incoming requests.
+httpGet
probes are just as it sounds: it performs a HTTP GET operation on the Container. A
+response code inside the 200-399 range is considered a pass.
exec
probes run a command inside the Container to determine its health, such as
+cat /var/run/myapp.pid
or a script that determines when the application is ready. An exit code of
+zero is considered a pass, while a non-zero status code is considered a fail.
tcpSocket
probes attempt to open a socket in the Container. The Container is only considered
+healthy if the check can establish a connection. tcpSocket
probes accept a port number to perform
+the socket connection on the Container.
Health checks can be configured on a per-proctype basis for each application using drycc healthchecks:set
. If no type is mentioned then the health checks are applied to default proc type web, whichever is present. To
+configure a httpGet
liveness probe:
$ drycc healthchecks:set liveness httpGet 80 --ptype web
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
If the application relies on certain headers being set (such as the Host
header) or a specific
+URL path relative to the root, you can also send specific HTTP headers:
$ drycc healthchecks:set liveness httpGet 80 \
+ --path /welcome/index.html \
+ --headers "X-Client-Version:v1.0,X-Foo:bar"
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[X-Client-Version=v1.0] path=/welcome/index.html port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
To configure an exec
readiness probe:
$ drycc healthchecks:set readiness exec -- /bin/echo -n hello --ptype web
+Applying readinessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ readiness web exec /bin/echo -n hello delay=50s timeout=50s period=10s #success=1 #failure=3
+
You can overwrite a probe by running drycc healthchecks:set
again:
$ drycc healthchecks:set readiness httpGet 80 --ptype web
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
Configured health checks also modify the default application deploy behavior. When starting a new +Pod, Workflow will wait for the health check to pass before moving onto the next Pod.
+By default, Changes the config, limits or healthchecks and so on will trigger deploy. +If you don’t want deploy, you can disable.
+$ drycc autodeploy:disable
+
To re-enable autodeploy.
+drycc autodeploy:enable
+
you can deploy by executing the following command. +deploy all ptypes
+drycc releases:deploy
+
deploy web process type, and support --force
option to force deploy.
drycc releases:deploy web --force
+
By default, deployment failures will roll back to the previous successful version. +If you don’t want this to happen, you can disable.
+$ drycc autorollback:disable
+
To re-enable autorollback.
+drycc autorollback:enable
+
Workflow supports isolating applications onto a set of nodes using drycc tags
.
!!! note +In order to use tags, you must first launch your cluster with the proper node labels. If you do +not, tag commands will fail. Learn more by reading “Assigning Pods to Nodes”.
+Once your nodes are configured with appropriate label selectors, use drycc tags:set
to restrict
+the application ptype to those nodes:
$ drycc tags:set web environ=prod
+Applying tags... done, v4
+
+environ prod
+
+Create an authentication token using the drycc client.
+# drycc tokens:add prometheus --password admin --username admin
+ ! WARNING: Make sure to copy your token now.
+ ! You won't be able to see it again, please confirm whether to continue.
+ ! To proceed, type "yes" !
+
+> yes
+UUID USERNAME TOKEN
+58176cf1-37a8-4c52-9b27-4c7a47269dfb admin 1F2c7A802aF640fd9F31dD846AdDf56BcMsay
+
A valid example file can be found here.
+The global configuration specifies parameters that are valid in all other configuration contexts. They also serve as defaults for other configuration sections.
+global:
+ scrape_interval: 60s
+ evaluation_interval: 60s
+scrape_configs:
+- job_name: 'drycc'
+ scheme: https
+ metrics_path: /v2/apps/<appname>/metrics
+ authorization:
+ type: Token
+ credentials: 1F2c7A802aF640fd9F31dD846AdDf56BcMsay
+ static_configs:
+ - targets: ['drycc.domain.com']
+
+Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code
+pushed to the platform (via git push drycc master
), or an update to application configuration (via drycc config:set KEY=VAL
).
Each time a build or config change is made to your application a new release is created. These release numbers +increase monotonically.
+You can see a record of changes to your application using drycc releases
:
$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Drycc Workflow also supports rolling back go previous releases. If buggy code or an errant configuration change is pushed +to your application, you may rollback to a previously known, good release.
+!!! note +All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point.
+In this example, the application is currently running release v4. Using drycc rollback v2
tells Workflow to deploy the
+build and configuration that was used for release v2. This creates a new release named v5 whose contents are the source
+and configuration from release v2:
$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
+$ drycc rollback v2
+Rolled back to v2
+
+$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v4 2023-12-04T10:20:46Z dev rolled back to v2
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Only rollback web process type:
+$ drycc rollback v3 web
+Rolled back to v3
+
+$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v5 2023-12-04T10:23:49Z dev rolled back to v3
+dev succeed v4 2023-12-04T10:20:46Z dev rolled back to v2
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Drycc applications use one-off processes for admin tasks like database migrations and other commands that must run against the live application.
+Use drycc run
to execute commands on the deployed application.
$ drycc run 'ls -l'
+Running `ls -l`...
+
+total 28
+-rw-r--r-- 1 root root 553 Dec 2 23:59 LICENSE
+-rw-r--r-- 1 root root 60 Dec 2 23:59 Procfile
+-rw-r--r-- 1 root root 33 Dec 2 23:59 README.md
+-rw-r--r-- 1 root root 1622 Dec 2 23:59 pom.xml
+drwxr-xr-x 3 root root 4096 Dec 2 23:59 src
+-rw-r--r-- 1 root root 25 Dec 2 23:59 system.properties
+drwxr-xr-x 6 root root 4096 Dec 3 00:00 target
+
+Use drycc perms:add
to allow another Drycc user to collaborate on your application.
$ drycc perms:add otheruser view,change,delete
+Adding user otheruser as a collaborator for view,change,delete peachy-waxwork... done
+
Use drycc perms
to see who an application is currently shared with, and drycc perms:remove
to remove a collaborator.
!!! note +Collaborators can do anything with an application that its owner can do, except delete the application.
+When working with an application that has been shared with you, clone the original repository and add Drycc’ git remote
+entry before attempting to git push
any changes to Drycc.
$ git clone https://github.com/drycc/example-java-jetty.git
+Cloning into 'example-java-jetty'... done
+$ cd example-java-jetty
+$ git remote add -f drycc ssh://git@local3.dryccapp.com:2222/peachy-waxworks.git
+Updating drycc
+From drycc-controller.local:peachy-waxworks
+ * [new branch] master -> drycc/master
+
Applications deployed on Drycc Workflow treat logs as event streams. Drycc Workflow aggregates stdout
and stderr
+from every Container making it easy to troubleshoot problems with your application.
Use drycc logs
to view the log output from your deployed application.
$ drycc logs -f
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.Server:jetty-7.6.0.v20120127
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10005
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10006
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10007
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10008
+
+
+We can use the blow command to create volumes and mount the created volumes. +Drycc create volume support ReadWriteMany, so before deploying drycc, you need to have a StorageClass ready which can support ReadWriteMany. +Deploying drycc, set controller.appStorageClass to this StorageClass.
+Use drycc volumes
to mount a volume for a deployed application’s processes.
$ drycc help volumes
+Valid commands for volumes:
+
+volumes:create create a volume for the application
+volumes:list list volumes in the application
+volumes:delete delete a volume from the application
+volumes:client the client used to manage volume files
+volumes:mount mount a volume to process of the application
+volumes:unmount unmount a volume from process of the application
+
+Use 'drycc help [command]' to learn more.
+
+You can create a csi volume with the drycc volumes:create
command.
$ drycc volumes:create myvolume 200M
+Creating myvolumes to scenic-icehouse... done
+
+Or use an existing nfs server
+$ drycc volumes:create myvolume 200M -t nfs --nfs-server=nfs.drycc.com --nfs-path=/
+Creating myvolumes to scenic-icehouse... done
+
+After volume is created, you can list the volumes in this application.
+$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes 200M
+
+The volume which is named myvolumes is created, you can mount the volume with process of the application,
+use the command of drycc volumes:mount
. When volume is mounted, a new release will be created and deployed automatically.
$ drycc volumes:mount myvolumes web=/data/web
+Mounting volume... done
+
+And use drycc volumes:list
show mount detail.
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes 200M
+web /data/web
+
+If you don’t need the volume, use drycc volumes:unmount
to unmount the volume and then use drycc volumes:delete
to delete the volume from the application.
+Before deleting volume, the volume has to be unmounted.
$ drycc volumes:unmount myvolumes web
+Unmounting volume... done
+
+$ drycc volumes:delete myvolumes
+Deleting myvolumes from scenic-icehouse... done
+
+Assume the volume which is named myvolumes is created and mounted.
+Prepare a file named testfile.
+$ echo "testtext" > testfile
+
+Upload. +$ drycc volumes:client cp testfile vol://myvolume/ +[↑] testfile 100% [==================================================] (5/ 5 B, 355 B/s)
+List files in myvolume.
+$ drycc volumes:client ls vol://myvolume/
+[2024-07-22T15:32:28+08:00] 5 testfile
+
+Delete testfle in myvolume.
+$ drycc volumes:client rm vol://myvolume/testfile
+
+A Gateway describes how traffic can be translated to Services within the cluster. That is, it defines a request for a way to translate traffic from somewhere that does not know about Kubernetes to somewhere that does. For example, traffic sent to a Kubernetes Service by a cloud load balancer, an in-cluster proxy, or an external hardware load balancer. While many use cases have client traffic originating “outside” the cluster, this is not a requirement.
+Gateway is a way of exposing services externally, which generates an external IP address to connect route and service. +After deploy, the gateway has been created.
+List the containers:
+# drycc gateways
+NAME LISENTER PORT PROTOCOL ADDRESSES
+python-getting-started tcp-80-0 80 HTTP 101.65.132.51
+
You can also add a port in this gateway or create a one.
+# drycc gateways:add python-getting-started --port=443 --protocol=HTTPS
+Adding gateway python-getting-started to python-getting-started... done
+
Service is a way of exposing services internally, creating a service generates an internal DNS that can access ptype
.
+the web process type has been created, for others types, you should add as needed.
List the services:
+$ drycc services
+PTYPE PORT PROTOCOL TARGET-PORT DOMAIN
+web 80 TCP 8000 python-getting-started.python-getting-started.svc.cluster.local
+
Add a new service for process type
+# drycc services:add --help
+# drycc services:add sleep 8001:8001
+
A Gateway may be attached to one or more Route references which serve to direct traffic for a subset of traffic to a specific service. +Same as the above, the web process type already bind the gateway and servies.
+# drycc routes
+NAME OWNER PTYPE KIND SERVICE-PORT GATEWAY LISTENER-PORT
+python-getting-started demo web HTTPRoute 80 python-getting-started 80
+
create a new route and attach gateway.
+drycc routes:create sleep --ptype=sleep --kind=HTTPRoute --port=8001
+drycc routes:attach sleep --gateway=python-getting-started --port=80
+
+We can use blow command to create resources and bind which resource is created. +This command depend on service-catalog.
+Use drycc resources
to create and bind a resource for a deployed application.
$ drycc help resources
+
+Valid commands for resources:
+
+resources:services list all available resource services
+resources:plans list all available plans for an resource services
+resources:create create a resource for the application
+resources:list list resources in the application
+resources:describe get a resource detail info in the application
+resources:update update a resource from the application
+resources:destroy delete a resource from the applicationa
+resources:bind bind a resource to servicebroker
+resources:unbind unbind a resource from servicebroker
+
+Use 'drycc help [command]' to learn more.
+
+You can list available resource services with one drycc resources:services
command
$ drycc resources:services
+ID NAME UPDATEABLE
+15032a52-33c2-4b40-97aa-ceb972f51509 airflow true
+b7cb26a4-b258-445c-860b-a664239a67f8 cloudbeaver true
+9ce3c3ba-33b5-4e4e-a5e9-a338a83d5070 flink true
+b80c51a1-957c-4d93-b3d5-efde84cd8031 fluentbit true
+fff5b6c7-ed85-429b-8265-493e40cc53c7 grafana true
+412e368f-bf78-4798-92cc-43343119a57d kafka true
+ea2a9b87-fbc4-4e2a-adee-161c1f91d98d minio true
+383f7316-84f3-4955-8491-1d4b02b749c8 mongodb true
+fbee746b-f3a7-4bef-8b55-cbecfd4c8ac3 mysql-cluster true
+5975094d-45cc-4e85-8573-f93937d026c7 opensearch true
+1db95161-7193-4544-8c76-e5ad5f6c03f6 pmm true
+5cfb0abf-276c-445b-9060-9aa964ede87d postgresql-cluster true
+b8f70264-eafc-4b2f-848e-2ec0d059032b prometheus true
+f8186d36-f334-4094-8e02-d21a61da657b rabbitmq true
+e1fd0d37-9046-4152-a29b-d155c5657c8b redis true
+7d2b64c6-0b59-4f08-a2f5-7b17cea6e5ee redis-cluster true
+2e6877df-86e7-4bcc-a869-2a9b6847a465 seaweedfs true
+4aea5c0f-9495-420d-896a-ffc61a3eced5 spark true
+b50db3b5-8d5f-4be9-b8bd-467ecd6cc11d zookeeper true
+
+You can list all available plans for an resource services with one drycc resources:plans
command
$ drycc resources:plans redis
+ID NAME DESCRIPTION
+8d659058-a3b4-4058-b039-cc03a31b9442 standard-128 Redis standard-128 plan which limit resources memory size 128Mi.
+36e3dbec-fc51-4f6b-9baa-e31e316858be standard-256 Redis standard-256 plan which limit resources memory size 256Mi.
+560817c2-5aa1-41c4-9ee6-a77e3ee552d5 standard-512 Redis standard-512 plan which limit resources memory size 512Mi.
+d544d989-9fb8-43e9-a74e-0840ce1b8f0f standard-1024 Redis standard-1024 plan which limit resources memory size 1Gi.
+ad51b7bb-9b12-4ffd-8e49-010c0141b263 standard-2048 Redis standard-2048 plan which limit resources memory size 2Gi.
+5097d76e-557c-453f-bdb1-54009e0df78d standard-4096 Redis standard-4096 plan which limit resources memory size 4Gi.
+be3fa2d0-36d2-47c5-9561-9deffe5ba373 standard-8192 Redis standard-8192 plan which limit resources memory size 8Gi.
+4ca812a8-d7c3-439f-96cd-26523e88400e standard-16384 Redis standard-16384 plan which limit resources memory size 16Gi.
+b7f2a71f-0d97-48fd-8eed-aab24a7822f3 standard-32768 Redis standard-32768 plan which limit resources memory size 32Gi.
+25c6b5d5-7505-47c8-95b1-dc9bdc698063 standard-65536 Redis standard-65536 plan which limit resources memory size 64Gi.
+
+You can create a resource with one drycc resources:create
command
$ drycc resources:create redis:1000 redis
+Creating redis to scenic-icehouse... done
+
+After resources are created, you can list the resources in this application.
+$ drycc resources:list
+UUID NAME OWNER PLAN UPDATED
+07220e9e-d54d-4d74-a88c-f464aa374386 redis admin redis:standard-128 2024-05-08T01:01:00Z
+
+The resource which is named redis is created, you can bind the redis to the application,
+use the command of drycc resources:bind redis
.
$ drycc resources:bind redis
+Binding resource... done
+
+And use drycc resources:describe
show the binding detail. If the binding is successful, this command will show the information of connect to the resource.
$ drycc resources:describe redis
+=== scenic-icehouse resource redis
+plan: redis:1000
+status: Ready
+binding: Ready
+
+REDISPORT: 6379
+REDIS_PASSWORD: RzG87SJWG1
+SENTINELHOST: 172.16.0.2
+SENTINELPORT: 26379
+
+You can use the drycc resources:update
command to upgrade a new plan.
+An example of how to upgrade the plan’s capacity to 100MB:
$ drycc resources:update redis:10000 redis
+Updating redis to scenic-icehouse... done
+
+If you don’t need resources, use drycc resources:unbind
to unbind the resource and then use drycc resources:destroy
to delete the resource from the application.
+Before deleting the resource, the resource must be unbinded.
$ drycc resources:unbind redis
+Unbinding resource... done
+
+$ drycc resources:destroy redis
+Deleting redis from scenic-icehouse... done
+
+
+A common architecture pattern of multi-process applications is to have one process serve public requests while having multiple other processes supporting the public one to, for example, perform actions on a schedule or process work items from a queue. To implement this system of apps in Drycc Workflow, set up the apps to communicate using DNS resolution, as shown above, and hide the supporting processes from public view by removing them from the Drycc Workflow router.
+Drycc Workflow supports deploying a single app composed of a system of processes. Each Drycc Workflow app communicates on a single port, so communicating with another Workflow app means finding that app’s address and port. All Workflow apps are mapped to port 80 externally, so finding its IP address is the only challenge. Workflow creates a Kubernetes Service for each app, which effectively assigns a name and one cluster-internal IP address to an app. The DNS service running in the cluster adds and removes DNS records which point from the app name to its IP address as services are added and removed. Drycc Workflow apps, then, can simply send requests to the domain name given to the service, which is “app-name.app-namespace”.
+ +Drycc Workflow supports restricting memory and CPU shares of each process. Requests/Limits set on a per-process type are given to
+Kubernetes as a requests and limits. Which means you guarantee <requests> amount of resource for a process as well as limit
+the process from using more than <limits>.
+By default, Kubernetes will set <requests> equal to <limit> if we don’t explicitly set <requests> value. Please keep in mind that 0 <= requests <= limits
.
If you set a requests/limits that is out of range for your cluster, Kubernetes will be unable to schedule your application +processes into the cluster!
+$ drycc limits:plans
+
+ID SPEC CPU VCPUS MEMORY FEATURES
+std1.large.c1m1 std1 Universal CPU 1 1 GiB Integrated GPU shared
+std1.large.c1m2 std1 Universal CPU 1 2 GiB Integrated GPU shared
+std1.large.c1m4 std1 Universal CPU 1 4 GiB Integrated GPU shared
+std1.large.c1m8 std1 Universal CPU 1 8 GiB Integrated GPU shared
+std1.large.c2m2 std1 Universal CPU 2 2 GiB Integrated GPU shared
+std1.large.c2m4 std1 Universal CPU 2 4 GiB Integrated GPU shared
+std1.large.c2m8 std1 Universal CPU 2 8 GiB Integrated GPU shared
+std1.large.c2m16 std1 Universal CPU 2 16 GiB Integrated GPU shared
+
+$ drycc limits:set web=std1.large.c1m1
+Applying limits... done
+
+You can use drycc domains
to add or remove custom domains to the application:
$ drycc domains:add hello.bacongobbler.com --ptype=web
+Adding hello.bacongobbler.com to finest-woodshed... done
+
+Once that’s done, you can go into a DNS registrar and set up a CNAME from the new +appname to the old one:
+$ dig hello.dryccapp.com
+[...]
+;; ANSWER SECTION:
+hello.bacongobbler.com. 1759 IN CNAME finest-woodshed.dryccapp.com.
+finest-woodshed.dryccapp.com. 270 IN A 172.17.8.100
+
+!!! note +Setting a CNAME for a root domain can cause issues. Setting an @ record +to be a CNAME causes all traffic to go to the other domain, including mail and the SOA +(“start-of-authority”) records. It is highly recommended that you bind a subdomain to +an application, however you can work around this by pointing the @ record to the +address of the load balancer (if any).
+To add or remove the application from the routing mesh, use drycc routing
:
$ drycc routing:disable
+Disabling routing for finest-woodshed... done
+
+This will make the application unreachable through the Router, but the application is still +reachable internally through its Kubernetes Service. To re-enable routing:
+$ drycc routing:enable
+Enabling routing for finest-woodshed... done
+
+
+SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web +requests. Apps that transmit sensitive data should enable SSL to ensure all information is +transmitted securely.
+To enable SSL on a custom domain, e.g., www.example.com
, use the SSL endpoint.
!!! note
+drycc certs
is only useful for custom domains. Default application domains are
+SSL-enabled already and can be accessed simply by using https,
+e.g. https://foo.dryccapp.com
(provided that you have installed your wildcard
+certificate on the routers or on the load balancer).
Because of the unique nature of SSL validation, provisioning SSL for your domain is a multi-step +process that involves several third-parties. You will need to:
+Purchasing an SSL cert varies in cost and process depending on the vendor. RapidSSL offers a +simple way to purchase a certificate and is a recommended solution. If you’re able to use this +provider, see buy an SSL certificate with RapidSSL for instructions.
+Once the SSL certificate is provisioned and your cert is confirmed, you must route requests for +your domain through Drycc. Unless you’ve already done so, add the domain specified when generating +the CSR to your app with:
+$ drycc domains:add www.example.com --ptype==web -a foo
+Adding www.example.com to foo... done
+
+Add your certificate, any intermediate certificates, and private key to the endpoint with the
+certs:add
command.
$ drycc certs:add example-com server.crt server.key -a foo
+Adding SSL endpoint... done
+www.example.com
+
+!!! note +The name given to the certificate can only contain a-z (lowercase), 0-9 and hyphens
+The Drycc platform will investigate the certificate and extract any relevant information from it +such as the Common Name, Subject Alt Names (SAN), fingerprint and more.
+This allows for wildcard certificates and multiple domains in the SAN without uploading duplicates.
+Sometimes, your certificates (such as a self-signed or a cheap certificate) need additional +certificates to establish the chain of trust. What you need to do is bundle all the certificates +into one file and give that to Drycc. Importantly, your site’s certificate must be the first one:
+$ cat server.crt server.ca > server.bundle
+
+After that, you can add them to Drycc with the certs:add
command:
$ drycc certs:add example-com server.bundle server.key -a foo
+Adding SSL endpoint... done
+www.example.com
+
+Certificates are not automagically connected up to domains, instead you will have to attach a +certificate to a domain
+$ drycc certs:attach example-com example.com -a foo
+
+Each certificate can be connected to many domains. There is no need to upload duplicates.
+To remove an association
+$ drycc certs:detach example-com example.com -a foo
+
+You can verify the details of your domain’s SSL configuration with drycc certs
.
$ drycc certs
+
+ Name | Common Name | SubjectAltName | Expires | Fingerprint | Domains | Updated | Created
++-------------+-------------------+-------------------+-------------------------+-----------------+--------------+-------------+-------------+
+ example-com | example.com | blog.example.com | 31 Dec 2017 (in 1 year) | 8F:8E[...]CD:EB | example.com | 30 Jan 2016 | 29 Jan 2016
+
+or by looking at at each certificates detailed information
+$ drycc certs:info example-com -a foo
+
+=== bar-com Certificate
+Common Name(s): example.com
+Expires At: 2017-01-14 23:57:57 +0000 UTC
+Starts At: 2016-01-15 23:57:57 +0000 UTC
+Fingerprint: 7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0
+Subject Alt Name: blog.example.com
+Issuer: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+Subject: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+
+Connected Domains: example.com
+Owner: admin-user
+Created: 2016-01-28 19:07:41 +0000 UTC
+Updated: 2016-01-30 00:10:02 +0000 UTC
+
+Use a command line utility like curl
to test that everything is configured correctly for your
+secure domain.
!!! note +The -k option flag tells curl to ignore untrusted certificates.
+Pay attention to the output. It should print SSL certificate verify ok
. If it prints something
+like common name: www.example.com (does not match 'www.somedomain.com')
then something is not
+configured correctly.
To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by +running
+$ drycc tls:force:enable -a foo
+Enabling https-only requests for foo... done
+
+Users hitting the HTTP endpoint for the application will now receive a 301 redirect to the HTTPS +endpoint.
+To disable enforced TLS, run
+$ drycc tls:force:disable -a foo
+Disabling https-only requests for foo... done
+
+With Automated Certificate Management (ACM), Drycc automatically manages TLS certificates for apps with Hobby and Professional dynos on the Common Runtime, and for apps in Private Spaces that enable the feature. +Certificates handled by ACM automatically renew one month before they expire, and new certificates are created automatically whenever you add or remove a custom domain. All applications with paid dynos include ACM for free. +Automated Certificate Management uses Let’s Encrypt, the free, automated, and open certificate authority for managing your application’s TLS certificates. Let’s Encrypt is run for the public benefit by the Internet Security Research Group (ISRG).
+To enable ACM with the following command: +$ drycc tls:auto:enable -a foo
+To disable ACM with the following command: +$ drycc tls:auto:disable -a foo
+You can remove a certificate using the certs:remove
command:
$ drycc certs:remove my-cert -a foo
+Removing www.example.com... Done.
+
+Over the lifetime of an application an operator will have to acquire certificates with new expire +dates and apply it to all relevant applications, below is the recommended way to swap out certificates.
+Be intentional with certificate names, name them example-com-2017
when possible, where the year
+signifies the expiry year. This allows for example-com-2018
when a new certificate is purchased.
Assuming all applications are already using example-com-2017
the following commands can be ran,
+chained together or otherwise:
$ drycc certs:detach example-com-2017 example.com -a foo
+$ drycc certs:attach example-com-2018 example.com -a foo
+
+This will take care of a singular domain which allows the operator to verify everything went +as planned and slowly roll it out to any other application using the same method.
+Here are some steps you can follow if your SSL endpoint is not working as you’d expect.
+In some cases when accessing the SSL endpoint, it may list your certificate as untrusted.
+If this occurs, it may be because it is not trusted by Mozilla’s list of root CAs. If this is +the case, your certificate may be considered untrusted for many browsers.
+If you have uploaded a certificate that was signed by a root authority but you get the message that
+it is not trusted, then something is wrong with the certificate. For example, it may be missing
+intermediary certificates. If so, download the intermediary certificates from your SSL provider,
+remove the certificate from Drycc and re-run the certs:add
command.
The Drycc stack is intended for advanced use cases only. Unless you have a specific need for custom Docker images, we recommend using Drycc’s default buildpack-powered build system. It offers automatic base image security updates and language-specific optimizations. It also avoids the need to maintain a .containerDockerfile
+A manifest has three top-level sections.
+Here’s an example that illustrates using a manifest to build Docker images.
+build:
+ docker:
+ web: Dockerfile
+ worker: worker/Dockerfile
+ config:
+ web:
+ FOO: bar
+ worker:
+ RAILS_ENV: development
+run:
+- command:
+ - ./deployment-tasks.sh
+ image: worker
+ # If the field is empty, it means it will be executed forever
+ when:
+ ptypes:
+ - web
+ - webbbsbs
+ # Maximum execution time
+ timeout: 100
+deploy:
+ web:
+ command:
+ - bash
+ - -ec
+ args:
+ - bundle exec puma -C config/puma.rb
+ worker:
+ command:
+ - bash
+ - -ec
+ args:
+ - python myworker.py
+ asset-syncer:
+ command:
+ - bash
+ - -ec
+ args:
+ - python asset-syncer.py
+ image: worker
+
For more deployment information, please refer to the drycc examples.
+ +After you add the Drycc Chart Repository, you can customize the chart using
+helm inspect values drycc/workflow > values.yaml
before using helm install
to complete the
+installation.
There are a few ways to customize the respective component:
+If the value is exposed in the values.yaml
file as derived above, one may modify the section of the component to tune these settings. The modified value(s) will then take effect at chart installation or release upgrade time via either of the two respective commands:
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ -n drycc \
+ --namespace drycc \
+ -f values.yaml
+ $ helm upgrade drycc oci://registry.drycc.cc/charts/workflow \
+ -n drycc \
+ --namespace drycc \
+ -f values.yaml
+
+If the value hasn’t yet been exposed in the values.yaml
file, one may edit the component deployment with the tuned setting. Here we edit the drycc-controller
deployment:
$ kubectl --namespace drycc edit deployment drycc-controller
+
+Add/edit the setting via the appropriate environment variable and value under the env
section and save. The updated deployment will recreate the component pod with the new/modified setting.
Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself:
+ $ helm fetch oci://registry.drycc.cc/charts/workflow --untar
+ $ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml
+
+Then run helm install ./workflow --namespace drycc --name drycc
to apply the changes, or helm upgrade drycc ./workflow
if the cluster is already running.
You can set resource limits to Workflow components by modifying the values.yaml file fetched
+earlier. This file has a section for each Workflow component. To set a limit to any Workflow
+component just add limitsCpu
, limitsMemory
in the section and set them to the appropriate
+values.
Below is an example of how the builder section of values.yaml
might look with CPU and memory
+limits set:
builder:
+ imageOrg: "drycc"
+ imagePullPolicy: "Always"
+ imageTag: "canary"
+ limitsCpu: "100m"
+ limitsMemory: "50Mi"
+
The following environment variables are tunable for the Builder component:
+Setting | +Description | +
---|---|
DEBUG | +Enable debug log output (default: false) | +
BUILDER_POD_NODE_SELECTOR | +A node selector setting for builder job. As it may sometimes consume a lot of node resources, one may want a given builder job to run in a specific node only, so it won’t affect critical nodes. for example pool:testing,disk:magnetic |
+
The following environment variables are tunable for the Controller component:
+Setting | +Description | +
---|---|
REGISTRATION_MODE | +set registration to “enabled”, “disabled”, or “admin_only” (default: “admin_only”) | +
GUNICORN_WORKERS | +number of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1) | +
RESERVED_NAMES | +a comma-separated list of names which applications cannot reserve for routing (default: “drycc, drycc-builder”) | +
DRYCC_DEPLOY_HOOK_URLS | +a comma-separated list of URLs to send deploy hooks to. | +
DRYCC_DEPLOY_HOOK_SECRET_KEY | +a private key used to compute the HMAC signature for deploy hooks. | +
DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSING | +rejects a deploy if the previous build had a Procfile but the current deploy is missing it. A 409 is thrown in the API. Prevents accidental process types removal. (default: “false”, allowed values: “true”, “false”) | +
DRYCC_DEPLOY_PROCFILE_MISSING_REMOVE | +when turned on (default) any missing process type in a Procfile compared to the previous deploy is removed. When set to false will allow an empty Procfile to go through without removing missing process types, note that new images, configs and so on will get updated on all proc types. (default: “true”, allowed values: “true”, “false”) | +
DRYCC_DEFAULT_CONFIG_TAGS | +set tags for all applications by default, for example: ‘{“role”: “worker”}’. (default: ‘’) | +
KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPEC | +set resource quota to application namespace by setting ResourceQuota spec, for example: {"spec":{"hard":{"pods":"10"}}} , restrict app owner to spawn more then 10 pods (default: “”, no quota will be applied to namespace) |
+
Configuration options for LDAP authentication are detailed here.
+The following environment variables are available for enabling LDAP +authentication of user accounts in the Passport component:
+Setting | +Description | +
---|---|
LDAP_ENDPOINT | +The URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: “”, example: ldap://hostname ). |
+
LDAP_BIND_DN | +The distinguished name to use when binding to the LDAP server (default: “”) | +
LDAP_BIND_PASSWORD | +The password to use with LDAP_BIND_DN (default: “”) | +
LDAP_USER_BASEDN | +The distinguished name of the search base for user names (default: “”) | +
LDAP_USER_FILTER | +The name of the login field in the users search base (default: “username”) | +
LDAP_GROUP_BASEDN | +The distinguished name of the search base for user’s groups names (default: “”) | +
LDAP_GROUP_FILTER | +The filter for user’s groups (default: “”, example: objectClass=person ) |
+
Setting | +Description | +
---|---|
DRYCC_DEPLOY_BATCHES | +the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) | +
DRYCC_DEPLOY_TIMEOUT | +deploy timeout in seconds per deploy batch (default: 120) | +
IMAGE_PULL_POLICY | +the kubernetes image pull policy for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”) | +
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT | +how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) | +
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS | +how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) | +
See the Deploying Apps guide for more detailed information on those.
+The following environment variables are tunable for the Database component:
+Setting | +Description | +
---|---|
BACKUP_FREQUENCY | +how often the database should perform a base backup (default: “12h”) | +
BACKUPS_TO_RETAIN | +number of base backups the backing store should retain (default: 5) | +
The following values can be changed in the values.yaml
file or by using the --values
flag with the Helm CLI.
Key | +Description | +
---|---|
config.service | +The service section defines the global properties of the service. | +
config.inputs | +An input section defines a source (related to an input plugin). | +
config.filters | +A filter section defines a filter (related to a filter plugin) | +
config.outputs | +The outputs section specify a destination that certain records should follow after a Tag match. | +
For more information about the various variables that can be set please see the fluentbit.
+The following environment variables are tunable for the Logger component:
+Setting | +Description | +
---|---|
STORAGE_ADAPTER | +How to store logs that are sent to the logger. Legal values are “file”, “memory”, and “redis”. (default: “redis”) | +
NUMBER_OF_LINES | +How many lines to store in the ring buffer (default: 1000) | +
We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the values.yaml
file or by using the --set
flag with the Helm CLI. You can see these options below:
Setting | +Default Value | +Description | +
---|---|---|
user | +“admin” | +The first user created in the database (this user has admin privileges) | +
password | +“admin” | +Password for the first user. | +
allow_sign_up | +“true” | +Allows users to sign up for an account. | +
For a list of other options you can set by using environment variables please see the configuration file in Github.
+For a list of configuration values that can be set by using environment variables please see the following configuration file.
+You can find a list of values that can be set using environment variables here.
+The Registry component can be tuned by following the +drycc/distribution config doc.
+The majority of router settings are tunable through annotations, which allows the router to be +re-configured with zero downtime post-installation. You can find the list of annotations to tune +here.
+The following environment variables are tunable for the [Router][] component:
+Setting | +Description | +
---|---|
POD_NAMESPACE | +The pod namespace the router resides in. This is set by the Kubernetes downward API. | +
The following environment variables are tunable for [Workflow Manager][]:
+Setting | +Description | +
---|---|
CHECK_VERSIONS | +Enables the external version check at https://versions.drycc.info/ (default: “true”) | +
POLL_INTERVAL_SEC | +The interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours) | +
VERSIONS_API_URL | +The versions API URL (default: “https://versions-staging.drycc.info”) | +
DOCTOR_API_URL | +The doctor API URL (default: “https://doctor-staging.drycc.info”) | +
API_VERSION | +The version number Workflow Manager sends to the versions API (default: “v2”) | +
For example, assuming example.com
were a cluster’s domain:
drycc.example.com
<application name>.example.com
Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster’s domain be directed to the cluster node(s) hosting the platform’s router component, which is capable of directing traffic within the cluster to the correct endpoints.
+Generally, it is recommended that a [load balancer][] be used to direct inbound traffic to one or more routers. In such a case, configuring DNS is as simple as defining a wildcard record in DNS that points to the load balancer.
+For example, assuming a domain of example.com
:
A
record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)CNAME
record referencing an existing fully-qualified domain name for the load balancer
+DNS for any applications using a “custom domain” (a fully-qualified domain name that is not a subdomain of the cluster’s own domain) can be configured by creating a CNAME
record that references the wildcard record described above.
Although it is dependent upon your distribution of Kubernetes and your underlying infrastructure, in many cases, the IP(s) or existing fully-qualified domain name of a load balancer can be determined directly using the kubectl
tool:
$ kubectl --namespace=istio-nginx describe service | grep "LoadBalancer"
+LoadBalancer Ingress: a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com
+
The LoadBalancer Ingress
field typically describes an existing domain name or public IP(s). Note that if Kubernetes is able to automatically provision a load balancer for you, it does so asynchronously. If the command shown above is issued very soon after Workflow installation, the load balancer may not exist yet.
On some platforms (Minikube, for instance), a load balancer is not an easy or practical thing to provision. In these cases, one can directly identify the public IP of a Kubernetes node that is hosting a router pod and use that information to configure the local /etc/hosts
file.
Because wildcard entries do not work in a local /etc/hosts
file, using this strategy may result in frequent editing of that file to add fully-qualified subdomains of a cluster for each application added to that cluster. Because of this a more viable option may be to utilize the xip.io service.
In general, for any IP, a.b.c.d
, the fully-qualified domain name any-subdomain.a.b.c.d.xip.io
will resolve to the IP a.b.c.d
. This can be enormously useful.
To begin, find the node(s) hosting router instances using kubectl
:
$ kubectl --namespace=istio-ingress describe pod | grep Node:
+Node: ip-10-0-0-199.us-west-2.compute.internal/10.0.0.199
+Node: ip-10-0-0-198.us-west-2.compute.internal/10.0.0.198
+
The command will display information for every router pod. For each, a node name and IP are displayed in the Node
field. If the IPs appearing in these fields are public, any of these may be used to configure your local /etc/hosts
file or may be used with xip.io. If the IPs shown are not public, further investigation may be needed.
You can list the IP addresses of a node using kubectl
:
$ kubectl describe node ip-10-0-0-199.us-west-2.compute.internal
+# ...
+Addresses: 10.0.0.199,10.0.0.199,54.218.85.175
+# ...
+
Here, the Addresses
field lists all the node’s IPs. If any of them are public, again, they may be used to configure your local /etc/hosts
file or may be used with xip.io.
In this section, we’ll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster.
+We’ll assume the following in this section:
+mystuff.com
domain name registered with a registrar
+mystuff.com
in the instructions to followHere are the steps for configuring cloud DNS to route to your drycc cluster:
+kubectl get svc -n istio-ingress
and look for the LoadBalancer Ingress
column to get the IP addressNetworking
=> Cloud DNS
, then click on Create Zone
)mystuff.com.
(note the .
at the endCreate
buttonAdd Record Set
button on the resulting pageDNS Name
: *
Resource Record Type
: A
TTL
: the DNS TTL of your choosing. If you’re testing or you anticipate that you’ll tear down and rebuild many drycc clusters over time, we recommend a low TTLIPv4 Address
: The IP that you got in the very first stepCreate
buttonlbdomain.com
, enter the following fields in the resulting form:DNS Name
: *
Resource Record Type
: CNAME
TTL
: the DNS TTL of your choosing. If you’re testing or you anticipate that you’ll tear down and rebuild many drycc clusters over time, we recommend a low TTLCanonical name
: lbdomain.com.
(note the .
a the end)Create
buttonmystuff.com
domain to the ones under the data
column in the NS
record on the same page. They’ll often be something like the below (note the trailing .
characters).ns-cloud-b1.googledomains.com.
+ns-cloud-b2.googledomains.com.
+ns-cloud-b3.googledomains.com.
+ns-cloud-b4.googledomains.com.
+
Note: If you ever have to re-create your drycc cluster, simply go back to step 6.4 or 7.4 (depending on your load balancer) and change the IP address or domain name to the new value. You may have to wait for the TTL you set to expire.
+To test that traffic reaches its intended destination, a request can be +sent to the Drycc controller like so (do not forget the trailing slash!):
+curl http://drycc.example.com/v2/
+
Or:
+curl http://drycc.54.218.85.175.xip.io/v2/
+
Since such requests require authentication, a response such as the following should be considered an indicator of success:
+{"detail":"Authentication credentials were not provided."}
+
+It’s useful to help keep the development team informed about deploys, while +it can also be used to integrate different systems together.
+After one or more hooks are setup, hook output and errors appear in your application’s logs:
+$ drycc logs
+...
+2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks
+
Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy +hooks by tuning the controller settings via the Helm chart.
+The HTTP deploy hook performs an HTTP POST to a URL. The parameters included in the request are the
+same as the variables available in the hook message: app
, release
, release_summary
, sha
and
+user
. See below for their descriptions:
app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv
+
Optionally, if a deploy hook secret key is added to the controller through
+tuning the controller settings, a new Authorization
header will be
+present in the POST request. The value of this header is computed as the HMAC hex digest of the
+request URL, using the secret as the key.
In order to authenticate that this request came from Workflow, use the secret key, the full URL and +the HMAC-SHA1 hashing algorithm to compute the signature. In Python, that would look something like +this:
+import hashlib
+import hmac
+
+hmac.new("my_secret_key", "http://drycc.rocks?app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv", digestmod=hashlib.sha1).hexdigest()
+
If the value of the computed HMAC hex digest and the value in the Authorization
header are
+identical, then the request came from Workflow.
!!! important +When computing the signature, ensure that the URL parameters are in alphabetic order. This is +critical when computing the cryptographic signature as most web applications don’t care about +the order of the HTTP parameters, but the cryptographic signature will not be the same.
+ +The logging platform is made up of 2 components - Fluentbit and Logger.
+Fluentbit runs on every worker node of the cluster and is deployed as a Daemon Set. The Fluentbit pods capture all of the stderr and stdout streams of every container running on the host (even those not hosted directly by kubernetes). Once the log message arrives in our custom fluentbit plugin we determine where the message originated.
+If the message was from the Workflow Controller or from an application deployed via workflow we send it to the logs topic on the local Redis Stream instance.
+Logger then acts as a consumer reading messages off of the Redis Stream logs topic storing those messages in a local Redis instance. When a user wants to retrieve log entries using the drycc logs
command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis.
Even though we provide a redis instance with the default Workflow install, it is recommended that operators use a third-party source like Elasticache or similar offering. This way your data is durable across upgrades or outages. If you have a third-party Redis installation you would like to use all you need to do is set the following values in your helm chart:
+These can be changed by running helm inspect values drycc/workflow > values.yaml
before using
+helm install
to complete the installation. To customize the redis credentials, edit values.yaml
+and modify the redis
section of the file to tune these settings.
If the drycc logs
command encounters an error it will return the following message:
Error: There are currently no log messages. Please check the following things:
+1) Logger and fluentbit pods are running.
+2) The application is writing logs to the logger component by checking that an entry in the ring buffer was created: kubectl --namespace=drycc logs <logger pod>
+3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec <fluentbit pod> ls /var/log/containers
+
┌────────┐
+ │ Router │ ┌────────┐ ┌─────┐
+ └────────┘ │ Logger │◀───▶│Redis│
+ │ └────────┘ └─────┘
+ Log file ▲
+ │ │
+ ▼ │
+┌────────┐ ┌─────────┐ logs/metrics ┌──────────────┐
+│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │
+└────────┘ └─────────┘ └──────────────┘
+
+
Fluent Bit is based in a pluggable architecture where different plugins plays a major role in the data pipeline, more than 70 built-in plugins available. +Please refer to charts values.yaml for specific configurations.
+ +We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:
+┌────────────────┐
+│ HOST │
+│ node-exporter │◀──┐ ┌──────────────────┐
+└────────────────┘ │ │kube-state-metrics│
+ │ └──────────────────┘
+┌────────────────┐ │ ▲
+│ HOST │ │ ┌────────────┐ │
+│ node-exporter │◀──┼────│ Prometheus │─────────────┘
+└────────────────┘ │ └────────────┘
+ │ ▲
+┌───────────────┐ │ │
+│ HOST │ │ ▼
+│ node-exporter│◀───┘ ┌──────────┐
+└───────────────┘ │ Grafana │
+ └──────────┘
+
Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a service annotation through the router at the following URL: http://grafana.mydomain.com
. The default login is admin/admin
. If you are interested in changing these values please see [Tuning Component Settings][].
Grafana will preload several dashboards to help operators get started with monitoring Kubernetes and Drycc Workflow. +These dashboards are meant as starting points and don’t include every item that might be desirable to monitor in a +production installation.
+Drycc Workflow monitoring by default does not write data to the host filesystem or to long-term storage. If the Grafana instance fails, modified dashboards are lost.
+A production install of Grafana should have the following configuration values changed if possible:
+admin/admin
. The value for the password is passed in plain text so it is best to set this value on the command line instead of checking it into version control.Enabling persistence will allow your custom configuration to persist across pod restarts. This means that the default sqllite database (which stores things like sessions and user data) will not disappear if you upgrade the Workflow installation.
+If you wish to have persistence for Grafana you can set enabled
to true
in the values.yaml
file before running helm install
.
grafana:
+ # Configure the following ONLY if you want persistence for on-cluster grafana
+ # GCP PDs and EBS volumes are supported only
+ persistence:
+ enabled: true # Set to true to enable persistence
+ size: 5Gi # PVC size
+
If you wish to provide your own Grafana instance you can set grafanaLocation
in the values.yaml
file before running helm install
.
Prometheus writes data to the host disk; however, if the prometheus pod dies and comes back on another host, the data will not be recovered. The prometheus graph UI is also exposed through the router allowing users to access the query engine by going to prometheus.mydomain.com
.
You can set node-exporter
and kube-state-metrics
to true
or false
in the values.yaml
.
+If you wish to have persistence for Prometheus you can set enabled
to true
in the values.yaml
file before running helm install
.
prometheus:
+ prometheus-server:
+ persistence:
+ enabled: true # Set to true to enable persistence
+ size: 10Gi # PVC size
+node-exporter:
+ enabled: true
+kube-state-metrics:
+ enabled: true
+
To use off-cluster Prometheus, please provide the following values in the values.yaml
file before running helm install
.
global.prometheusLocation=off-cluster
url = "http://my.prometheus.url:9090"
In production, persistent storage can be achieved by running an external object store. +For users on AWS, GCE/GKE or Azure, the convenience of Amazon S3, Google GCS or Microsoft Azure Storage +makes the prospect of running a Storage-less Workflow cluster quite reasonable. For users who have restriction +on using external object storage using swift object storage can be an option.
+Running a Workflow cluster without Storage provides several advantages:
+See Configuring Object Storage for details on removing this operational complexity.
+There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.
+By default, registration with the Workflow controller is in “admin_only” mode. The first user
+to run a drycc register
command becomes the initial “admin” user, and registrations after that
+are disallowed unless requested by an admin.
Please see the following documentation to learn about changing registration mode:
+ +It is also recommended to disable signups for the Grafana dashboards.
+Please see the following documentation to learn about disabling Grafana signups:
+ +If your cluster has RBAC amongst your authorization modes ($ kubectl api-versions
should contains rbac.authorization.k8s.io
) it may be necessary to enable RBAC in Workflow.
+This can be achieved by setting use_rbac
in the global
section of values.yaml
to true
, or by adding --set=global.use_rbac=true
to the $ helm install/upgrade
command.
+RBAC support was announced in Kubernetes-1.5 and is enabled by default if:
Note: helm may need to be given specific permissions under RBAC if not already done.
+Attention: Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this PR for more details.
+ +This upgrade process requires:
+!!! note +If upgrading from a Helm Classic install, you’ll need to ‘migrate’ the cluster to a Kubernetes Helm installation. See Workflow-Migration for steps.
+Helm will remove all components from the previous release. Traffic to applications deployed through +Workflow will continue to flow during the upgrade. No service interruptions should occur.
+If Workflow is not configured to use off-cluster Postgres, the Workflow API will experience a brief +period of downtime while the database recovers from backup.
+First, find the name of the release helm gave to your deployment with helm ls
, then run
$ helm upgrade <release-name> oci://registry.drycc.cc/charts/workflow
+
Note: If using off-cluster object storage on gcs and/or off-cluster registry using gcr and intending to upgrade from a pre-v2.10.0
chart to v2.10.0
or greater, the key_json
values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing values.yaml
used for previous installs, the following may be run:
$ B64_KEY_JSON="$(cat ~/path/to/key.json | base64 -w 0)"
+$ helm upgrade <release_name> drycc/workflow -f values.yaml --set gcs.key_json="${B64_KEY_JSON}",registry-token-refresher.gcr.key_json="${B64_KEY_JSON}"
+
Alternatively, simply replace the appropriate values in values.yaml and do without the --set
+parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when
+upgrading.
Verify that all components have started and passed their readiness checks:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-2448122224-3cibz 1/1 Running 0 5m
+drycc-controller-1410285775-ipc34 1/1 Running 3 5m
+drycc-controller-celery-694f75749b-cmxxn 3/3 Running 0 5m
+drycc-database-e7c5z 1/1 Running 0 5m
+drycc-logger-cgjup 1/1 Running 3 5m
+drycc-logger-fluentbit-45h7j 1/1 Running 0 5m
+drycc-logger-fluentbit-4z7lw 1/1 Running 0 5m
+drycc-logger-fluentbit-k2wsw 1/1 Running 0 5m
+drycc-logger-fluentbit-skdw4 1/1 Running 0 5m
+drycc-redis-8nazu 1/1 Running 0 5m
+drycc-monitor-grafana-tm266 1/1 Running 0 5m
+drycc-monitor-telegraf-51zel 1/1 Running 1 5m
+drycc-monitor-telegraf-cdasg 1/1 Running 0 5m
+drycc-monitor-telegraf-hea6x 1/1 Running 0 5m
+drycc-monitor-telegraf-r7lsg 1/1 Running 0 5m
+drycc-registry-1814324048-yomz5 1/1 Running 0 5m
+drycc-registry-proxy-4m3o4 1/1 Running 0 5m
+drycc-registry-proxy-no3r1 1/1 Running 0 5m
+drycc-registry-proxy-ou8is 1/1 Running 0 5m
+drycc-registry-proxy-zyajl 1/1 Running 0 5m
+drycc-rabbitmq-0 1/1 Running 0 5m
+
Users of Drycc Workflow should now upgrade their drycc client to avoid getting WARNING: Client and server API versions do not match. Please consider upgrading.
warnings.
curl -sfL https://www.drycc.cc/install-cli.sh | bash - && sudo mv drycc $(which drycc)
+
+For information on troubleshooting a failing component, see +Troubleshooting with Kubectl.
+For information on troubleshooting application deployment issues, see +Troubleshooting Applications.
+The most common problem for this issue is the user forgetting to run drycc keys:add
or add their
+private key to their SSH agent. To do so, run ssh-add ~/.ssh/id_rsa
and try running
+git push drycc master
again.
If you happen get a Could not open a connection to your authentication agent
+error after trying to run ssh-add
command above, you may need to load the SSH
+agent environment variables issuing the eval "$(ssh-agent)"
command before.
Running into something not detailed here? Please open an issue or hop into +#community on Slack for help!
+ +This document describes how one can use kubectl
to debug any issues with the cluster.
Using kubectl
, one can inspect the cluster’s current state. When Workflow is installed
+with helm
, Workflow is installed into the drycc
namespace. To inspect if Workflow is
+running, run:
$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-gqum7 0/1 ContainerCreating 0 4s
+drycc-controller-h6lk6 0/1 ContainerCreating 0 4s
+drycc-controller-celery-cmxxn 0/3 ContainerCreating 0 4s
+drycc-database-56v39 0/1 ContainerCreating 0 4s
+drycc-logger-fluentbit-xihr1 0/1 Pending 0 2s
+drycc-logger-grupg 0/1 ContainerCreating 0 3s
+drycc-storage-c2exb 0/1 Pending 0 3s
+drycc-monitor-grafana-9ccur 0/1 Pending 0 3s
+drycc-monitor-telegraf-dc3y3 0/1 Pending 0 2s
+drycc-registry-5bor6 0/1 Pending 0 3s
+drycc-rabbitmq-0 0/1 ContainerCreating 0 3s
+
+!!! tip
+To save precious keystrokes, alias kubectl --namespace=drycc
to kd
so it is easier to type
+in the future.
To fetch the logs of a specific component, use kubectl logs
:
$ kubectl --namespace=drycc logs drycc-controller-h6lk6
+system information:
+Django Version: 1.9.6
+Python 3.5.1
+addgroup: gid '0' in use
+Django checks:
+System check identified no issues (2 silenced).
+[...]
+
+To dive into a running container to inspect its environment, use kubectl exec
:
$ kubectl --namespace=drycc exec -it drycc-database-56v39 gosu postgres psql
+psql (13.4 (Debian 13.4-1.pgdg100+1))
+Type "help" for help.
+
+postgres=# \l
+ List of databases
+ Name | Owner | Encoding | Collate | Ctype | Access privileges
+-------------------+----------+----------+------------+------------+-----------------------
+ drycc_controller | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ drycc_passport | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
+ | | | | | postgres=CTc/postgres
+ template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
+ | | | | | postgres=CTc/postgres
+(4 rows)
+postgres=# \connect drycc_controller
+You are now connected to database "drycc_controller" as user "postgres".
+drycc_controller=# \dt
+ List of relations
+ Schema | Name | Type | Owner
+--------+--------------------------------+-------+-------------------
+ public | api_app | table | drycc_controller
+ public | api_build | table | drycc_controller
+ public | api_certificate | table | drycc_controller
+ public | api_config | table | drycc_controller
+ public | api_domain | table | drycc_controller
+ public | api_key | table | drycc_controller
+ public | api_push | table | drycc_controller
+ public | api_release | table | drycc_controller
+ public | auth_group | table | drycc_controller
+ --More--
+ drycc_controller=# SELECT COUNT(*) from api_app;
+ count
+-------
+ 0
+(1 row)
+
+
+When you deploy an application to Workflow using git push drycc master
and the Builder
+attempts to deploy using the Buildpack workflow, check the following steps:
git push drycc <branch>
)?Dockerfile
in the project’s root directory?Dockerfile
to the project?If you deployed your application but it is failing to start, you can use drycc logs
to check
+why the application fails to boot. Sometimes, the application container may fail to boot without
+logging any information about the error. This typically occurs when the healthcheck configured for
+the application fails. In this case, you can start by
+troubleshooting using kubectl. You can inspect the application’s current
+state by examining the pod deployed in the application’s namespace. To do that, run
$ kubectl --namespace=myapp get pods
+NAME READY STATUS RESTARTS AGE
+myapp-web-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s
+
+We can then describe the pod and determine why it is failing to boot:
+Events:
+ FirstSeen LastSeen Count From SubobjectPath Type Reason Message
+ --------- -------- ----- ---- ------------- -------- ------ -------
+ 43s 43s 1 {default-scheduler } Normal Scheduled Successfully assigned myapp-web-1585713350-3brbo to kubernetes-node-1
+ 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Normal Created Created container with container id b86bd851a61f
+ 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Normal Started Started container with container id b86bd851a61f
+ 37s 35s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Warning Unhealthy Liveness probe failed: Get http://10.246.39.13:8000/healthz: dial tcp 10.246.39.13:8000: getsockopt: connection refused
+
+In this instance, we set the healthcheck initial delay timeout for the application at 1 second, +which is too aggressive. The application needs some time to set up the API server after the +container has booted. By increasing the healthcheck initial delay timeout to 10 seconds, the +application is able to boot and is responding correctly.
+See Custom Health Checks for more information on how to customize the application’s +health checks to better suit the application’s needs.
+ +Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.
+The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.
+Proposals and issues can be opened by anyone. Every member of the community is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.
+The Roadmap gets delivered progressively via the Release Schedule. Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.
+Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the Release Schedule.
+Release Planning Meetings are open to the public with access coordinated via the Drycc #community Slack channel. +Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.
+Thanks to Amy Lindburg and our friends at Podman for their inspiration.
+ +The Drycc Workflow Roadmap is a community document created as part of the open +Planning Process. Each roadmap item describes a high-level capability or +grouping of features that are deemed important to the future of Drycc.
+Given the project’s rapid Release Schedule, roadmap +items are designed to provide a sense of direction over many releases.
+drycc run /bin/bash
Provide the ability for developers to launch an interactive terminal session in +their application environment.
+Related issues:
+ +Stream application logs via drycc logs -f
https://github.com/drycc/drycc/issues/465
Teams and Permissions represents a more flexible permissions model to allow +more nuanced control to applications, capabilities and resources on the +platform. There have been a number of proposals in this area which need to be +reconciled for Drycc Workflow before we begin implementation.
+Related issues:
+Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +https://github.com/drycc/drycc/issues/231
+Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.
+Drycc uses a continuous delivery approach for creating releases. Every merged commit that passes +testing results in a deliverable that can be given a semantic version tag and shipped.
+The master git
branch of a project should always work. Only changes considered ready to be
+released publicly are merged.
Drycc components release new versions as often as needed. Fixing a high priority bug requires the +project maintainer to create a new patch release. Merging a backward-compatible feature implies +a minor release.
+By releasing often, each component release becomes a safe and routine event. This makes it faster +and easier for users to obtain specific fixes. Continuous delivery also reduces the work +necessary to release a product such as Drycc Workflow, which integrates several components.
+“Components” applies not just to Drycc Workflow projects, but also to development and release +tools, to Container base images, and to other Drycc projects that do semantic version releases.
+See “How to Release a Component” for more detail.
+Drycc Workflow has a regular, public release cadence. From v2.8.0 onward, new Workflow feature +releases arrive on the first Thursday of each month. Patch releases are created at any time, +as needed. GitHub milestones are used to communicate the content and timing of major and minor +releases, and longer-term planning is visible at the Roadmap.
+Workflow release timing is not linked to specific features. If a feature is merged before the +release date, it is included in the next release.
+See “How to Release Workflow” for more detail.
+Drycc releases comply with semantic versioning, with the “public API” broadly +defined as:
+In general, changes to anything a user might reasonably link to, customize, or integrate with +should be backward-compatible, or else require a major release. Drycc users can be confident that +upgrading to a patch or to a minor release will not break anything.
+Most Drycc projects are “components” which produce a Container image or binary executable as a +deliverable. This section leads a maintainer through creating a component release.
+Major or minor releases should happen on the master branch. Patch releases +should check out the previous release tag and cherry-pick specific commits from master.
+Note: if a patch release, the release artifact will have to be manually promoted by triggering +the component-promote job with the following values:
+COMPONENT_NAME=<component name>
+COMPONENT_SHA=<patch commit sha>
+
Make sure you have the dryccrel release tool in your search $PATH
.
Run dryccrel release
once with a fake semver tag to proofread the changelog content. (If HEAD
+of master is not what is intended for the release, add the --sha
flag as described
+in dryccrel release --help
.)
$ dryccrel release controller v0.0.0
+Doing a dry run of the component release...
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v0.0.0
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+
Based on the changelog content, determine whether the component deserves a minor or patch
+release. Run the command again with that semver tag and --dry-run=false
. You will still be
+asked for confirmation before the release is created:
$ dryccrel release controller v2.8.2 --dry-run=false
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v2.8.2
+
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+
+
+Please review the above changelog contents and ensure:
+ 1. All intended commits are mentioned
+ 2. The changes agree with the semver release tag (major, minor, or patch)
+
+Create release for Drycc Controller v2.8.2? [y/n]: y
+New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2
+
Tagging the component (see Step 1) +starts a CI job that eventually results in an artifact being made available for public download. +Please see the CI flow diagrams for details.
+Double-check that the artifact is available, either by a podman pull
command or by running the
+appropriate installer script.
If the artifact can’t be downloaded, ensure that its CI release jobs are still in progress, or
+fix whatever issue arose in the pipeline. For example, the
+master merge pipeline
+may have failed to promote the :git-abc1d23
candidate image and needs to be restarted with
+that component and commit.
If the component has a correlating Kubernetes Helm chart, +this chart will also be packaged, signed and uploaded to its production chart repo. Please +verify it can be fetched (and verified):
+$ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0
+Verification: &{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz}
+
Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart +deliverable. This section leads a maintainer through creating a Workflow release.
+Export two environment variables that will be used in later steps:
+export WORKFLOW_RELEASE=v2.17.0 WORKFLOW_PREV_RELEASE=v2.16.0 # for example
+
Some Workflow components not in the Helm chart must also be tagged in sync with the release. +Follow the component release process above and ensure that +these components are tagged:
+ +The version number for drycc/workflow-cli should always match the overall Workflow version +number.
+To create and stage a release candidate chart for Workflow, we will build the workflow-chart-stage job with the following parameters:
+RELEASE_TAG=$WORKFLOW_RELEASE
This job will gather all of the latest component release tags and use these to specify the versions of all component charts. +It will then package the Workflow chart, upload it to the staging chart repo and kick off an e2e run against said chart.
+Now it’s time to go above and beyond current CI tests. Create a testing matrix spreadsheet (copying +from the previous document is a good start) and sign up testers to cover all permutations.
+Testers should pay special attention to the overall user experience, make sure upgrading from +earlier versions is smooth, and cover various storage configurations and Kubernetes versions and +infrastructure providers.
+When showstopper-level bugs are found, the process is as follows:
+workflow-chart-stage
job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.When testing has completed without uncovering any new showstopper bugs, kick off the workflow-chart-release job with the following parameter:
+RELEASE_TAG=$WORKFLOW_RELEASE
This job will copy the release candidate chart (now approved by CI and manual testing) from the staging repo to the production repo, signing +it if it has not done so already.
+Each component already updated its release notes on GitHub with CHANGELOG content. We’ll now +generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes.
+We’ll employ the requirements.lock
file from the WORKFLOW_PREV_RELEASE
chart, as well as a repo-to-chart-name mapping file, this time invoking dryccrel changelog global
to get all component changes between
+the chart versions existing in the WORKFLOW_PREV_RELEASE
chart and the most recent releases existing in GitHub.
+(Therefore, if there are any unreleased commits in a component repo, they will not appear here):
helm fetch --untar oci://registry.drycc.cc/charts/workflow --version $WORKFLOW_PREV_RELEASE
+dryccrel changelog global workflow/requirements.lock map.json > changelog-$WORKFLOW_RELEASE.md
+
This master changelog should then be placed into a single gist. The file will also be added to the documentation +update PR created in the next step.
+Create a new pull request at drycc/workflow that updates version references to the new release.
+Use git grep $WORKFLOW_PREV_RELEASE
to find any references, but be careful not to change
+CHANGELOG.md
.
Place the $WORKFLOW_RELEASE
master changelog generated in Step 7 in the changelogs
directory.
+Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.:
## Workflow v2.16.0 -> v2.17.0
+
Once the PR has been reviewed and merged, do a component release of +drycc/workflow itself. The version number for drycc/workflow should always match the +overall Workflow version number.
+Create a pull request at seed-repo to close the release +milestone and create the next one. When changes are merged to seed-repo, milestones on all +relevant projects will be updated. If there are open issues attached to the milestone, move them +to the next upcoming milestone before merging the pull request.
+Milestones map to Drycc Workflow releases in drycc/workflow. These milestones do not correspond +to individual component release tags.
+Now that the $WORKFLOW_RELEASE
version of Workflow CLI has been vetted, we can push stable
artifacts based on this version.
Kick off https://ci.drycc.info/job/workflow-cli-build-stable/ with the TAG
build parameter of $WORKFLOW_RELEASE
+and then verify stable
artifacts are available and appropriately updated after the job completes:
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+$ ./drycc version
+# (Should show $WORKFLOW_RELEASE)
+
Let the rest of the team know they can start blogging and tweeting about the new Workflow release. +Post a message to the #company channel on Slack. Include a link to the released chart and to the +master CHANGELOG:
+@here Drycc Workflow v2.17.0 is now live!
+Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/
+
You’re done with the release. Nice job!
+ +Find a bug? Want to see a new feature? Have a request for the maintainers? Open a Github issue in the applicable repository and we’ll get the conversation started.
+Our official support channel is the Drycc #community Slack channel.
+Don’t know what the applicable repository for an issue is? Open up in issue in workflow or chat with a maintainer in the Drycc #community Slack channel and we’ll make sure it gets to the right place.
+Additionally, take a look at the troubleshooting documentation for common issues.
+Before opening a new issue, it’s helpful to search and see if anyone else has already reported the problem. You can search through a list of issues for all Drycc projects here.
+We are always looking to improve and expand our documentation. Most docs reside in the drycc/workflow repository. Simply fork the project, update docs and send us a pull request.
+We are always looking for help improving the core platform, other workloads, tooling, and test coverage. Interested in contributing code? Let’s chat in the Drycc #community Slack channel. Make sure to check out issues tagged easy fix or help wanted.
+When you’re ready to begin writing code, review Design Documents and get your Development Environment set up.
+By contributing to any Drycc project you agree to its Developer Certificate of Origin (DCO). This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.
+If you don’t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See Triaging Issues for more info.
+Interact with the community on our user mailing list or live in our Drycc #community Slack channel, where you can chat with other Drycc Workflow users any time of day.
+ +Before submitting a pull request which will significantly alter the behavior of any Drycc component, such as a new feature or major refactoring, contributors should first open an issue representing a design document.
+Design documents help ensure project contributors:
+Design document issues should be named Design Doc: <change description>
and contain the following sections:
This section should briefly describe the proposed change and the motivations behind it. Tests will be written to ensure this design goal is met by the change.
+This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.
+This section should detail the code changes necessary to accomplish the change, as well as the proposed implementation. This should be as detailed as necessary to help reviewers understand the change.
+All changes should be covered by automated tests, either unit or integration tests (ideally both). This section should detail how tests will be written to validate that the change accomplishes the design goals and doesn’t introduce any regressions.
+If a change cannot be sufficiently covered by automated testing, the design should be reconsidered. If there is no test coverage whatsoever for an affected section of code, a separate issue should be filed to integrate automated testing with that section of the codebase.
+The tests described here also form the acceptance criteria for the change, so that when it’s completed maintainers can merge the pull request after confirming the tests pass CI.
+A design document follows the same merge approval review process as final pull requests do, and maintainers will take extra care to ensure that any stakeholders for the change are included in the discussion and review of the design document.
+Once the design is accepted, the author can complete the change and submit a pull request for review. The pull request should close both the design document for the change as well as any issues that either track the issue or are closed as a result of the change.
+See Submitting a Pull Request for more information on pull request and commit message formatting.
+ +In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components.
+We try to make it simple to hack on Drycc components. However, there are necessarily several moving pieces and some setup required. We welcome any suggestions for automating or simplifying this process.
+!!! note +The Drycc team is actively engaged in containerizing Go and Python based development environments tailored specifically for Drycc development in order to minimize the setup required. This work is ongoing. Refer to the drycc/router project for a working example of a fully containerized development environment.
+If you’re just getting into the Drycc codebase, look for GitHub issues with the label easy-fix. These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc.
+In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:
+linux/amd64
For drycc/controller, in particular, you will also need:
+pip
)sudo pip install virtualenv
)In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below.
+If your local workstation does not support the linux/amd64
target environment, you will have to install Go from source with cross-compile support for that environment. This is because some of the components are built on your local machine and then injected into a container.
Homebrew users can just install with cross compiling support:
+$ brew install go --with-cc-common
+
It is also straightforward to build Go from source:
+$ sudo su
+$ curl -sSL https://golang.org/dl/go1.5.src.tar.gz | tar -v -C /usr/local -xz
+$ cd /usr/local/go/src
+$ # compile Go for our default platform first, then add cross-compile support
+$ ./make.bash --no-clean
+$ GOOS=linux GOARCH=amd64 ./make.bash --no-clean
+
Once you can compile to linux/amd64
, you should be able to compile Drycc components as normal.
Once the prerequisites have been met, we can begin to work with Drycc components.
+Begin at Github by forking whichever Drycc project you would like to contribute to, then clone that fork locally. Since Drycc is predominantly written in Go, the best place to put it is under $GOPATH/src/github.com/drycc/
.
$ mkdir -p $GOPATH/src/github.com/drycc
+$ cd $GOPATH/src/github.com/drycc
+$ git clone git@github.com:<username>/<component>.git
+$ cd <component>
+
!!! note
+By checking out the forked copy into the namespace github.com/drycc/<component>
, we are tricking the Go toolchain into seeing our fork as the “official” source tree.
If you are going to be issuing pull requests to the upstream repository from which you forked, we suggest configuring Git such that you can easily rebase your code to the upstream repository’s main branch. There are various strategies for doing this, but the most common is to add an upstream
remote:
$ git remote add upstream https://github.com/drycc/<component>.git
+
For the sake of simplicity, you may want to point an environment variable to your Drycc code - the directory containing one or more Drycc components:
+$ export DRYCC=$GOPATH/src/github.com/drycc
+
Throughout the rest of this document, $DRYCC
refers to that location.
A number of Drycc contributors prefer to pull directly from drycc/<component>
, but push to <username>/<component>
. If that workflow suits you better, you can set it up this way:
$ git clone git@github.com:drycc/<component>.git
+$ cd drycc
+$ git config remote.origin.pushurl git@github.com:<username>/<component>.git
+
In this setup, fetching and pulling code will work directly with the upstream repository, while pushing code will send changes to your fork. This makes it easy to stay up to date, but also make changes and then issue pull requests.
+With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.
+Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.
+Although writing and executing tests are critical to ensuring code quality, most contributors will also want to deploy their changes to a live environment, whether to make use of those changes or to test them further. The remainder of this section documents the procedure for running officially released Drycc components in a development cluster and replacing any one of those with your customizations.
+To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.
+To facilitate deploying Container images containing your changes to your Kubernetes cluster, you will need to make use of a Container registry. This is a location to where you can push your custom-built images and from where your Kubernetes cluster can retrieve those same images.
+If your development cluster runs locally (in Minikube, for instance), the most efficient and economical means of achieving this is to run a Container registry locally as a Container container.
+To facilitate this, most Drycc components provide a make target to create such a registry:
+$ make dev-registry
+
In a Linux environment, to begin using the registry:
+export DRYCC_REGISTRY=<IP of the host machine>:5000
+
In non-Linux environments:
+export DRYCC_REGISTRY=<IP of the drycc Container Machine VM>:5000
+
If your development cluster runs on a cloud provider such as Google Container Engine, a local registry such as the one above will not be accessible to your Kubernetes nodes. In such cases, a public registry such as [DockerHub][dh] or quay.io will suffice.
+To use DockerHub for this purpose, for instance:
+$ export DRYCC_REGISTRY="registry.drycc.cc"
+$ export IMAGE_PREFIX=<your DockerHub username>
+
To use quay.io:
+$ export DRYCC_REGISTRY=quay.io
+$ export IMAGE_PREFIX=<your quay.io username>
+
Note the importance of the trailing slash.
+With a functioning Kubernetes cluster and the officially released Drycc components installed onto it, deployment and further testing of any Drycc component you have made changes to is facilitated by replacing the officially released component with a custom built image that contains your changes. Most Drycc components include Makefiles with targets specifically intended to facilitate this workflow with minimal friction.
+In the general case, this workflow looks like this:
+git
make build
to build a new Container imagemake dev-release
to generate Kubernetes manifest(s)make deploy
to restart the component using the updated manifestThis can be shortened to a one-liner using just the deploy
target:
$ make deploy
+
Once your customized Drycc component has been deployed, here are some helpful commands that will allow you to inspect your cluster and to troubleshoot, if necessary:
+$ kubectl --namespace=drycc get pods
+
This is often useful for troubleshooting pods that are in pending or crashed states:
+$ kubectl --namespace=drycc describe -f <pod name>
+
$ kubectl --namespace=drycc logs -f <pod name>
+
Specific to drycc/controller
+$ kubectl --namespace=drycc exec -it <pod name> -- python manage.py shell
+
Have commands other Drycc contributors might find useful? Send us a PR!
+Satisfied with your changes? Share them!
+Please read Submitting a Pull Request. It contains a checklist of +things you should do when proposing a change to any Drycc component.
+ +Each Drycc component includes its own suite of style checks, unit tests, and black-box type functional tests.
+Integration tests verify the behavior of the Drycc components together as a system and are provided separately by the drycc/workflow-e2e project.
+GitHub pull requests for all Drycc components are tested automatically by the Travis CI continuous integration system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase.
+Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.
+The style checks, unit tests, and functional tests for each component can all be executed via make targets:
+To execute style checks:
+$ make test-style
+
To execute unit tests:
+$ make test-unit
+
To execute functional tests:
+$ make test-functional
+
To execute style checks, unit tests, and functional tests all in one shot:
+$ make test
+
To execute integration tests, refer to drycc/workflow-e2e documentation.
+ +Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.
+It’s hard to reach agreement on the merit of a PR when it isn’t focused. When fixing an issue or implementing a new feature, resist the temptation to refactor nearby code or to fix that potential bug you noticed. Instead, open a separate issue or pull request. Keeping concerns separated allows pull requests to be tested, reviewed, and merged more quickly.
+Squash and rebase the commit or commits in your pull request into logical units of work with git
. Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix.
Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as “closes #1234”. The issue referenced will automatically be closed when your PR is merged.
+If you significantly alter or add functionality to a component that impacts the broader Drycc Workflow PaaS, you should submit a complementary PR to modify or amend end-to-end integration tests. These integration tests can be found in the drycc/workflow-e2e repository.
+See testing for more information.
+Changes to any Drycc Workflow component that could affect a user’s experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component’s own documentation. In some cases where a component is tightly integrated into drycc/workflow, its documentation must also be updated.
+If a pull request is part of a larger piece of work involving one or more additional commits in other Workflow repositories, these commits can be referenced in the last PR to be submitted. The downstream e2e test job will then supply every referenced commit (derived from PR issue number supplied) to the test runner so it can source the necessary Container images for inclusion in the generated Workflow chart to be tested.
+For example, consider paired commits in drycc/controller and drycc/workflow-e2e. The commit body for the first PR in drycc/workflow-e2e
would look like:
feat(foo_test): add e2e test for feature foo
+
+[skip e2e] test for controller#42
+
Adding [skip e2e]
forgoes the e2e tests on this commit. This and any other required PRs aside from the final PR should be submitted first, so that their respective build and image push jobs run.
Lastly, the final PR in drycc/controller
should be created with the required PR number(s) listed, in the form of [Rr]equires <repoName>#<pullRequestNumber>
, for use by the downstream e2e run.
feat(foo): add feature foo
+
+Requires workflow-e2e#42
+
Drycc components are implemented in Go and Python. For both languages, we agree with The Zen of Python, which emphasizes simple over clever. Readability counts.
+Go code should always be run through gofmt
on the default settings. Lines of code may be up to 99 characters long. Documentation strings and tests are required for all exported functions. Use of third-party go packages should be minimal, but when doing so, such dependencies should be managed via the glide tool.
Python code should always adhere to PEP8, the python code style guide, with the exception that lines of code may be up to 99 characters long. Docstrings and tests are required for all public methods, although the flake8 tool used by Drycc does not enforce this.
+We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs +from AngularJS. This is an example of a commit:
+feat(scripts/test-cluster): add a cluster test command
+
+this uses tmux to setup a test cluster that you can easily kill and
+start for debugging.
+
To make it more formal, it looks something like this:
+{type}({scope}): {subject}
+<BLANK LINE>
+{body}
+<BLANK LINE>
+{footer}
+
The allowed {types}
are as follows:
feat
-> featurefix
-> bug fixdocs
-> documentationstyle
-> formattingref
-> refactoring codetest
-> adding missing testschore
-> maintenanceThe {scope}
can be anything specifying the location(s) of the commit change(s).
The {subject}
needs to be an imperative, present tense verb: “change”, not “changed” nor
+“changes”. The first letter should not be capitalized, and there is no dot (.) at the end.
Just like the {subject}
, the message {body}
needs to be in the present tense, and includes
+the motivation for the change, as well as a contrast with the previous behavior. The first
+letter in a paragraph must be capitalized.
All breaking changes need to be mentioned in the {footer}
with the description of the
+change, the justification behind the change and any migration notes required.
Any line of the commit message cannot be longer than 72 characters, with the subject line +limited to 50 characters. This allows the message to be easier to read on GitHub as well +as in various git tools.
+Any code change - other than a simple typo fix or one-line documentation change - requires at least two Drycc maintainers to accept it. Maintainers tag pull requests with “LGTM1” and “LGTM2” (Looks Good To Me) labels to indicate acceptance.
+No pull requests can be merged until at least one core maintainer signs off with an LGTM. The other LGTM can come from either a core maintainer or contributing maintainer.
+If the PR is from a Drycc maintainer, then he or she should be the one to close it. This keeps the commit stream clean and gives the maintainer the benefit of revisiting the PR before deciding whether or not to merge the changes.
+An exception to this is when an errant commit needs to be reverted urgently. If necessary, a PR that only reverts a previous commit can be merged without waiting for LGTM approval.
+ +Drycc software is fully open source. As such, the “Drycc community” consists of anyone who uses the Drycc software and participates in its evolution, whether by answering questions, finding bugs, suggesting enhancements, or writing documentation or code.
+Drycc development is coordinated through numerous project repositories on GitHub. Anyone can check out the source code for any Drycc component, fork it, make improvements, and create a pull request to offer those changes back to the Drycc community.
+Engine Yard maintains the numerous Drycc projects, and as such, decides what ends up in the official GitHub repositories. Drycc depends on the contributions of the community; the maintainers will not ignore pull requests or issues.
+Drycc uses the timeless, highly efficient, and totally unfair system known as “Benevolent Dictator for Life” (BDFL). Gabriel Monroy, the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc.
+Drycc projects are bounty-friendly. We believe open source bounty sites can be constructive tools in the development of open source software. Community members are encouraged to a) offer bounties and b) receive bounties for open source contributions that benefit everyone. The Drycc maintainers, however, will not accept bounties on this project but are more than happy to help community members attempting bounties.
+ +Triage helps ensure issues resolve quickly by:
+If you don’t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.
+Before triaging an issue very far, make sure that the issue’s author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that should be included in most issues are things such as:
+Depending on the issue, you might not feel all this information is needed. Use your best judgment. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem.
+If the author provides the recommended information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author’s time.
+If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided.
+An issue can have multiple of the following labels:
+Kind | +Description | +
---|---|
bug | +Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. | +
docs | +Writing documentation, man pages, articles, blogs, or other significant word-driven task. | +
enhancement | +Enhancements can drastically improve usability or performance of a component. | +
question | +Contains a user or contributor question requiring a response. | +
security | +Security-related issues such as TLS encryption, network segregation, authn/authz features, etc. | +
“Easy Fix” issues are a way for a new contributor to find issues that are fit for their experience level. These issues are typically for users who are new to Drycc, and possibly Go, and is looking to help while learning the basics.
+When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.
+Priority | +Description | +
---|---|
priority 0 | +Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release. | +
priority 1 | +Serious: Impedes user actions or is a regression. Fix this before the next planned release. | +
And that’s it. That should be all the information required for a new or existing contributor to come in an resolve an issue.
+ +The Drycc community welcomes and encourages participation by everyone.
+No matter how you identify yourself or how others perceive you: we welcome you. We welcome contributions from everyone as long as they interact constructively with our community.
+The Drycc developer community continues to grow, and it is inevitable that disagreements and conflict will arise. We ask that participants conduct themselves according to these principles:
+Be welcoming, friendly, and patient.
+Be considerate.
+Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we’re a world-wide community, so you might not be communicating in someone else’s primary language.
+Not all of us will agree all the time, but disagreement is no excuse for poor behavior and bad manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one.
+Be kind to others. Do not insult or put down other participants. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are never appropriate for the community.
+(Thanks to the Debian and Django communities for their text and +their inspiration.)
+ +(Unabashedly stolen from the Podman project)
+There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:
+Maintainers are often under-appreciated, because their work is harder to appreciate. +It’s easy to appreciate a really cool and technically advanced feature. It’s harder +to appreciate the absence of bugs, the slow but steady improvement in stability, +or the reliability of a release process. But those things distinguish a good +project from a great one.
+Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.
+Drycc follows the timeless, highly efficient and totally unfair system known as Benevolent dictator +for life.
+Gabriel Monroy (@gabrtv), as creator of the Drycc project, serves as our +project’s BDFL. While the day-to-day project management is carried out by the maintainers, Gabriel +serves as the final arbiter of any disputes and has the final say on project direction.
+Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc +full-time, although this is not a requirement.
+The duties of a core maintainer include:
+The current list of core maintainers can be seen here.
+No pull requests can be merged until at least one core maintainer signs off with an +LGTM. The other LGTM can +come from either a core maintainer or contributing maintainer.
+Contributing maintainers are exceptionally knowledgeable about some but not necessarily all areas +of Drycc, and are often selected due to specific domain knowledge that complements the project (but +a willingness to continually contribute to the project is most important!). Often, +core maintainers will ask a contributing maintainer to weigh in on issues, pull requests, or +conversations where the contributing maintainer is knowledgeable.
+The duties of a contributing maintainer are very similar to those of a core maintainer, but they are limited to areas of the Drycc project where the contributing maintainer is knowledgeable.
+Contributing maintainers are defined in practice as those who have write access to the Drycc repository. All maintainers can review pull requests and add LGTM labels as appropriate.
+The Drycc project wouldn’t be where it is today without its community. Many of the project’s +community members embody the spirit of maintainership, and have contributed substantially to +the project.
+The contributing maintainers group was created in part so that exceptional members of the community +who have an interest in the continued success of the project have the opportunity to join the +core maintainers in guiding the future of Drycc.
+Generally, potential contributing maintainers are selected by the Drycc core maintainers based in +part on the following criteria:
+The Drycc core maintainers must unanimously agree before inviting a community member to join as a +contributing maintainer, although in many cases the candidate has already been acting in the +capacity of a contributing maintainer for some time, and has been consulted on issues, pull requests, +etc.
+ +When using the app ssl feature for non-production applications or when installing SSL for the platform, you can avoid the costs associated with the SSL certificate by using a self-signed SSL certificate. Though the certificate implements full encryption, visitors to your site will see a browser warning indicating that the certificate should not be trusted.
+The openssl library is required to generate your own certificate. Run the following command in your local environment to see if you already have openssl installed.
+$ which openssl
+/usr/bin/openssl
+
+If the which command does not return a path then you will need to install openssl yourself:
+If you have… | +Install with… | +
---|---|
Mac OS X | +Homebrew: brew install openssl |
+
Windows | +complete package .exe installed | +
Ubuntu Linux | +apt-get install openssl |
+
A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a “challenge password”, just press return, leaving the password empty.
+$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
+...
+$ openssl rsa -passin pass:x -in server.pass.key -out server.key
+writing RSA key
+$ rm server.pass.key
+$ openssl req -new -key server.key -out server.csr
+...
+Country Name (2 letter code) [AU]:US
+State or Province Name (full name) [Some-State]:California
+...
+A challenge password []:
+...
+
+The self-signed SSL certificate is generated from the server.key private key and server.csr files.
+$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
+
+The server.crt file is your site certificate suitable for use with Drycc’s SSL endpoint along with the server.key private key.
+ +New! format of POST /v2/apps/<app id>/run
has changed.
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 3
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+New! healthcheck
field in configuration, deprecates the HEALTHCHECK_*
environment variables.
New! Unsetting a configuration variable that does not exist will return a 422.
+New! Creating an identical sequential release returns a 409 rather than create a no-op release.
+Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+New! /v2/auth/whoami
endpoint
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+New! /v2/apps/{name}/logs
endpoint was fixed and no longer returns b'log data'
and instead returns a normal string log data
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+POST /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "https_enforced": true
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "app": "example-go",
+ "owner": "test",
+ "https_enforced": true,
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "app": "example-go",
+ "owner": "test",
+ "https_enforced": false,
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
++This is the multi-page printable view of this section. +Click here to print. +
+An Application is deployed to Drycc using git push
or the drycc
client.
Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled +horizontally, applications must follow the Twelve-Factor App methodology and store any application state in external +backing services.
+For example, if your application persists state to the local filesystem – common with content management systems like
+Wordpress and Drupal – it cannot be scaled horizontally using drycc scale
.
Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.
+!!! important +if you haven’t yet, now is a good time to install the client and register.
+Before deploying an application, users must first authenticate against the Drycc Controller +using the URL supplied by their Drycc administrator.
+$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+
Or you can login with username and password
+$ drycc login http://drycc.example.com --username=demo --password=demo
+Configuration file written to /root/.drycc/client.json
+
Drycc Workflow supports three different ways of building applications:
+Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.
+Learn how to deploy applications using Buildpacks.
+Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing.
+Learn how to deploy applications using Dockerfiles.
+Deploying a Container image onto Drycc allows you to take a Container image from either a public +or a private registry and copy it over bit-for-bit, ensuring that you are running the same +image in development or in your CI pipeline as you are in production.
+Learn how to deploy applications using Container images.
+It is possible to configure a few of the globally tunable settings on per application basis using config:set
.
Setting | +Description | +
---|---|
DRYCC_DISABLE_CACHE | +if set, this will disable the [imagebuilder cache][] (default: not set) | +
DRYCC_DEPLOY_BATCHES | +the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) | +
DRYCC_DEPLOY_TIMEOUT | +deploy timeout in seconds per deploy batch (default: 120) | +
IMAGE_PULL_POLICY | +the kubernetes [image pull policy][pull-policy] for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”) | +
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT | +how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) | +
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS | +how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) | +
Deploy timeout in seconds - There are 2 deploy methods, Deployments (see below) and RC (versions prior to 2.4) and this setting affects those a bit differently.
+Deployments behave a little bit differently from the RC based deployment strategy.
+Kubernetes takes care of the entire deploy, doing rolling updates in the background. As a result, there is only an overall deployment timeout instead of a configurable per-batch timeout.
+The base timeout is multiplied with DRYCC_DEPLOY_BATCHES
to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.
This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES
.
The base timeout is extended as well with healthchecks using initialDelaySeconds
on liveness
and readiness
where the bigger of those two is applied.
+Additionally the timeout system accounts for slow image pulls by adding an additional 10 minutes when it has seen an image pull take over 1 minute. This allows the timeout values to be reasonable without having to account for image pull slowness in the base deploy timeout.
Workflow uses Deployments for deploys. In prior versions ReplicationControllers were used with the ability to turn on Deployments via DRYCC_KUBERNETES_DEPLOYMENTS=1
.
The advantage of Deployments is that rolling-updates will happen server-side in Kubernetes instead of in Drycc Workflow Controller, +along with a few other Pod management related functionality. This allows a deploy to continue even when the CLI connection is interrupted.
+Behind the scenes your application deploy will be built up of a Deployment object per process type, +each having multiple ReplicaSets (one per release) which in turn manage the Pods running your application.
+Drycc Workflow will behave the same way with DRYCC_KUBERNETES_DEPLOYMENTS
enabled or disabled (only applicable to versions prior to 2.4).
+The changes are behind the scenes. Where you will see differences while using the CLI is drycc ps:list
will output Pod names differently.
Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.
+For Buildpack based application deploys via git push
, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.
See this document for instructions on how to generate an SSH key.
+Run drycc keys:add
to upload your SSH key to Drycc Workflow.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
Read more about adding/removing SSH Keys here.
+If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow.
+$ git clone https://github.com/drycc/example-go.git
+$ cd example-go
+
+Use drycc create
to create an application on the Controller.
$ drycc create
+Creating application... done, created skiing-keypunch
+Git remote drycc added
+
+Use git push drycc master
to deploy your application.
$ git push drycc master
+Counting objects: 75, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (48/48), done.
+Writing objects: 100% (75/75), 18.28 KiB | 0 bytes/s, done.
+Total 75 (delta 30), reused 58 (delta 22)
+remote: --->
+Starting build... but first, coffee!
+---> Waiting podman running.
+---> Process podman started.
+---> Waiting caddy running.
+---> Process caddy started.
+---> Building pack
+---> Using builder registry.drycc.cc/drycc/buildpacks:bookworm
+Builder 'registry.drycc.cc/drycc/buildpacks:bookworm' is trusted
+Pulling image 'registry.drycc.cc/drycc/buildpacks:bookworm'
+Resolving "drycc/buildpacks" using unqualified-search registries (/etc/containers/registries.conf)
+Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm...
+Getting image source signatures
+...
+---> Skip generate base layer
+---> Python Buildpack
+---> Downloading and extracting Python 3.10.0
+---> Installing requirements with pip
+Collecting Django==3.2.8
+Downloading Django-3.2.8-py3-none-any.whl (7.9 MB)
+Collecting gunicorn==20.1.0
+Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB)
+Collecting sqlparse>=0.2.2
+Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
+Collecting pytz
+Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB)
+Collecting asgiref<4,>=3.3.2
+Downloading asgiref-3.4.1-py3-none-any.whl (25 kB)
+Requirement already satisfied: setuptools>=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0->-r requirements.txt (line 2)) (57.5.0)
+Installing collected packages: sqlparse, pytz, asgiref, gunicorn, Django
+Successfully installed Django-3.2.8 asgiref-3.4.1 gunicorn-20.1.0 pytz-2021.3 sqlparse-0.4.2
+---> Generate Launcher
+...
+Build complete.
+Launching App...
+...
+Done, skiing-keypunch:v2 deployed to Workflow
+
+Use 'drycc open' to view this application in your browser
+
+To learn more, use 'drycc help' or visit https://www.drycc.cc
+
+To ssh://git@drycc.staging-2.drycc.cc:2222/skiing-keypunch.git
+ * [new branch] master -> master
+
+$ curl -s http://skiing-keypunch.example.com
+Powered by Drycc
+Release v2 on skiing-keypunch-v2-web-02zb9
+
+Because a Buildpacks-style application is detected, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of pods running that process.
For convenience, a number of buildpacks come bundled with Drycc:
+Drycc will cycle through the bin/detect
script of each buildpack to match the code you
+are pushing.
!!! note +If you’re testing against the [Scala Buildpack][], the Builder requires at least +512MB of free memory to execute the Scala Build Tool.
+To use a custom buildpack, you need create a .pack_builder
file in your root path app.
$ tee > .pack_builder << EOF
+ > registry.drycc.cc/drycc/buildpacks:bookworm
+ > EOF
+
+On your next git push
, the custom buildpack will be used.
To pull code from private repositories, set the SSH_KEY
environment variable to a private key
+which has access. Use either the path of a private key file or the raw key material:
$ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa
+$ drycc config:set SSH_KEY="""-----BEGIN RSA PRIVATE KEY-----
+(...)
+-----END RSA PRIVATE KEY-----"""
+
+For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public
+key exists in your GitHub settings. Then set SSH_KEY
to the corresponding SSH private key
+and set .pack_builder
to the builder image:
$ tee > .pack_builder << EOF
+ > registry.drycc.cc/drycc/buildpacks:bookworm
+ > EOF
+$ git add .buildpack
+$ git commit -m "chore(buildpack): modify the pack_builder"
+$ git push drycc master
+
+Which way to build a project conforms to the following principles:
+container
buildpack
container
is used by defaultDRYCC_STACK
to container
or buildpack
determine which stack to use.Drycc supports deploying applications via Dockerfiles. A Dockerfile automates the steps for crafting a [Container Image][]. +Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment.
+For Dockerfile based application deploys via git push
, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.
See this document for instructions on how to generate an SSH key.
+Run drycc keys:add
to upload your SSH key to Drycc Workflow.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
Read more about adding/removing SSH Keys here.
+If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow.
+$ git clone https://github.com/drycc/helloworld.git
+$ cd helloworld
+
+In order to deploy Dockerfile applications, they must conform to the following requirements:
+EXPOSE
directive to expose exactly one port.CMD
directive to define the default process that will run within the container.!!! note
+Note that if you are using a private registry of any kind (gcr
or other) the application environment must include a $PORT
config variable that matches the EXPOSE
’d port, example: drycc config:set PORT=5000
. See Configuring Registry for more info.
Use drycc create
to create an application on the Controller.
$ drycc create
+Creating application... done, created folksy-offshoot
+Git remote drycc added
+
+Use git push drycc master
to deploy your application.
$ git push drycc master
+Counting objects: 13, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (13/13), done.
+Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done.
+Total 13 (delta 2), reused 0 (delta 0)
+-----> Building Docker image
+Uploading context 4.096 kB
+Uploading context
+Step 0 : FROM drycc/base:latest
+ ---> 60024338bc63
+Step 1 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> cf9ef8c5caa7
+Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> 515b1faf3bd8
+Step 3 : RUN mkdir -p /go
+ ---> Using cache
+ ---> ebf4927a00e9
+Step 4 : ENV GOPATH /go
+ ---> Using cache
+ ---> c6a276eded37
+Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH
+ ---> Using cache
+ ---> 2ba6f6c9f108
+Step 6 : ADD . /go/src/github.com/drycc/helloworld
+ ---> 94ab7f4b977b
+Removing intermediate container 171b7d9fdb34
+Step 7 : RUN cd /go/src/github.com/drycc/helloworld && go install -v .
+ ---> Running in 0c8fbb2d2812
+github.com/drycc/helloworld
+ ---> 13b5af931393
+Removing intermediate container 0c8fbb2d2812
+Step 8 : ENV PORT 80
+ ---> Running in 9b07da36a272
+ ---> 2dce83167874
+Removing intermediate container 9b07da36a272
+Step 9 : CMD ["/go/bin/helloworld"]
+ ---> Running in f7b215199940
+ ---> b1e55ce5195a
+Removing intermediate container f7b215199940
+Step 10 : EXPOSE 80
+ ---> Running in 7eb8ec45dcb0
+ ---> ea1a8cc93ca3
+Removing intermediate container 7eb8ec45dcb0
+Successfully built ea1a8cc93ca3
+-----> Pushing image to private registry
+
+ Launching... done, v2
+
+-----> folksy-offshoot deployed to Drycc
+ http://folksy-offshoot.local3.dryccapp.com
+
+ To learn more, use `drycc help` or visit https://www.drycc.cc
+
+To ssh://git@local3.dryccapp.com:2222/folksy-offshoot.git
+ * [new branch] master -> master
+
+$ curl -s http://folksy-offshoot.local3.dryccapp.com
+Welcome to Drycc!
+See the documentation at http://docs.drycc.cc/ for more information.
+
+Because a Dockerfile application is detected, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of containers
+running that process.
As of Workflow v2.13.0, users can inject their application config into the Container image using +Container build arguments. To opt into this, users must add a new environment variable +to their application:
+$ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1
+
Every environment variable set with drycc config:set
will then be available for use inside the
+user’s Dockerfile. For example, if a user runs drycc config:set POWERED_BY=Workflow
,
+the user can utilize that build argument in their Dockerfile:
ARG POWERED_BY
+RUN echo "Powered by $POWERED_BY" > /etc/motd
+
+Drycc supports deploying applications via an existing Docker Image. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.
+Start by cloning an example application:
+$ git clone https://github.com/drycc/example-dockerfile-http.git
+$ cd example-dockerfile-http
+
+Next use your local docker
client to build the image and push
+it to DockerHub.
$ docker build -t <username>/example-dockerfile-http .
+$ docker push <username>/example-dockerfile-http
+
+In order to deploy Docker images, they must conform to the following requirements:
+EXPOSE
directive to expose exactly one port.CMD
directive to define the default process that will run within the container.!!! note
+Note that if you are using a private registry of any kind (gcr
or other) the application environment must include a $PORT
config variable that matches the EXPOSE
’d port, example: drycc config:set PORT=5000
. See Configuring Registry for more info.
Use drycc create
to create an application on the controller.
$ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http
+$ drycc create example-dockerfile-http --no-remote
+Creating application... done, created example-dockerfile-http
+
+!!! note
+For all commands except for drycc create
, the drycc
client uses the name of the current directory
+as the app name if you don’t specify it explicitly with --app
.
Use drycc pull
to deploy your application from DockerHub or
+a public registry.
$ drycc pull <username>/example-dockerfile-http:latest
+Creating build... done, v2
+
+$ curl -s http://example-dockerfile-http.local3.dryccapp.com
+Powered by Drycc
+
+Because you are deploying a Docker image, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of Containers
+running that process.
To deploy Docker images from a private registry or from a private repository, use drycc registry
+to attach credentials to your application. These credentials are the same as you’d use when running
+docker login
at your private registry.
To deploy private Docker images, take the following steps:
+drycc registry:set username=<the-user> password=<secret> -a <application-name>
drycc pull
as normal, against an image in the private registryWhen using a GCR.io Long Lived Token, the JSON blob will have to be compacted first using a
+tool like jq and then used in the password field in drycc registry:set
. For the username, use
+_json_key
. For example:
drycc registry:set username=_json_key password="$(cat google_cloud_cred.json | jq -c .)"
+
When using a private registry the docker images are no longer pulled into the Drycc Internal Registry via
+the Drycc Workflow Controller but rather is managed by Kubernetes. This will increase security and overall speed,
+however the application port
information can no longer be discovered. Instead the application port
information can be set via
+drycc config:set PORT=80
prior to setting the registry information.
!!! note +Currently GCR.io and ECR in short lived auth token mode are not supported.
+ +Drycc Workflow manages your application as a set of processes that can be named, scaled and configured according to their +role. This gives you the flexibility to easily manage the different facets of your application. For example, you may have +web-facing processes that handle HTTP traffic, background worker processes that do async work, and a helper process that +streams from the Twitter API.
+By using a Procfile, either checked in to your application or provided via the CLI you can specify the name of the type
+and the application command that should run. To spawn other process types, use drycc scale <ptype>=<n>
to scale those
+types accordingly.
In the absence of a Procfile, a single, default process type is assumed for each application.
+Applications built using Buildpacks via git push
implicitly receive a web
process type, which starts
+the application server. Rails 4, for example, has the following process type:
web: bundle exec rails server -p $PORT
+
+All applications utilizing Dockerfiles have an implied web
process type, which runs the
+Dockerfile’s CMD
directive unmodified:
$ cat Dockerfile
+FROM centos:latest
+COPY . /app
+WORKDIR /app
+CMD python -m SimpleHTTPServer 5000
+EXPOSE 5000
+
+For the above Dockerfile-based application, the web
process type would run the Container CMD
of python -m SimpleHTTPServer 5000
.
Applications utilizing remote Container images, a web
process type is also implied, and runs the CMD
+specified in the Container image.
!!! note
+The web
process type is special as they’is the default process type that will
+receive HTTP traffic from Workflow’s routers. Other process types can be named arbitrarily.
If you use Buildpack or Dockerfile builds and want to override or specify additional process
+types, simply include a file named Procfile
in the root of your application’s source tree.
The format of a Procfile
is one process type per line, with each line containing the command to invoke:
<process type>: <command>
+
+The syntax is defined as:
+<process type>
– a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc.<command>
– a command line to launch the process, such as rake jobs:work
.This example Procfile specifies two types, web
and sleeper
. The web
process launches a web server on port 5000 and
+a simple process which sleeps for 900 seconds and exits.
$ cat Procfile
+web: bundle exec ruby web.rb -p ${PORT:-5000}
+sleeper: sleep 900
+
If you are using remote Container images, you may define process types by either running drycc pull
with a
+Procfile
in your working directory, or by passing a stringified Procfile to the --procfile
CLI option.
For example, passing process types inline:
+$ drycc pull drycc/example-go:latest --procfile="web: /app/bin/boot"
+
Read a Procfile
in another directory:
$ drycc pull drycc/example-go:latest --procfile="$(cat deploy/Procfile)"
+
Or via a Procfile located in your current, working directory:
+$ cat Procfile
+web: /bin/boot
+sleeper: echo "sleeping"; sleep 900
+
+
+$ drycc pull -a steely-mainsail drycc/example-go
+Creating build... done
+
+$ drycc scale sleeper=1 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 0s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+steely-mainsail-sleeper-76c45b967c-4qm6w v3 up sleeper 1/1 0 2023-12-08T02:25:00UTC
+steely-mainsail-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
!!! note
+Only process types of web
will be scaled to 1 automatically. If you have additional process types
+remember to scale the process counts after creation.
To remove a process type simply scale it to 0:
+$ drycc scale sleeper=0 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 3s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+steely-mainsail-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
Applications deployed on Drycc Workflow scale out via the process model. Use drycc scale
to control the number of
+containers that power your app.
$ drycc scale web=5 -a iciest-waggoner
+Scaling processes... but first, coffee!
+done in 3s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+iciest-waggoner-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-8p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-9p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-1p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-2p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
If you have multiple process types for your application you may scale the process count for each type separately. For +example, this allows you to manage web process independently from background workers. For more information on process +types see our documentation for Managing App Processes.
+In this example, we are scaling the process type web
to 5 but leaving the process type background
with one worker.
$ drycc scale web=5
+Scaling processes... but first, coffee!
+done in 4s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-7lord v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-jn957 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vwhnh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
Scaling a process down, by reducing the process count, sends a TERM
signal to the processes, followed by a SIGKILL
+if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP
+client connections.
For example, scaling from 5 processes to 3:
+$ drycc scale web=3
+Scaling processes... but first, coffee!
+done in 1s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vwhnh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg9 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
Autoscale allows adding a minimum and maximum number of pods on a per process type basis. This is accomplished by specifying a target CPU usage across all available pods.
+This feature is built on top of Horizontal Pod Autoscaling in Kubernetes or HPA for short.
+!!! note +This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature.
+$ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75
+Applying autoscale settings for process type web on scenic-icehouse... done
+
And then review the scaling rule that was created for web
$ drycc autoscale:list
+PTYPE PERCENT MIN MAX
+web 75 3 8
+
Remove scaling rule
+$ drycc autoscale:unset web
+Removing autoscale for process type web on scenic-icehouse... done
+
For autoscaling to work CPU requests have to be specified on each application Pod (can be done via drycc limits --cpu
). This allows the autoscale policies to do the appropriate calculations and make decisions on when to scale up and down.
Scale up can only happen if there was no rescaling within the last 3 minutes. Scale down will wait for 5 minutes from the last rescaling. That information and more can be found at HPA algorithm page.
+List the containers:
+$ drycc ps
+NAME RELEASE STATE PTYPEE READY RESTARTS STARTED
+python-getting-started-web-69b7d4bfdc-kl4xf v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+=== python-getting-started Processes
+--- web:
+python-getting-started-web-69b7d4bfdc-kl4xf up (v2)
+
fetch the container logs:
+$ drycc ps:logs -f python-getting-started-web-69b7d4bfdc-kl4xf
+[2024-05-24 07:14:39 +0000] [1] [INFO] Starting gunicorn 20.1.0
+[2024-05-24 07:14:39 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
+[2024-05-24 07:14:39 +0000] [1] [INFO] Using worker: gevent
+[2024-05-24 07:14:39 +0000] [8] [INFO] Booting worker with pid: 8
+[2024-05-24 07:14:39 +0000] [9] [INFO] Booting worker with pid: 9
+[2024-05-24 07:14:39 +0000] [10] [INFO] Booting worker with pid: 10
+[2024-05-24 07:14:39 +0000] [11] [INFO] Booting worker with pid: 11
+
List the containers:
+$ drycc ps:describe python-getting-started-web-69b7d4bfdc-kl4xf
+Container: python-getting-started-web
+Image: drycc/python-getting-started:latest
+Command:
+Args:
+ - gunicorn
+ - -c
+ - gunicorn_config.py
+ - helloworld.wsgi:application
+State: running
+ startedAt: "2024-05-24T07:14:39Z"
+Ready: true
+Restart Count: 0
+
Delete the containers. +Due to the set number of replicas, a new container will be launched to meet the quantity requirement.
+$ drycc ps:delete python-getting-started-web-69b7d4bfdc-kl4xf
+Deleting python-getting-started-web-69b7d4bfdc-kl4xf from python-getting-started... done
+
Verify that the container is running:
+$ drycc ps
+NAME RELEASE STATE PTYPEE READY RESTARTS STARTED
+python-getting-started-web-69b7d4bfdc-kl4xf v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+=== python-getting-started Processes
+--- web:
+python-getting-started-web-69b7d4bfdc-kl4xf up (v2)
+
Get a shell to the running container:
+$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash
+
In your shell, list the root directory:
+# Run this inside the container
+ls /
+
Running individual commands in a container
+$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date
+
Use “drycc ps –help” for a list of global command-line (applies to all commands).
+If you need to restart an application process, you may use drycc pts:restart
. Behind the scenes, Drycc Workflow instructs
+Kubernetes to terminate the old process and launch a new one in its place.
$ drycc ps
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v2 up web 1/1 0 2023-12-08T02:50:21UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+$ drycc pts:restart scenic-icehouse-background
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v2 up web 1/1 0 2023-12-08T02:50:21UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 starting web 1/1 0 2023-12-08T02:25:00UTC
+
Notice that the process name has changed from scenic-icehouse-background-3291896318-yf8kh
to
+scenic-icehouse-background-3291896318-yd87g
. In a multi-node Kubernetes cluster, this may also have the effect of scheduling
+the Pod to a new node.
Use “drycc pts –help” for a list of pts command-line (process types info).
+$ drycc pts
+NAME RELEASE READY UP-TO-DATE AVAILABLE STARTED
+web v2 3/3 1 1 2023-12-08T02:25:00UTC
+background v2 1/1 1 1 2023-12-08T02:25:00UTC
+
$ drycc pts:describe web
+Container: python-getting-started-web
+Image: drycc/python-getting-started:latest
+Command:
+Args:
+ - gunicorn
+ - -c
+ - gunicorn_config.py
+ - helloworld.wsgi:application
+Limits:
+ cpu 1
+ ephemeral-storage 2Gi
+ memory 1Gi
+Liveness: http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3
+Readiness: http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3
+
+A Drycc application stores config in environment variables.
+Use drycc config
to modify environment variables for a deployed application.
$ drycc help config
+Valid commands for config:
+
+config:list list environment variables for an app
+config:set set environment variables for an app
+config:unset unset environment variables for an app
+config:pull extract environment variables to .env
+config:push set environment variables from .env
+
+Use `drycc help [command]` to learn more.
+
+When config is changed, a new release is created and deployed automatically.
+You can set multiple environment variables with one drycc config:set
command,
+or with drycc config:push
and a local .env file.
$ drycc config:set FOO=1 BAR=baz && drycc config:pull
+$ cat .env
+FOO=1
+BAR=baz
+$ echo "TIDE=high" >> .env
+$ drycc config:push
+Creating config... done, v4
+
+=== yuppie-earthman
+DRYCC_APP: yuppie-earthman
+FOO: 1
+BAR: baz
+TIDE: high
+
+It can also modify environment variables for a process type of application.
+$ drycc config:set FOO=1 BAR=baz --ptype=web
+
+Drycc treats backing services like databases, caches and queues as attached resources. +Attachments are performed using environment variables.
+For example, use drycc config
to set a DATABASE_URL
that attaches
+the application to an external PostgreSQL database.
$ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db
+=== peachy-waxworks
+DATABASE_URL: postgres://user:pass@example.com:5432/db
+
+Detachments can be performed with drycc config:unset
.
By default, apps using the [Imagebuilder][] will reuse the latest image data. +When deploying applications that depend on third-party libraries that have to be fetched, +this could speed up deployments a lot. In order to make use of this, the buildpack must implement +the cache by writing to the cache directory. Most buildpacks already implement this, but when using +custom buildpacks, it might need to be changed to make full use of the cache.
+In some cases, cache might not speed up your application. To disable caching, you can set the
+DRYCC_DISABLE_CACHE
variable with drycc config:set DRYCC_DISABLE_CACHE=1
. When you disable the
+cache, Drycc will clear up files it created to store the cache. After having it turned off, run
+drycc config:unset DRYCC_DISABLE_CACHE
to re-enable the cache.
Use the following procedure to clear the cache:
+$ drycc config:set DRYCC_DISABLE_CACHE=1
+$ git commit --allow-empty -m "Clearing Drycc cache"
+$ git push drycc # (if you use a different remote, you should use your remote name)
+$ drycc config:unset DRYCC_DISABLE_CACHE
+
+By default, Workflow only checks that the application starts in their Container. If it is preferred +to have Kubernetes respond to application health, a health check may be added by configuring a +health check probe for the application.
+The health checks are implemented as Kubernetes container probes. A liveness
+and a readiness
probe can be configured, and each probe can be of type httpGet
, exec
, or
+tcpSocket
depending on the type of probe the container requires.
A liveness probe is useful for applications running for long periods of time, eventually +transitioning to broken states and cannot recover except by restarting them.
+Other times, a readiness probe is useful when the container is only temporarily unable to serve, +and will recover on its own. In this case, if a container fails its readiness probe, the container +will not be shut down, but rather the container will stop receiving incoming requests.
+httpGet
probes are just as it sounds: it performs a HTTP GET operation on the Container. A
+response code inside the 200-399 range is considered a pass.
exec
probes run a command inside the Container to determine its health, such as
+cat /var/run/myapp.pid
or a script that determines when the application is ready. An exit code of
+zero is considered a pass, while a non-zero status code is considered a fail.
tcpSocket
probes attempt to open a socket in the Container. The Container is only considered
+healthy if the check can establish a connection. tcpSocket
probes accept a port number to perform
+the socket connection on the Container.
Health checks can be configured on a per-proctype basis for each application using drycc healthchecks:set
. If no type is mentioned then the health checks are applied to default proc type web, whichever is present. To
+configure a httpGet
liveness probe:
$ drycc healthchecks:set liveness httpGet 80 --ptype web
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
If the application relies on certain headers being set (such as the Host
header) or a specific
+URL path relative to the root, you can also send specific HTTP headers:
$ drycc healthchecks:set liveness httpGet 80 \
+ --path /welcome/index.html \
+ --headers "X-Client-Version:v1.0,X-Foo:bar"
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[X-Client-Version=v1.0] path=/welcome/index.html port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
To configure an exec
readiness probe:
$ drycc healthchecks:set readiness exec -- /bin/echo -n hello --ptype web
+Applying readinessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ readiness web exec /bin/echo -n hello delay=50s timeout=50s period=10s #success=1 #failure=3
+
You can overwrite a probe by running drycc healthchecks:set
again:
$ drycc healthchecks:set readiness httpGet 80 --ptype web
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
Configured health checks also modify the default application deploy behavior. When starting a new +Pod, Workflow will wait for the health check to pass before moving onto the next Pod.
+By default, Changes the config, limits or healthchecks and so on will trigger deploy. +If you don’t want deploy, you can disable.
+$ drycc autodeploy:disable
+
To re-enable autodeploy.
+drycc autodeploy:enable
+
you can deploy by executing the following command. +deploy all ptypes
+drycc releases:deploy
+
deploy web process type, and support --force
option to force deploy.
drycc releases:deploy web --force
+
By default, deployment failures will roll back to the previous successful version. +If you don’t want this to happen, you can disable.
+$ drycc autorollback:disable
+
To re-enable autorollback.
+drycc autorollback:enable
+
Workflow supports isolating applications onto a set of nodes using drycc tags
.
!!! note +In order to use tags, you must first launch your cluster with the proper node labels. If you do +not, tag commands will fail. Learn more by reading “Assigning Pods to Nodes”.
+Once your nodes are configured with appropriate label selectors, use drycc tags:set
to restrict
+the application ptype to those nodes:
$ drycc tags:set web environ=prod
+Applying tags... done, v4
+
+environ prod
+
+Create an authentication token using the drycc client.
+# drycc tokens:add prometheus --password admin --username admin
+ ! WARNING: Make sure to copy your token now.
+ ! You won't be able to see it again, please confirm whether to continue.
+ ! To proceed, type "yes" !
+
+> yes
+UUID USERNAME TOKEN
+58176cf1-37a8-4c52-9b27-4c7a47269dfb admin 1F2c7A802aF640fd9F31dD846AdDf56BcMsay
+
A valid example file can be found here.
+The global configuration specifies parameters that are valid in all other configuration contexts. They also serve as defaults for other configuration sections.
+global:
+ scrape_interval: 60s
+ evaluation_interval: 60s
+scrape_configs:
+- job_name: 'drycc'
+ scheme: https
+ metrics_path: /v2/apps/<appname>/metrics
+ authorization:
+ type: Token
+ credentials: 1F2c7A802aF640fd9F31dD846AdDf56BcMsay
+ static_configs:
+ - targets: ['drycc.domain.com']
+
+Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code
+pushed to the platform (via git push drycc master
), or an update to application configuration (via drycc config:set KEY=VAL
).
Each time a build or config change is made to your application a new release is created. These release numbers +increase monotonically.
+You can see a record of changes to your application using drycc releases
:
$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Drycc Workflow also supports rolling back go previous releases. If buggy code or an errant configuration change is pushed +to your application, you may rollback to a previously known, good release.
+!!! note +All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point.
+In this example, the application is currently running release v4. Using drycc rollback v2
tells Workflow to deploy the
+build and configuration that was used for release v2. This creates a new release named v5 whose contents are the source
+and configuration from release v2:
$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
+$ drycc rollback v2
+Rolled back to v2
+
+$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v4 2023-12-04T10:20:46Z dev rolled back to v2
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Only rollback web process type:
+$ drycc rollback v3 web
+Rolled back to v3
+
+$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v5 2023-12-04T10:23:49Z dev rolled back to v3
+dev succeed v4 2023-12-04T10:20:46Z dev rolled back to v2
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Drycc applications use one-off processes for admin tasks like database migrations and other commands that must run against the live application.
+Use drycc run
to execute commands on the deployed application.
$ drycc run 'ls -l'
+Running `ls -l`...
+
+total 28
+-rw-r--r-- 1 root root 553 Dec 2 23:59 LICENSE
+-rw-r--r-- 1 root root 60 Dec 2 23:59 Procfile
+-rw-r--r-- 1 root root 33 Dec 2 23:59 README.md
+-rw-r--r-- 1 root root 1622 Dec 2 23:59 pom.xml
+drwxr-xr-x 3 root root 4096 Dec 2 23:59 src
+-rw-r--r-- 1 root root 25 Dec 2 23:59 system.properties
+drwxr-xr-x 6 root root 4096 Dec 3 00:00 target
+
+Use drycc perms:add
to allow another Drycc user to collaborate on your application.
$ drycc perms:add otheruser view,change,delete
+Adding user otheruser as a collaborator for view,change,delete peachy-waxwork... done
+
Use drycc perms
to see who an application is currently shared with, and drycc perms:remove
to remove a collaborator.
!!! note +Collaborators can do anything with an application that its owner can do, except delete the application.
+When working with an application that has been shared with you, clone the original repository and add Drycc’ git remote
+entry before attempting to git push
any changes to Drycc.
$ git clone https://github.com/drycc/example-java-jetty.git
+Cloning into 'example-java-jetty'... done
+$ cd example-java-jetty
+$ git remote add -f drycc ssh://git@local3.dryccapp.com:2222/peachy-waxworks.git
+Updating drycc
+From drycc-controller.local:peachy-waxworks
+ * [new branch] master -> drycc/master
+
Applications deployed on Drycc Workflow treat logs as event streams. Drycc Workflow aggregates stdout
and stderr
+from every Container making it easy to troubleshoot problems with your application.
Use drycc logs
to view the log output from your deployed application.
$ drycc logs -f
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.Server:jetty-7.6.0.v20120127
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10005
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10006
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10007
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10008
+
+
+We can use the blow command to create volumes and mount the created volumes. +Drycc create volume support ReadWriteMany, so before deploying drycc, you need to have a StorageClass ready which can support ReadWriteMany. +Deploying drycc, set controller.appStorageClass to this StorageClass.
+Use drycc volumes
to mount a volume for a deployed application’s processes.
$ drycc help volumes
+Valid commands for volumes:
+
+volumes:create create a volume for the application
+volumes:list list volumes in the application
+volumes:delete delete a volume from the application
+volumes:client the client used to manage volume files
+volumes:mount mount a volume to process of the application
+volumes:unmount unmount a volume from process of the application
+
+Use 'drycc help [command]' to learn more.
+
+You can create a csi volume with the drycc volumes:create
command.
$ drycc volumes:create myvolume 200M
+Creating myvolumes to scenic-icehouse... done
+
+Or use an existing nfs server
+$ drycc volumes:create myvolume 200M -t nfs --nfs-server=nfs.drycc.com --nfs-path=/
+Creating myvolumes to scenic-icehouse... done
+
+After volume is created, you can list the volumes in this application.
+$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes 200M
+
+The volume which is named myvolumes is created, you can mount the volume with process of the application,
+use the command of drycc volumes:mount
. When volume is mounted, a new release will be created and deployed automatically.
$ drycc volumes:mount myvolumes web=/data/web
+Mounting volume... done
+
+And use drycc volumes:list
show mount detail.
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes 200M
+web /data/web
+
+If you don’t need the volume, use drycc volumes:unmount
to unmount the volume and then use drycc volumes:delete
to delete the volume from the application.
+Before deleting volume, the volume has to be unmounted.
$ drycc volumes:unmount myvolumes web
+Unmounting volume... done
+
+$ drycc volumes:delete myvolumes
+Deleting myvolumes from scenic-icehouse... done
+
+Assume the volume which is named myvolumes is created and mounted.
+Prepare a file named testfile.
+$ echo "testtext" > testfile
+
+Upload. +$ drycc volumes:client cp testfile vol://myvolume/ +[↑] testfile 100% [==================================================] (5/ 5 B, 355 B/s)
+List files in myvolume.
+$ drycc volumes:client ls vol://myvolume/
+[2024-07-22T15:32:28+08:00] 5 testfile
+
+Delete testfle in myvolume.
+$ drycc volumes:client rm vol://myvolume/testfile
+
+A Gateway describes how traffic can be translated to Services within the cluster. That is, it defines a request for a way to translate traffic from somewhere that does not know about Kubernetes to somewhere that does. For example, traffic sent to a Kubernetes Service by a cloud load balancer, an in-cluster proxy, or an external hardware load balancer. While many use cases have client traffic originating “outside” the cluster, this is not a requirement.
+Gateway is a way of exposing services externally, which generates an external IP address to connect route and service. +After deploy, the gateway has been created.
+List the containers:
+# drycc gateways
+NAME LISENTER PORT PROTOCOL ADDRESSES
+python-getting-started tcp-80-0 80 HTTP 101.65.132.51
+
You can also add a port in this gateway or create a one.
+# drycc gateways:add python-getting-started --port=443 --protocol=HTTPS
+Adding gateway python-getting-started to python-getting-started... done
+
Service is a way of exposing services internally, creating a service generates an internal DNS that can access ptype
.
+the web process type has been created, for others types, you should add as needed.
List the services:
+$ drycc services
+PTYPE PORT PROTOCOL TARGET-PORT DOMAIN
+web 80 TCP 8000 python-getting-started.python-getting-started.svc.cluster.local
+
Add a new service for process type
+# drycc services:add --help
+# drycc services:add sleep 8001:8001
+
A Gateway may be attached to one or more Route references which serve to direct traffic for a subset of traffic to a specific service. +Same as the above, the web process type already bind the gateway and servies.
+# drycc routes
+NAME OWNER PTYPE KIND SERVICE-PORT GATEWAY LISTENER-PORT
+python-getting-started demo web HTTPRoute 80 python-getting-started 80
+
create a new route and attach gateway.
+drycc routes:create sleep --ptype=sleep --kind=HTTPRoute --port=8001
+drycc routes:attach sleep --gateway=python-getting-started --port=80
+
+We can use blow command to create resources and bind which resource is created. +This command depend on service-catalog.
+Use drycc resources
to create and bind a resource for a deployed application.
$ drycc help resources
+
+Valid commands for resources:
+
+resources:services list all available resource services
+resources:plans list all available plans for an resource services
+resources:create create a resource for the application
+resources:list list resources in the application
+resources:describe get a resource detail info in the application
+resources:update update a resource from the application
+resources:destroy delete a resource from the applicationa
+resources:bind bind a resource to servicebroker
+resources:unbind unbind a resource from servicebroker
+
+Use 'drycc help [command]' to learn more.
+
+You can list available resource services with one drycc resources:services
command
$ drycc resources:services
+ID NAME UPDATEABLE
+15032a52-33c2-4b40-97aa-ceb972f51509 airflow true
+b7cb26a4-b258-445c-860b-a664239a67f8 cloudbeaver true
+9ce3c3ba-33b5-4e4e-a5e9-a338a83d5070 flink true
+b80c51a1-957c-4d93-b3d5-efde84cd8031 fluentbit true
+fff5b6c7-ed85-429b-8265-493e40cc53c7 grafana true
+412e368f-bf78-4798-92cc-43343119a57d kafka true
+ea2a9b87-fbc4-4e2a-adee-161c1f91d98d minio true
+383f7316-84f3-4955-8491-1d4b02b749c8 mongodb true
+fbee746b-f3a7-4bef-8b55-cbecfd4c8ac3 mysql-cluster true
+5975094d-45cc-4e85-8573-f93937d026c7 opensearch true
+1db95161-7193-4544-8c76-e5ad5f6c03f6 pmm true
+5cfb0abf-276c-445b-9060-9aa964ede87d postgresql-cluster true
+b8f70264-eafc-4b2f-848e-2ec0d059032b prometheus true
+f8186d36-f334-4094-8e02-d21a61da657b rabbitmq true
+e1fd0d37-9046-4152-a29b-d155c5657c8b redis true
+7d2b64c6-0b59-4f08-a2f5-7b17cea6e5ee redis-cluster true
+2e6877df-86e7-4bcc-a869-2a9b6847a465 seaweedfs true
+4aea5c0f-9495-420d-896a-ffc61a3eced5 spark true
+b50db3b5-8d5f-4be9-b8bd-467ecd6cc11d zookeeper true
+
+You can list all available plans for an resource services with one drycc resources:plans
command
$ drycc resources:plans redis
+ID NAME DESCRIPTION
+8d659058-a3b4-4058-b039-cc03a31b9442 standard-128 Redis standard-128 plan which limit resources memory size 128Mi.
+36e3dbec-fc51-4f6b-9baa-e31e316858be standard-256 Redis standard-256 plan which limit resources memory size 256Mi.
+560817c2-5aa1-41c4-9ee6-a77e3ee552d5 standard-512 Redis standard-512 plan which limit resources memory size 512Mi.
+d544d989-9fb8-43e9-a74e-0840ce1b8f0f standard-1024 Redis standard-1024 plan which limit resources memory size 1Gi.
+ad51b7bb-9b12-4ffd-8e49-010c0141b263 standard-2048 Redis standard-2048 plan which limit resources memory size 2Gi.
+5097d76e-557c-453f-bdb1-54009e0df78d standard-4096 Redis standard-4096 plan which limit resources memory size 4Gi.
+be3fa2d0-36d2-47c5-9561-9deffe5ba373 standard-8192 Redis standard-8192 plan which limit resources memory size 8Gi.
+4ca812a8-d7c3-439f-96cd-26523e88400e standard-16384 Redis standard-16384 plan which limit resources memory size 16Gi.
+b7f2a71f-0d97-48fd-8eed-aab24a7822f3 standard-32768 Redis standard-32768 plan which limit resources memory size 32Gi.
+25c6b5d5-7505-47c8-95b1-dc9bdc698063 standard-65536 Redis standard-65536 plan which limit resources memory size 64Gi.
+
+You can create a resource with one drycc resources:create
command
$ drycc resources:create redis:1000 redis
+Creating redis to scenic-icehouse... done
+
+After resources are created, you can list the resources in this application.
+$ drycc resources:list
+UUID NAME OWNER PLAN UPDATED
+07220e9e-d54d-4d74-a88c-f464aa374386 redis admin redis:standard-128 2024-05-08T01:01:00Z
+
+The resource which is named redis is created, you can bind the redis to the application,
+use the command of drycc resources:bind redis
.
$ drycc resources:bind redis
+Binding resource... done
+
+And use drycc resources:describe
show the binding detail. If the binding is successful, this command will show the information of connect to the resource.
$ drycc resources:describe redis
+=== scenic-icehouse resource redis
+plan: redis:1000
+status: Ready
+binding: Ready
+
+REDISPORT: 6379
+REDIS_PASSWORD: RzG87SJWG1
+SENTINELHOST: 172.16.0.2
+SENTINELPORT: 26379
+
+You can use the drycc resources:update
command to upgrade a new plan.
+An example of how to upgrade the plan’s capacity to 100MB:
$ drycc resources:update redis:10000 redis
+Updating redis to scenic-icehouse... done
+
+If you don’t need resources, use drycc resources:unbind
to unbind the resource and then use drycc resources:destroy
to delete the resource from the application.
+Before deleting the resource, the resource must be unbinded.
$ drycc resources:unbind redis
+Unbinding resource... done
+
+$ drycc resources:destroy redis
+Deleting redis from scenic-icehouse... done
+
+
+A common architecture pattern of multi-process applications is to have one process serve public requests while having multiple other processes supporting the public one to, for example, perform actions on a schedule or process work items from a queue. To implement this system of apps in Drycc Workflow, set up the apps to communicate using DNS resolution, as shown above, and hide the supporting processes from public view by removing them from the Drycc Workflow router.
+Drycc Workflow supports deploying a single app composed of a system of processes. Each Drycc Workflow app communicates on a single port, so communicating with another Workflow app means finding that app’s address and port. All Workflow apps are mapped to port 80 externally, so finding its IP address is the only challenge. Workflow creates a Kubernetes Service for each app, which effectively assigns a name and one cluster-internal IP address to an app. The DNS service running in the cluster adds and removes DNS records which point from the app name to its IP address as services are added and removed. Drycc Workflow apps, then, can simply send requests to the domain name given to the service, which is “app-name.app-namespace”.
+ +Drycc Workflow supports restricting memory and CPU shares of each process. Requests/Limits set on a per-process type are given to
+Kubernetes as a requests and limits. Which means you guarantee <requests> amount of resource for a process as well as limit
+the process from using more than <limits>.
+By default, Kubernetes will set <requests> equal to <limit> if we don’t explicitly set <requests> value. Please keep in mind that 0 <= requests <= limits
.
If you set a requests/limits that is out of range for your cluster, Kubernetes will be unable to schedule your application +processes into the cluster!
+$ drycc limits:plans
+
+ID SPEC CPU VCPUS MEMORY FEATURES
+std1.large.c1m1 std1 Universal CPU 1 1 GiB Integrated GPU shared
+std1.large.c1m2 std1 Universal CPU 1 2 GiB Integrated GPU shared
+std1.large.c1m4 std1 Universal CPU 1 4 GiB Integrated GPU shared
+std1.large.c1m8 std1 Universal CPU 1 8 GiB Integrated GPU shared
+std1.large.c2m2 std1 Universal CPU 2 2 GiB Integrated GPU shared
+std1.large.c2m4 std1 Universal CPU 2 4 GiB Integrated GPU shared
+std1.large.c2m8 std1 Universal CPU 2 8 GiB Integrated GPU shared
+std1.large.c2m16 std1 Universal CPU 2 16 GiB Integrated GPU shared
+
+$ drycc limits:set web=std1.large.c1m1
+Applying limits... done
+
+You can use drycc domains
to add or remove custom domains to the application:
$ drycc domains:add hello.bacongobbler.com --ptype=web
+Adding hello.bacongobbler.com to finest-woodshed... done
+
+Once that’s done, you can go into a DNS registrar and set up a CNAME from the new +appname to the old one:
+$ dig hello.dryccapp.com
+[...]
+;; ANSWER SECTION:
+hello.bacongobbler.com. 1759 IN CNAME finest-woodshed.dryccapp.com.
+finest-woodshed.dryccapp.com. 270 IN A 172.17.8.100
+
+!!! note +Setting a CNAME for a root domain can cause issues. Setting an @ record +to be a CNAME causes all traffic to go to the other domain, including mail and the SOA +(“start-of-authority”) records. It is highly recommended that you bind a subdomain to +an application, however you can work around this by pointing the @ record to the +address of the load balancer (if any).
+To add or remove the application from the routing mesh, use drycc routing
:
$ drycc routing:disable
+Disabling routing for finest-woodshed... done
+
+This will make the application unreachable through the Router, but the application is still +reachable internally through its Kubernetes Service. To re-enable routing:
+$ drycc routing:enable
+Enabling routing for finest-woodshed... done
+
+
+SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web +requests. Apps that transmit sensitive data should enable SSL to ensure all information is +transmitted securely.
+To enable SSL on a custom domain, e.g., www.example.com
, use the SSL endpoint.
!!! note
+drycc certs
is only useful for custom domains. Default application domains are
+SSL-enabled already and can be accessed simply by using https,
+e.g. https://foo.dryccapp.com
(provided that you have installed your wildcard
+certificate on the routers or on the load balancer).
Because of the unique nature of SSL validation, provisioning SSL for your domain is a multi-step +process that involves several third-parties. You will need to:
+Purchasing an SSL cert varies in cost and process depending on the vendor. RapidSSL offers a +simple way to purchase a certificate and is a recommended solution. If you’re able to use this +provider, see buy an SSL certificate with RapidSSL for instructions.
+Once the SSL certificate is provisioned and your cert is confirmed, you must route requests for +your domain through Drycc. Unless you’ve already done so, add the domain specified when generating +the CSR to your app with:
+$ drycc domains:add www.example.com --ptype==web -a foo
+Adding www.example.com to foo... done
+
+Add your certificate, any intermediate certificates, and private key to the endpoint with the
+certs:add
command.
$ drycc certs:add example-com server.crt server.key -a foo
+Adding SSL endpoint... done
+www.example.com
+
+!!! note +The name given to the certificate can only contain a-z (lowercase), 0-9 and hyphens
+The Drycc platform will investigate the certificate and extract any relevant information from it +such as the Common Name, Subject Alt Names (SAN), fingerprint and more.
+This allows for wildcard certificates and multiple domains in the SAN without uploading duplicates.
+Sometimes, your certificates (such as a self-signed or a cheap certificate) need additional +certificates to establish the chain of trust. What you need to do is bundle all the certificates +into one file and give that to Drycc. Importantly, your site’s certificate must be the first one:
+$ cat server.crt server.ca > server.bundle
+
+After that, you can add them to Drycc with the certs:add
command:
$ drycc certs:add example-com server.bundle server.key -a foo
+Adding SSL endpoint... done
+www.example.com
+
+Certificates are not automagically connected up to domains, instead you will have to attach a +certificate to a domain
+$ drycc certs:attach example-com example.com -a foo
+
+Each certificate can be connected to many domains. There is no need to upload duplicates.
+To remove an association
+$ drycc certs:detach example-com example.com -a foo
+
+You can verify the details of your domain’s SSL configuration with drycc certs
.
$ drycc certs
+
+ Name | Common Name | SubjectAltName | Expires | Fingerprint | Domains | Updated | Created
++-------------+-------------------+-------------------+-------------------------+-----------------+--------------+-------------+-------------+
+ example-com | example.com | blog.example.com | 31 Dec 2017 (in 1 year) | 8F:8E[...]CD:EB | example.com | 30 Jan 2016 | 29 Jan 2016
+
+or by looking at at each certificates detailed information
+$ drycc certs:info example-com -a foo
+
+=== bar-com Certificate
+Common Name(s): example.com
+Expires At: 2017-01-14 23:57:57 +0000 UTC
+Starts At: 2016-01-15 23:57:57 +0000 UTC
+Fingerprint: 7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0
+Subject Alt Name: blog.example.com
+Issuer: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+Subject: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+
+Connected Domains: example.com
+Owner: admin-user
+Created: 2016-01-28 19:07:41 +0000 UTC
+Updated: 2016-01-30 00:10:02 +0000 UTC
+
+Use a command line utility like curl
to test that everything is configured correctly for your
+secure domain.
!!! note +The -k option flag tells curl to ignore untrusted certificates.
+Pay attention to the output. It should print SSL certificate verify ok
. If it prints something
+like common name: www.example.com (does not match 'www.somedomain.com')
then something is not
+configured correctly.
To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by +running
+$ drycc tls:force:enable -a foo
+Enabling https-only requests for foo... done
+
+Users hitting the HTTP endpoint for the application will now receive a 301 redirect to the HTTPS +endpoint.
+To disable enforced TLS, run
+$ drycc tls:force:disable -a foo
+Disabling https-only requests for foo... done
+
+With Automated Certificate Management (ACM), Drycc automatically manages TLS certificates for apps with Hobby and Professional dynos on the Common Runtime, and for apps in Private Spaces that enable the feature. +Certificates handled by ACM automatically renew one month before they expire, and new certificates are created automatically whenever you add or remove a custom domain. All applications with paid dynos include ACM for free. +Automated Certificate Management uses Let’s Encrypt, the free, automated, and open certificate authority for managing your application’s TLS certificates. Let’s Encrypt is run for the public benefit by the Internet Security Research Group (ISRG).
+To enable ACM with the following command: +$ drycc tls:auto:enable -a foo
+To disable ACM with the following command: +$ drycc tls:auto:disable -a foo
+You can remove a certificate using the certs:remove
command:
$ drycc certs:remove my-cert -a foo
+Removing www.example.com... Done.
+
+Over the lifetime of an application an operator will have to acquire certificates with new expire +dates and apply it to all relevant applications, below is the recommended way to swap out certificates.
+Be intentional with certificate names, name them example-com-2017
when possible, where the year
+signifies the expiry year. This allows for example-com-2018
when a new certificate is purchased.
Assuming all applications are already using example-com-2017
the following commands can be ran,
+chained together or otherwise:
$ drycc certs:detach example-com-2017 example.com -a foo
+$ drycc certs:attach example-com-2018 example.com -a foo
+
+This will take care of a singular domain which allows the operator to verify everything went +as planned and slowly roll it out to any other application using the same method.
+Here are some steps you can follow if your SSL endpoint is not working as you’d expect.
+In some cases when accessing the SSL endpoint, it may list your certificate as untrusted.
+If this occurs, it may be because it is not trusted by Mozilla’s list of root CAs. If this is +the case, your certificate may be considered untrusted for many browsers.
+If you have uploaded a certificate that was signed by a root authority but you get the message that
+it is not trusted, then something is wrong with the certificate. For example, it may be missing
+intermediary certificates. If so, download the intermediary certificates from your SSL provider,
+remove the certificate from Drycc and re-run the certs:add
command.
The Drycc stack is intended for advanced use cases only. Unless you have a specific need for custom Docker images, we recommend using Drycc’s default buildpack-powered build system. It offers automatic base image security updates and language-specific optimizations. It also avoids the need to maintain a .containerDockerfile
+A manifest has three top-level sections.
+Here’s an example that illustrates using a manifest to build Docker images.
+build:
+ docker:
+ web: Dockerfile
+ worker: worker/Dockerfile
+ config:
+ web:
+ FOO: bar
+ worker:
+ RAILS_ENV: development
+run:
+- command:
+ - ./deployment-tasks.sh
+ image: worker
+ # If the field is empty, it means it will be executed forever
+ when:
+ ptypes:
+ - web
+ - webbbsbs
+ # Maximum execution time
+ timeout: 100
+deploy:
+ web:
+ command:
+ - bash
+ - -ec
+ args:
+ - bundle exec puma -C config/puma.rb
+ worker:
+ command:
+ - bash
+ - -ec
+ args:
+ - python myworker.py
+ asset-syncer:
+ command:
+ - bash
+ - -ec
+ args:
+ - python asset-syncer.py
+ image: worker
+
For more deployment information, please refer to the drycc examples.
+ +4 minute read
+An Application is deployed to Drycc using git push
or the drycc
client.
Drycc Workflow can deploy any application or service that can run inside a container. In order to be scaled +horizontally, applications must follow the Twelve-Factor App methodology and store any application state in external +backing services.
+For example, if your application persists state to the local filesystem – common with content management systems like
+Wordpress and Drupal – it cannot be scaled horizontally using drycc scale
.
Fortunately, most modern applications feature a stateless application tier that can scale horizontally inside Drycc.
+!!! important +if you haven’t yet, now is a good time to install the client and register.
+Before deploying an application, users must first authenticate against the Drycc Controller +using the URL supplied by their Drycc administrator.
+$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+
Or you can login with username and password
+$ drycc login http://drycc.example.com --username=demo --password=demo
+Configuration file written to /root/.drycc/client.json
+
Drycc Workflow supports three different ways of building applications:
+Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.
+Learn how to deploy applications using Buildpacks.
+Dockerfiles are a powerful way to define a portable execution environment built on a base OS of your choosing.
+Learn how to deploy applications using Dockerfiles.
+Deploying a Container image onto Drycc allows you to take a Container image from either a public +or a private registry and copy it over bit-for-bit, ensuring that you are running the same +image in development or in your CI pipeline as you are in production.
+Learn how to deploy applications using Container images.
+It is possible to configure a few of the globally tunable settings on per application basis using config:set
.
Setting | +Description | +
---|---|
DRYCC_DISABLE_CACHE | +if set, this will disable the [imagebuilder cache][] (default: not set) | +
DRYCC_DEPLOY_BATCHES | +the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) | +
DRYCC_DEPLOY_TIMEOUT | +deploy timeout in seconds per deploy batch (default: 120) | +
IMAGE_PULL_POLICY | +the kubernetes [image pull policy][pull-policy] for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”) | +
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT | +how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) | +
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS | +how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) | +
Deploy timeout in seconds - There are 2 deploy methods, Deployments (see below) and RC (versions prior to 2.4) and this setting affects those a bit differently.
+Deployments behave a little bit differently from the RC based deployment strategy.
+Kubernetes takes care of the entire deploy, doing rolling updates in the background. As a result, there is only an overall deployment timeout instead of a configurable per-batch timeout.
+The base timeout is multiplied with DRYCC_DEPLOY_BATCHES
to create an overall timeout. This would be 240 (timeout) * 4 (batches) = 960 second overall timeout.
This deploy timeout defines how long to wait for each batch to complete in DRYCC_DEPLOY_BATCHES
.
The base timeout is extended as well with healthchecks using initialDelaySeconds
on liveness
and readiness
where the bigger of those two is applied.
+Additionally the timeout system accounts for slow image pulls by adding an additional 10 minutes when it has seen an image pull take over 1 minute. This allows the timeout values to be reasonable without having to account for image pull slowness in the base deploy timeout.
Workflow uses Deployments for deploys. In prior versions ReplicationControllers were used with the ability to turn on Deployments via DRYCC_KUBERNETES_DEPLOYMENTS=1
.
The advantage of Deployments is that rolling-updates will happen server-side in Kubernetes instead of in Drycc Workflow Controller, +along with a few other Pod management related functionality. This allows a deploy to continue even when the CLI connection is interrupted.
+Behind the scenes your application deploy will be built up of a Deployment object per process type, +each having multiple ReplicaSets (one per release) which in turn manage the Pods running your application.
+Drycc Workflow will behave the same way with DRYCC_KUBERNETES_DEPLOYMENTS
enabled or disabled (only applicable to versions prior to 2.4).
+The changes are behind the scenes. Where you will see differences while using the CLI is drycc ps:list
will output Pod names differently.
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+You can use drycc domains
to add or remove custom domains to the application:
$ drycc domains:add hello.bacongobbler.com --ptype=web
+Adding hello.bacongobbler.com to finest-woodshed... done
+
+Once that’s done, you can go into a DNS registrar and set up a CNAME from the new +appname to the old one:
+$ dig hello.dryccapp.com
+[...]
+;; ANSWER SECTION:
+hello.bacongobbler.com. 1759 IN CNAME finest-woodshed.dryccapp.com.
+finest-woodshed.dryccapp.com. 270 IN A 172.17.8.100
+
+!!! note +Setting a CNAME for a root domain can cause issues. Setting an @ record +to be a CNAME causes all traffic to go to the other domain, including mail and the SOA +(“start-of-authority”) records. It is highly recommended that you bind a subdomain to +an application, however you can work around this by pointing the @ record to the +address of the load balancer (if any).
+To add or remove the application from the routing mesh, use drycc routing
:
$ drycc routing:disable
+Disabling routing for finest-woodshed... done
+
+This will make the application unreachable through the Router, but the application is still +reachable internally through its Kubernetes Service. To re-enable routing:
+$ drycc routing:enable
+Enabling routing for finest-woodshed... done
+
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Learn how to deploy the application to drycc.
+An overview of buildpacks, which are responsible for transforming deployed code into a slug, which can then be executed on a container.
+Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+Deploy an application using a container image stored in your Drycc Container Registry.
+A Procfile is a list of process types in an app. Each process type declares a command that is executed when a container of that process type is started.
+How to store configuration of a Drycc app in the environment, keeping config out of code, making it easy to maintain app or deployment specific configs.
+Metrics supports basic monitoring capabilities for Pod, providing various monitoring indicators such as CPU, memory, disk, network, etc., to meet the basic monitoring requirements for Pod resources.
+This is a high-level, technical description of how Drycc works. It ties together many of the concepts you’ll encounter while writing, configuring, deploying and running applications on the Drycc platform.
+Drycc supports many types of volumes. A container can use any number of volume types simultaneously.
+A Gateway describes how traffic can be translated to Services within the cluster.
+Tools and services for developing, extending, and operating your app.
+The Communication Solution between Drycc Applicatios.
+Drycc Workflow supports restricting memory and CPU shares of each process.
+Make your apps accessible via custom domain names.
+SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web requests.
+Drycc Container Registry allows you to deploy your Docker-based app to Drycc. Both Common Runtime and Private Spaces are supported.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+A common architecture pattern of multi-process applications is to have one process serve public requests while having multiple other processes supporting the public one to, for example, perform actions on a schedule or process work items from a queue. To implement this system of apps in Drycc Workflow, set up the apps to communicate using DNS resolution, as shown above, and hide the supporting processes from public view by removing them from the Drycc Workflow router.
+Drycc Workflow supports deploying a single app composed of a system of processes. Each Drycc Workflow app communicates on a single port, so communicating with another Workflow app means finding that app’s address and port. All Workflow apps are mapped to port 80 externally, so finding its IP address is the only challenge. Workflow creates a Kubernetes Service for each app, which effectively assigns a name and one cluster-internal IP address to an app. The DNS service running in the cluster adds and removes DNS records which point from the app name to its IP address as services are added and removed. Drycc Workflow apps, then, can simply send requests to the domain name given to the service, which is “app-name.app-namespace”.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+6 minute read
+A Drycc application stores config in environment variables.
+Use drycc config
to modify environment variables for a deployed application.
$ drycc help config
+Valid commands for config:
+
+config:list list environment variables for an app
+config:set set environment variables for an app
+config:unset unset environment variables for an app
+config:pull extract environment variables to .env
+config:push set environment variables from .env
+
+Use `drycc help [command]` to learn more.
+
+When config is changed, a new release is created and deployed automatically.
+You can set multiple environment variables with one drycc config:set
command,
+or with drycc config:push
and a local .env file.
$ drycc config:set FOO=1 BAR=baz && drycc config:pull
+$ cat .env
+FOO=1
+BAR=baz
+$ echo "TIDE=high" >> .env
+$ drycc config:push
+Creating config... done, v4
+
+=== yuppie-earthman
+DRYCC_APP: yuppie-earthman
+FOO: 1
+BAR: baz
+TIDE: high
+
+It can also modify environment variables for a process type of application.
+$ drycc config:set FOO=1 BAR=baz --ptype=web
+
+Drycc treats backing services like databases, caches and queues as attached resources. +Attachments are performed using environment variables.
+For example, use drycc config
to set a DATABASE_URL
that attaches
+the application to an external PostgreSQL database.
$ drycc config:set DATABASE_URL=postgres://user:pass@example.com:5432/db
+=== peachy-waxworks
+DATABASE_URL: postgres://user:pass@example.com:5432/db
+
+Detachments can be performed with drycc config:unset
.
By default, apps using the [Imagebuilder][] will reuse the latest image data. +When deploying applications that depend on third-party libraries that have to be fetched, +this could speed up deployments a lot. In order to make use of this, the buildpack must implement +the cache by writing to the cache directory. Most buildpacks already implement this, but when using +custom buildpacks, it might need to be changed to make full use of the cache.
+In some cases, cache might not speed up your application. To disable caching, you can set the
+DRYCC_DISABLE_CACHE
variable with drycc config:set DRYCC_DISABLE_CACHE=1
. When you disable the
+cache, Drycc will clear up files it created to store the cache. After having it turned off, run
+drycc config:unset DRYCC_DISABLE_CACHE
to re-enable the cache.
Use the following procedure to clear the cache:
+$ drycc config:set DRYCC_DISABLE_CACHE=1
+$ git commit --allow-empty -m "Clearing Drycc cache"
+$ git push drycc # (if you use a different remote, you should use your remote name)
+$ drycc config:unset DRYCC_DISABLE_CACHE
+
+By default, Workflow only checks that the application starts in their Container. If it is preferred +to have Kubernetes respond to application health, a health check may be added by configuring a +health check probe for the application.
+The health checks are implemented as Kubernetes container probes. A liveness
+and a readiness
probe can be configured, and each probe can be of type httpGet
, exec
, or
+tcpSocket
depending on the type of probe the container requires.
A liveness probe is useful for applications running for long periods of time, eventually +transitioning to broken states and cannot recover except by restarting them.
+Other times, a readiness probe is useful when the container is only temporarily unable to serve, +and will recover on its own. In this case, if a container fails its readiness probe, the container +will not be shut down, but rather the container will stop receiving incoming requests.
+httpGet
probes are just as it sounds: it performs a HTTP GET operation on the Container. A
+response code inside the 200-399 range is considered a pass.
exec
probes run a command inside the Container to determine its health, such as
+cat /var/run/myapp.pid
or a script that determines when the application is ready. An exit code of
+zero is considered a pass, while a non-zero status code is considered a fail.
tcpSocket
probes attempt to open a socket in the Container. The Container is only considered
+healthy if the check can establish a connection. tcpSocket
probes accept a port number to perform
+the socket connection on the Container.
Health checks can be configured on a per-proctype basis for each application using drycc healthchecks:set
. If no type is mentioned then the health checks are applied to default proc type web, whichever is present. To
+configure a httpGet
liveness probe:
$ drycc healthchecks:set liveness httpGet 80 --ptype web
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
If the application relies on certain headers being set (such as the Host
header) or a specific
+URL path relative to the root, you can also send specific HTTP headers:
$ drycc healthchecks:set liveness httpGet 80 \
+ --path /welcome/index.html \
+ --headers "X-Client-Version:v1.0,X-Foo:bar"
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[X-Client-Version=v1.0] path=/welcome/index.html port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
To configure an exec
readiness probe:
$ drycc healthchecks:set readiness exec -- /bin/echo -n hello --ptype web
+Applying readinessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ readiness web exec /bin/echo -n hello delay=50s timeout=50s period=10s #success=1 #failure=3
+
You can overwrite a probe by running drycc healthchecks:set
again:
$ drycc healthchecks:set readiness httpGet 80 --ptype web
+Applying livenessProbe healthcheck... done
+
+App: peachy-waxworks
+UUID: afd84067-29e9-4a5f-9f3a-60d91e938812
+Owner: dev
+Created: 2023-12-08T10:25:00Z
+Updated: 2023-12-08T10:25:00Z
+Healthchecks:
+ liveness web http-get headers=[] path=/ port=80 delay=50s timeout=50s period=10s #success=1 #failure=3
+
Configured health checks also modify the default application deploy behavior. When starting a new +Pod, Workflow will wait for the health check to pass before moving onto the next Pod.
+By default, Changes the config, limits or healthchecks and so on will trigger deploy. +If you don’t want deploy, you can disable.
+$ drycc autodeploy:disable
+
To re-enable autodeploy.
+drycc autodeploy:enable
+
you can deploy by executing the following command. +deploy all ptypes
+drycc releases:deploy
+
deploy web process type, and support --force
option to force deploy.
drycc releases:deploy web --force
+
By default, deployment failures will roll back to the previous successful version. +If you don’t want this to happen, you can disable.
+$ drycc autorollback:disable
+
To re-enable autorollback.
+drycc autorollback:enable
+
Workflow supports isolating applications onto a set of nodes using drycc tags
.
!!! note +In order to use tags, you must first launch your cluster with the proper node labels. If you do +not, tag commands will fail. Learn more by reading “Assigning Pods to Nodes”.
+Once your nodes are configured with appropriate label selectors, use drycc tags:set
to restrict
+the application ptype to those nodes:
$ drycc tags:set web environ=prod
+Applying tags... done, v4
+
+environ prod
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+A Gateway describes how traffic can be translated to Services within the cluster. That is, it defines a request for a way to translate traffic from somewhere that does not know about Kubernetes to somewhere that does. For example, traffic sent to a Kubernetes Service by a cloud load balancer, an in-cluster proxy, or an external hardware load balancer. While many use cases have client traffic originating “outside” the cluster, this is not a requirement.
+Gateway is a way of exposing services externally, which generates an external IP address to connect route and service. +After deploy, the gateway has been created.
+List the containers:
+# drycc gateways
+NAME LISENTER PORT PROTOCOL ADDRESSES
+python-getting-started tcp-80-0 80 HTTP 101.65.132.51
+
You can also add a port in this gateway or create a one.
+# drycc gateways:add python-getting-started --port=443 --protocol=HTTPS
+Adding gateway python-getting-started to python-getting-started... done
+
Service is a way of exposing services internally, creating a service generates an internal DNS that can access ptype
.
+the web process type has been created, for others types, you should add as needed.
List the services:
+$ drycc services
+PTYPE PORT PROTOCOL TARGET-PORT DOMAIN
+web 80 TCP 8000 python-getting-started.python-getting-started.svc.cluster.local
+
Add a new service for process type
+# drycc services:add --help
+# drycc services:add sleep 8001:8001
+
A Gateway may be attached to one or more Route references which serve to direct traffic for a subset of traffic to a specific service. +Same as the above, the web process type already bind the gateway and servies.
+# drycc routes
+NAME OWNER PTYPE KIND SERVICE-PORT GATEWAY LISTENER-PORT
+python-getting-started demo web HTTPRoute 80 python-getting-started 80
+
create a new route and attach gateway.
+drycc routes:create sleep --ptype=sleep --kind=HTTPRoute --port=8001
+drycc routes:attach sleep --gateway=python-getting-started --port=80
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+4 minute read
+Drycc Workflow tracks all changes to your application. Application changes are the result of either new application code
+pushed to the platform (via git push drycc master
), or an update to application configuration (via drycc config:set KEY=VAL
).
Each time a build or config change is made to your application a new release is created. These release numbers +increase monotonically.
+You can see a record of changes to your application using drycc releases
:
$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Drycc Workflow also supports rolling back go previous releases. If buggy code or an errant configuration change is pushed +to your application, you may rollback to a previously known, good release.
+!!! note +All rollbacks create a new, numbered release. But will reference the build/code and configuration from the desired rollback point.
+In this example, the application is currently running release v4. Using drycc rollback v2
tells Workflow to deploy the
+build and configuration that was used for release v2. This creates a new release named v5 whose contents are the source
+and configuration from release v2:
$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
+$ drycc rollback v2
+Rolled back to v2
+
+$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v4 2023-12-04T10:20:46Z dev rolled back to v2
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Only rollback web process type:
+$ drycc rollback v3 web
+Rolled back to v3
+
+$ drycc releases
+OWNER STATE VERSION CREATED SUMMARY
+dev succeed v5 2023-12-04T10:23:49Z dev rolled back to v3
+dev succeed v4 2023-12-04T10:20:46Z dev rolled back to v2
+dev succeed v3 2023-12-04T10:17:46Z dev deleted PIP_INDEX_URL, DISABLE_COLLECTSTATIC
+dev succeed v2 2023-12-01T10:20:22Z dev added IMAGE_PULL_POLICY, PIP_INDEX_URL, PORT, DISABLE_COLLEC[...]
+dev succeed v1 2023-11-30T17:54:57Z dev created initial release
+
Drycc applications use one-off processes for admin tasks like database migrations and other commands that must run against the live application.
+Use drycc run
to execute commands on the deployed application.
$ drycc run 'ls -l'
+Running `ls -l`...
+
+total 28
+-rw-r--r-- 1 root root 553 Dec 2 23:59 LICENSE
+-rw-r--r-- 1 root root 60 Dec 2 23:59 Procfile
+-rw-r--r-- 1 root root 33 Dec 2 23:59 README.md
+-rw-r--r-- 1 root root 1622 Dec 2 23:59 pom.xml
+drwxr-xr-x 3 root root 4096 Dec 2 23:59 src
+-rw-r--r-- 1 root root 25 Dec 2 23:59 system.properties
+drwxr-xr-x 6 root root 4096 Dec 3 00:00 target
+
+Use drycc perms:add
to allow another Drycc user to collaborate on your application.
$ drycc perms:add otheruser view,change,delete
+Adding user otheruser as a collaborator for view,change,delete peachy-waxwork... done
+
Use drycc perms
to see who an application is currently shared with, and drycc perms:remove
to remove a collaborator.
!!! note +Collaborators can do anything with an application that its owner can do, except delete the application.
+When working with an application that has been shared with you, clone the original repository and add Drycc’ git remote
+entry before attempting to git push
any changes to Drycc.
$ git clone https://github.com/drycc/example-java-jetty.git
+Cloning into 'example-java-jetty'... done
+$ cd example-java-jetty
+$ git remote add -f drycc ssh://git@local3.dryccapp.com:2222/peachy-waxworks.git
+Updating drycc
+From drycc-controller.local:peachy-waxworks
+ * [new branch] master -> drycc/master
+
Applications deployed on Drycc Workflow treat logs as event streams. Drycc Workflow aggregates stdout
and stderr
+from every Container making it easy to troubleshoot problems with your application.
Use drycc logs
to view the log output from your deployed application.
$ drycc logs -f
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.Server:jetty-7.6.0.v20120127
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.5]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10005
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.6]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10006
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejsh.ContextHandler:started o.e.j.s.ServletContextHandler{/,null}
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.7]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10007
+Dec 3 00:30:31 ip-10-250-15-201 peachy-waxworks[web.8]: INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:10008
+
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Create an authentication token using the drycc client.
+# drycc tokens:add prometheus --password admin --username admin
+ ! WARNING: Make sure to copy your token now.
+ ! You won't be able to see it again, please confirm whether to continue.
+ ! To proceed, type "yes" !
+
+> yes
+UUID USERNAME TOKEN
+58176cf1-37a8-4c52-9b27-4c7a47269dfb admin 1F2c7A802aF640fd9F31dD846AdDf56BcMsay
+
A valid example file can be found here.
+The global configuration specifies parameters that are valid in all other configuration contexts. They also serve as defaults for other configuration sections.
+global:
+ scrape_interval: 60s
+ evaluation_interval: 60s
+scrape_configs:
+- job_name: 'drycc'
+ scheme: https
+ metrics_path: /v2/apps/<appname>/metrics
+ authorization:
+ type: Token
+ credentials: 1F2c7A802aF640fd9F31dD846AdDf56BcMsay
+ static_configs:
+ - targets: ['drycc.domain.com']
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+8 minute read
+Drycc Workflow manages your application as a set of processes that can be named, scaled and configured according to their +role. This gives you the flexibility to easily manage the different facets of your application. For example, you may have +web-facing processes that handle HTTP traffic, background worker processes that do async work, and a helper process that +streams from the Twitter API.
+By using a Procfile, either checked in to your application or provided via the CLI you can specify the name of the type
+and the application command that should run. To spawn other process types, use drycc scale <ptype>=<n>
to scale those
+types accordingly.
In the absence of a Procfile, a single, default process type is assumed for each application.
+Applications built using Buildpacks via git push
implicitly receive a web
process type, which starts
+the application server. Rails 4, for example, has the following process type:
web: bundle exec rails server -p $PORT
+
+All applications utilizing Dockerfiles have an implied web
process type, which runs the
+Dockerfile’s CMD
directive unmodified:
$ cat Dockerfile
+FROM centos:latest
+COPY . /app
+WORKDIR /app
+CMD python -m SimpleHTTPServer 5000
+EXPOSE 5000
+
+For the above Dockerfile-based application, the web
process type would run the Container CMD
of python -m SimpleHTTPServer 5000
.
Applications utilizing remote Container images, a web
process type is also implied, and runs the CMD
+specified in the Container image.
!!! note
+The web
process type is special as they’is the default process type that will
+receive HTTP traffic from Workflow’s routers. Other process types can be named arbitrarily.
If you use Buildpack or Dockerfile builds and want to override or specify additional process
+types, simply include a file named Procfile
in the root of your application’s source tree.
The format of a Procfile
is one process type per line, with each line containing the command to invoke:
<process type>: <command>
+
+The syntax is defined as:
+<process type>
– a lowercase alphanumeric string, is a name for your command, such as web, worker, urgentworker, clock, etc.<command>
– a command line to launch the process, such as rake jobs:work
.This example Procfile specifies two types, web
and sleeper
. The web
process launches a web server on port 5000 and
+a simple process which sleeps for 900 seconds and exits.
$ cat Procfile
+web: bundle exec ruby web.rb -p ${PORT:-5000}
+sleeper: sleep 900
+
If you are using remote Container images, you may define process types by either running drycc pull
with a
+Procfile
in your working directory, or by passing a stringified Procfile to the --procfile
CLI option.
For example, passing process types inline:
+$ drycc pull drycc/example-go:latest --procfile="web: /app/bin/boot"
+
Read a Procfile
in another directory:
$ drycc pull drycc/example-go:latest --procfile="$(cat deploy/Procfile)"
+
Or via a Procfile located in your current, working directory:
+$ cat Procfile
+web: /bin/boot
+sleeper: echo "sleeping"; sleep 900
+
+
+$ drycc pull -a steely-mainsail drycc/example-go
+Creating build... done
+
+$ drycc scale sleeper=1 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 0s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+steely-mainsail-sleeper-76c45b967c-4qm6w v3 up sleeper 1/1 0 2023-12-08T02:25:00UTC
+steely-mainsail-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
!!! note
+Only process types of web
will be scaled to 1 automatically. If you have additional process types
+remember to scale the process counts after creation.
To remove a process type simply scale it to 0:
+$ drycc scale sleeper=0 -a steely-mainsail
+Scaling processes... but first, coffee!
+done in 3s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+steely-mainsail-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
Applications deployed on Drycc Workflow scale out via the process model. Use drycc scale
to control the number of
+containers that power your app.
$ drycc scale web=5 -a iciest-waggoner
+Scaling processes... but first, coffee!
+done in 3s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+iciest-waggoner-web-c4f44c4b4-7p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-8p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-9p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-1p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+iciest-waggoner-web-c4f44c4b4-2p7dh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
If you have multiple process types for your application you may scale the process count for each type separately. For +example, this allows you to manage web process independently from background workers. For more information on process +types see our documentation for Managing App Processes.
+In this example, we are scaling the process type web
to 5 but leaving the process type background
with one worker.
$ drycc scale web=5
+Scaling processes... but first, coffee!
+done in 4s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-7lord v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-jn957 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vwhnh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v3 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v3 up web 1/1 0 2023-12-08T02:25:00UTC
+
Scaling a process down, by reducing the process count, sends a TERM
signal to the processes, followed by a SIGKILL
+if they have not exited within 30 seconds. Depending on your application, scaling down may interrupt long-running HTTP
+client connections.
For example, scaling from 5 processes to 3:
+$ drycc scale web=3
+Scaling processes... but first, coffee!
+done in 1s
+
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vwhnh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-vokg9 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
Autoscale allows adding a minimum and maximum number of pods on a per process type basis. This is accomplished by specifying a target CPU usage across all available pods.
+This feature is built on top of Horizontal Pod Autoscaling in Kubernetes or HPA for short.
+!!! note +This is an alpha feature. It is recommended to be on the latest Kubernetes when using this feature.
+$ drycc autoscale:set web --min=3 --max=8 --cpu-percent=75
+Applying autoscale settings for process type web on scenic-icehouse... done
+
And then review the scaling rule that was created for web
$ drycc autoscale:list
+PTYPE PERCENT MIN MAX
+web 75 3 8
+
Remove scaling rule
+$ drycc autoscale:unset web
+Removing autoscale for process type web on scenic-icehouse... done
+
For autoscaling to work CPU requests have to be specified on each application Pod (can be done via drycc limits --cpu
). This allows the autoscale policies to do the appropriate calculations and make decisions on when to scale up and down.
Scale up can only happen if there was no rescaling within the last 3 minutes. Scale down will wait for 5 minutes from the last rescaling. That information and more can be found at HPA algorithm page.
+List the containers:
+$ drycc ps
+NAME RELEASE STATE PTYPEE READY RESTARTS STARTED
+python-getting-started-web-69b7d4bfdc-kl4xf v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+=== python-getting-started Processes
+--- web:
+python-getting-started-web-69b7d4bfdc-kl4xf up (v2)
+
fetch the container logs:
+$ drycc ps:logs -f python-getting-started-web-69b7d4bfdc-kl4xf
+[2024-05-24 07:14:39 +0000] [1] [INFO] Starting gunicorn 20.1.0
+[2024-05-24 07:14:39 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
+[2024-05-24 07:14:39 +0000] [1] [INFO] Using worker: gevent
+[2024-05-24 07:14:39 +0000] [8] [INFO] Booting worker with pid: 8
+[2024-05-24 07:14:39 +0000] [9] [INFO] Booting worker with pid: 9
+[2024-05-24 07:14:39 +0000] [10] [INFO] Booting worker with pid: 10
+[2024-05-24 07:14:39 +0000] [11] [INFO] Booting worker with pid: 11
+
List the containers:
+$ drycc ps:describe python-getting-started-web-69b7d4bfdc-kl4xf
+Container: python-getting-started-web
+Image: drycc/python-getting-started:latest
+Command:
+Args:
+ - gunicorn
+ - -c
+ - gunicorn_config.py
+ - helloworld.wsgi:application
+State: running
+ startedAt: "2024-05-24T07:14:39Z"
+Ready: true
+Restart Count: 0
+
Delete the containers. +Due to the set number of replicas, a new container will be launched to meet the quantity requirement.
+$ drycc ps:delete python-getting-started-web-69b7d4bfdc-kl4xf
+Deleting python-getting-started-web-69b7d4bfdc-kl4xf from python-getting-started... done
+
Verify that the container is running:
+$ drycc ps
+NAME RELEASE STATE PTYPEE READY RESTARTS STARTED
+python-getting-started-web-69b7d4bfdc-kl4xf v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+=== python-getting-started Processes
+--- web:
+python-getting-started-web-69b7d4bfdc-kl4xf up (v2)
+
Get a shell to the running container:
+$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -it -- bash
+
In your shell, list the root directory:
+# Run this inside the container
+ls /
+
Running individual commands in a container
+$ drycc ps:exec python-getting-started-web-69b7d4bfdc-kl4xf -- date
+
Use “drycc ps –help” for a list of global command-line (applies to all commands).
+If you need to restart an application process, you may use drycc pts:restart
. Behind the scenes, Drycc Workflow instructs
+Kubernetes to terminate the old process and launch a new one in its place.
$ drycc ps
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v2 up web 1/1 0 2023-12-08T02:50:21UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 up web 1/1 0 2023-12-08T02:25:00UTC
+
+$ drycc pts:restart scenic-icehouse-background
+NAME RELEASE STATE PTYPE READY RESTARTS STARTED
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-web-3291896318-rsekj v2 up web 1/1 0 2023-12-08T02:50:21UTC
+scenic-icehouse-web-3291896318-vokg7 v2 up web 1/1 0 2023-12-08T02:25:00UTC
+scenic-icehouse-background-3291896318-yf8kh v2 starting web 1/1 0 2023-12-08T02:25:00UTC
+
Notice that the process name has changed from scenic-icehouse-background-3291896318-yf8kh
to
+scenic-icehouse-background-3291896318-yd87g
. In a multi-node Kubernetes cluster, this may also have the effect of scheduling
+the Pod to a new node.
Use “drycc pts –help” for a list of pts command-line (process types info).
+$ drycc pts
+NAME RELEASE READY UP-TO-DATE AVAILABLE STARTED
+web v2 3/3 1 1 2023-12-08T02:25:00UTC
+background v2 1/1 1 1 2023-12-08T02:25:00UTC
+
$ drycc pts:describe web
+Container: python-getting-started-web
+Image: drycc/python-getting-started:latest
+Command:
+Args:
+ - gunicorn
+ - -c
+ - gunicorn_config.py
+ - helloworld.wsgi:application
+Limits:
+ cpu 1
+ ephemeral-storage 2Gi
+ memory 1Gi
+Liveness: http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3
+Readiness: http-get headers=[] path=/geo/ port=8000 delay=120s timeout=10s period=20s #success=1 #failure=3
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+3 minute read
+We can use blow command to create resources and bind which resource is created. +This command depend on service-catalog.
+Use drycc resources
to create and bind a resource for a deployed application.
$ drycc help resources
+
+Valid commands for resources:
+
+resources:services list all available resource services
+resources:plans list all available plans for an resource services
+resources:create create a resource for the application
+resources:list list resources in the application
+resources:describe get a resource detail info in the application
+resources:update update a resource from the application
+resources:destroy delete a resource from the applicationa
+resources:bind bind a resource to servicebroker
+resources:unbind unbind a resource from servicebroker
+
+Use 'drycc help [command]' to learn more.
+
+You can list available resource services with one drycc resources:services
command
$ drycc resources:services
+ID NAME UPDATEABLE
+15032a52-33c2-4b40-97aa-ceb972f51509 airflow true
+b7cb26a4-b258-445c-860b-a664239a67f8 cloudbeaver true
+9ce3c3ba-33b5-4e4e-a5e9-a338a83d5070 flink true
+b80c51a1-957c-4d93-b3d5-efde84cd8031 fluentbit true
+fff5b6c7-ed85-429b-8265-493e40cc53c7 grafana true
+412e368f-bf78-4798-92cc-43343119a57d kafka true
+ea2a9b87-fbc4-4e2a-adee-161c1f91d98d minio true
+383f7316-84f3-4955-8491-1d4b02b749c8 mongodb true
+fbee746b-f3a7-4bef-8b55-cbecfd4c8ac3 mysql-cluster true
+5975094d-45cc-4e85-8573-f93937d026c7 opensearch true
+1db95161-7193-4544-8c76-e5ad5f6c03f6 pmm true
+5cfb0abf-276c-445b-9060-9aa964ede87d postgresql-cluster true
+b8f70264-eafc-4b2f-848e-2ec0d059032b prometheus true
+f8186d36-f334-4094-8e02-d21a61da657b rabbitmq true
+e1fd0d37-9046-4152-a29b-d155c5657c8b redis true
+7d2b64c6-0b59-4f08-a2f5-7b17cea6e5ee redis-cluster true
+2e6877df-86e7-4bcc-a869-2a9b6847a465 seaweedfs true
+4aea5c0f-9495-420d-896a-ffc61a3eced5 spark true
+b50db3b5-8d5f-4be9-b8bd-467ecd6cc11d zookeeper true
+
+You can list all available plans for an resource services with one drycc resources:plans
command
$ drycc resources:plans redis
+ID NAME DESCRIPTION
+8d659058-a3b4-4058-b039-cc03a31b9442 standard-128 Redis standard-128 plan which limit resources memory size 128Mi.
+36e3dbec-fc51-4f6b-9baa-e31e316858be standard-256 Redis standard-256 plan which limit resources memory size 256Mi.
+560817c2-5aa1-41c4-9ee6-a77e3ee552d5 standard-512 Redis standard-512 plan which limit resources memory size 512Mi.
+d544d989-9fb8-43e9-a74e-0840ce1b8f0f standard-1024 Redis standard-1024 plan which limit resources memory size 1Gi.
+ad51b7bb-9b12-4ffd-8e49-010c0141b263 standard-2048 Redis standard-2048 plan which limit resources memory size 2Gi.
+5097d76e-557c-453f-bdb1-54009e0df78d standard-4096 Redis standard-4096 plan which limit resources memory size 4Gi.
+be3fa2d0-36d2-47c5-9561-9deffe5ba373 standard-8192 Redis standard-8192 plan which limit resources memory size 8Gi.
+4ca812a8-d7c3-439f-96cd-26523e88400e standard-16384 Redis standard-16384 plan which limit resources memory size 16Gi.
+b7f2a71f-0d97-48fd-8eed-aab24a7822f3 standard-32768 Redis standard-32768 plan which limit resources memory size 32Gi.
+25c6b5d5-7505-47c8-95b1-dc9bdc698063 standard-65536 Redis standard-65536 plan which limit resources memory size 64Gi.
+
+You can create a resource with one drycc resources:create
command
$ drycc resources:create redis:1000 redis
+Creating redis to scenic-icehouse... done
+
+After resources are created, you can list the resources in this application.
+$ drycc resources:list
+UUID NAME OWNER PLAN UPDATED
+07220e9e-d54d-4d74-a88c-f464aa374386 redis admin redis:standard-128 2024-05-08T01:01:00Z
+
+The resource which is named redis is created, you can bind the redis to the application,
+use the command of drycc resources:bind redis
.
$ drycc resources:bind redis
+Binding resource... done
+
+And use drycc resources:describe
show the binding detail. If the binding is successful, this command will show the information of connect to the resource.
$ drycc resources:describe redis
+=== scenic-icehouse resource redis
+plan: redis:1000
+status: Ready
+binding: Ready
+
+REDISPORT: 6379
+REDIS_PASSWORD: RzG87SJWG1
+SENTINELHOST: 172.16.0.2
+SENTINELPORT: 26379
+
+You can use the drycc resources:update
command to upgrade a new plan.
+An example of how to upgrade the plan’s capacity to 100MB:
$ drycc resources:update redis:10000 redis
+Updating redis to scenic-icehouse... done
+
+If you don’t need resources, use drycc resources:unbind
to unbind the resource and then use drycc resources:destroy
to delete the resource from the application.
+Before deleting the resource, the resource must be unbinded.
$ drycc resources:unbind redis
+Unbinding resource... done
+
+$ drycc resources:destroy redis
+Deleting redis from scenic-icehouse... done
+
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+We can use the blow command to create volumes and mount the created volumes. +Drycc create volume support ReadWriteMany, so before deploying drycc, you need to have a StorageClass ready which can support ReadWriteMany. +Deploying drycc, set controller.appStorageClass to this StorageClass.
+Use drycc volumes
to mount a volume for a deployed application’s processes.
$ drycc help volumes
+Valid commands for volumes:
+
+volumes:create create a volume for the application
+volumes:list list volumes in the application
+volumes:delete delete a volume from the application
+volumes:client the client used to manage volume files
+volumes:mount mount a volume to process of the application
+volumes:unmount unmount a volume from process of the application
+
+Use 'drycc help [command]' to learn more.
+
+You can create a csi volume with the drycc volumes:create
command.
$ drycc volumes:create myvolume 200M
+Creating myvolumes to scenic-icehouse... done
+
+Or use an existing nfs server
+$ drycc volumes:create myvolume 200M -t nfs --nfs-server=nfs.drycc.com --nfs-path=/
+Creating myvolumes to scenic-icehouse... done
+
+After volume is created, you can list the volumes in this application.
+$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes 200M
+
+The volume which is named myvolumes is created, you can mount the volume with process of the application,
+use the command of drycc volumes:mount
. When volume is mounted, a new release will be created and deployed automatically.
$ drycc volumes:mount myvolumes web=/data/web
+Mounting volume... done
+
+And use drycc volumes:list
show mount detail.
$ drycc volumes:list
+=== scenic-icehouse volumes
+--- myvolumes 200M
+web /data/web
+
+If you don’t need the volume, use drycc volumes:unmount
to unmount the volume and then use drycc volumes:delete
to delete the volume from the application.
+Before deleting volume, the volume has to be unmounted.
$ drycc volumes:unmount myvolumes web
+Unmounting volume... done
+
+$ drycc volumes:delete myvolumes
+Deleting myvolumes from scenic-icehouse... done
+
+Assume the volume which is named myvolumes is created and mounted.
+Prepare a file named testfile.
+$ echo "testtext" > testfile
+
+Upload. +$ drycc volumes:client cp testfile vol://myvolume/ +[↑] testfile 100% [==================================================] (5/ 5 B, 355 B/s)
+List files in myvolume.
+$ drycc volumes:client ls vol://myvolume/
+[2024-07-22T15:32:28+08:00] 5 testfile
+
+Delete testfle in myvolume.
+$ drycc volumes:client rm vol://myvolume/testfile
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Drycc Workflow supports restricting memory and CPU shares of each process. Requests/Limits set on a per-process type are given to
+Kubernetes as a requests and limits. Which means you guarantee <requests> amount of resource for a process as well as limit
+the process from using more than <limits>.
+By default, Kubernetes will set <requests> equal to <limit> if we don’t explicitly set <requests> value. Please keep in mind that 0 <= requests <= limits
.
If you set a requests/limits that is out of range for your cluster, Kubernetes will be unable to schedule your application +processes into the cluster!
+$ drycc limits:plans
+
+ID SPEC CPU VCPUS MEMORY FEATURES
+std1.large.c1m1 std1 Universal CPU 1 1 GiB Integrated GPU shared
+std1.large.c1m2 std1 Universal CPU 1 2 GiB Integrated GPU shared
+std1.large.c1m4 std1 Universal CPU 1 4 GiB Integrated GPU shared
+std1.large.c1m8 std1 Universal CPU 1 8 GiB Integrated GPU shared
+std1.large.c2m2 std1 Universal CPU 2 2 GiB Integrated GPU shared
+std1.large.c2m4 std1 Universal CPU 2 4 GiB Integrated GPU shared
+std1.large.c2m8 std1 Universal CPU 2 8 GiB Integrated GPU shared
+std1.large.c2m16 std1 Universal CPU 2 16 GiB Integrated GPU shared
+
+$ drycc limits:set web=std1.large.c1m1
+Applying limits... done
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+6 minute read
+SSL is a cryptographic protocol that provides end-to-end encryption and integrity for all web +requests. Apps that transmit sensitive data should enable SSL to ensure all information is +transmitted securely.
+To enable SSL on a custom domain, e.g., www.example.com
, use the SSL endpoint.
!!! note
+drycc certs
is only useful for custom domains. Default application domains are
+SSL-enabled already and can be accessed simply by using https,
+e.g. https://foo.dryccapp.com
(provided that you have installed your wildcard
+certificate on the routers or on the load balancer).
Because of the unique nature of SSL validation, provisioning SSL for your domain is a multi-step +process that involves several third-parties. You will need to:
+Purchasing an SSL cert varies in cost and process depending on the vendor. RapidSSL offers a +simple way to purchase a certificate and is a recommended solution. If you’re able to use this +provider, see buy an SSL certificate with RapidSSL for instructions.
+Once the SSL certificate is provisioned and your cert is confirmed, you must route requests for +your domain through Drycc. Unless you’ve already done so, add the domain specified when generating +the CSR to your app with:
+$ drycc domains:add www.example.com --ptype==web -a foo
+Adding www.example.com to foo... done
+
+Add your certificate, any intermediate certificates, and private key to the endpoint with the
+certs:add
command.
$ drycc certs:add example-com server.crt server.key -a foo
+Adding SSL endpoint... done
+www.example.com
+
+!!! note +The name given to the certificate can only contain a-z (lowercase), 0-9 and hyphens
+The Drycc platform will investigate the certificate and extract any relevant information from it +such as the Common Name, Subject Alt Names (SAN), fingerprint and more.
+This allows for wildcard certificates and multiple domains in the SAN without uploading duplicates.
+Sometimes, your certificates (such as a self-signed or a cheap certificate) need additional +certificates to establish the chain of trust. What you need to do is bundle all the certificates +into one file and give that to Drycc. Importantly, your site’s certificate must be the first one:
+$ cat server.crt server.ca > server.bundle
+
+After that, you can add them to Drycc with the certs:add
command:
$ drycc certs:add example-com server.bundle server.key -a foo
+Adding SSL endpoint... done
+www.example.com
+
+Certificates are not automagically connected up to domains, instead you will have to attach a +certificate to a domain
+$ drycc certs:attach example-com example.com -a foo
+
+Each certificate can be connected to many domains. There is no need to upload duplicates.
+To remove an association
+$ drycc certs:detach example-com example.com -a foo
+
+You can verify the details of your domain’s SSL configuration with drycc certs
.
$ drycc certs
+
+ Name | Common Name | SubjectAltName | Expires | Fingerprint | Domains | Updated | Created
++-------------+-------------------+-------------------+-------------------------+-----------------+--------------+-------------+-------------+
+ example-com | example.com | blog.example.com | 31 Dec 2017 (in 1 year) | 8F:8E[...]CD:EB | example.com | 30 Jan 2016 | 29 Jan 2016
+
+or by looking at at each certificates detailed information
+$ drycc certs:info example-com -a foo
+
+=== bar-com Certificate
+Common Name(s): example.com
+Expires At: 2017-01-14 23:57:57 +0000 UTC
+Starts At: 2016-01-15 23:57:57 +0000 UTC
+Fingerprint: 7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0
+Subject Alt Name: blog.example.com
+Issuer: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+Subject: /C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=example.com/emailAddress=engineering@drycc.cc
+
+Connected Domains: example.com
+Owner: admin-user
+Created: 2016-01-28 19:07:41 +0000 UTC
+Updated: 2016-01-30 00:10:02 +0000 UTC
+
+Use a command line utility like curl
to test that everything is configured correctly for your
+secure domain.
!!! note +The -k option flag tells curl to ignore untrusted certificates.
+Pay attention to the output. It should print SSL certificate verify ok
. If it prints something
+like common name: www.example.com (does not match 'www.somedomain.com')
then something is not
+configured correctly.
To enforce all HTTP requests be redirected to HTTPS, TLS can be enforced at the router level by +running
+$ drycc tls:force:enable -a foo
+Enabling https-only requests for foo... done
+
+Users hitting the HTTP endpoint for the application will now receive a 301 redirect to the HTTPS +endpoint.
+To disable enforced TLS, run
+$ drycc tls:force:disable -a foo
+Disabling https-only requests for foo... done
+
+With Automated Certificate Management (ACM), Drycc automatically manages TLS certificates for apps with Hobby and Professional dynos on the Common Runtime, and for apps in Private Spaces that enable the feature. +Certificates handled by ACM automatically renew one month before they expire, and new certificates are created automatically whenever you add or remove a custom domain. All applications with paid dynos include ACM for free. +Automated Certificate Management uses Let’s Encrypt, the free, automated, and open certificate authority for managing your application’s TLS certificates. Let’s Encrypt is run for the public benefit by the Internet Security Research Group (ISRG).
+To enable ACM with the following command: +$ drycc tls:auto:enable -a foo
+To disable ACM with the following command: +$ drycc tls:auto:disable -a foo
+You can remove a certificate using the certs:remove
command:
$ drycc certs:remove my-cert -a foo
+Removing www.example.com... Done.
+
+Over the lifetime of an application an operator will have to acquire certificates with new expire +dates and apply it to all relevant applications, below is the recommended way to swap out certificates.
+Be intentional with certificate names, name them example-com-2017
when possible, where the year
+signifies the expiry year. This allows for example-com-2018
when a new certificate is purchased.
Assuming all applications are already using example-com-2017
the following commands can be ran,
+chained together or otherwise:
$ drycc certs:detach example-com-2017 example.com -a foo
+$ drycc certs:attach example-com-2018 example.com -a foo
+
+This will take care of a singular domain which allows the operator to verify everything went +as planned and slowly roll it out to any other application using the same method.
+Here are some steps you can follow if your SSL endpoint is not working as you’d expect.
+In some cases when accessing the SSL endpoint, it may list your certificate as untrusted.
+If this occurs, it may be because it is not trusted by Mozilla’s list of root CAs. If this is +the case, your certificate may be considered untrusted for many browsers.
+If you have uploaded a certificate that was signed by a root authority but you get the message that
+it is not trusted, then something is wrong with the certificate. For example, it may be missing
+intermediary certificates. If so, download the intermediary certificates from your SSL provider,
+remove the certificate from Drycc and re-run the certs:add
command.
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+4 minute read
+Drycc supports deploying applications via Cloud Native Buildpacks. Cloud Native Buildpacks are useful if you want to follow cnb’s docs for building applications.
+For Buildpack based application deploys via git push
, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.
See this document for instructions on how to generate an SSH key.
+Run drycc keys:add
to upload your SSH key to Drycc Workflow.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
Read more about adding/removing SSH Keys here.
+If you do not have an existing application, you can clone an example application that demonstrates the Heroku Buildpack workflow.
+$ git clone https://github.com/drycc/example-go.git
+$ cd example-go
+
+Use drycc create
to create an application on the Controller.
$ drycc create
+Creating application... done, created skiing-keypunch
+Git remote drycc added
+
+Use git push drycc master
to deploy your application.
$ git push drycc master
+Counting objects: 75, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (48/48), done.
+Writing objects: 100% (75/75), 18.28 KiB | 0 bytes/s, done.
+Total 75 (delta 30), reused 58 (delta 22)
+remote: --->
+Starting build... but first, coffee!
+---> Waiting podman running.
+---> Process podman started.
+---> Waiting caddy running.
+---> Process caddy started.
+---> Building pack
+---> Using builder registry.drycc.cc/drycc/buildpacks:bookworm
+Builder 'registry.drycc.cc/drycc/buildpacks:bookworm' is trusted
+Pulling image 'registry.drycc.cc/drycc/buildpacks:bookworm'
+Resolving "drycc/buildpacks" using unqualified-search registries (/etc/containers/registries.conf)
+Trying to pull registry.drycc.cc/drycc/buildpacks:bookworm...
+Getting image source signatures
+...
+---> Skip generate base layer
+---> Python Buildpack
+---> Downloading and extracting Python 3.10.0
+---> Installing requirements with pip
+Collecting Django==3.2.8
+Downloading Django-3.2.8-py3-none-any.whl (7.9 MB)
+Collecting gunicorn==20.1.0
+Downloading gunicorn-20.1.0-py3-none-any.whl (79 kB)
+Collecting sqlparse>=0.2.2
+Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
+Collecting pytz
+Downloading pytz-2021.3-py2.py3-none-any.whl (503 kB)
+Collecting asgiref<4,>=3.3.2
+Downloading asgiref-3.4.1-py3-none-any.whl (25 kB)
+Requirement already satisfied: setuptools>=3.0 in /layers/drycc_python/python/lib/python3.10/site-packages (from gunicorn==20.1.0->-r requirements.txt (line 2)) (57.5.0)
+Installing collected packages: sqlparse, pytz, asgiref, gunicorn, Django
+Successfully installed Django-3.2.8 asgiref-3.4.1 gunicorn-20.1.0 pytz-2021.3 sqlparse-0.4.2
+---> Generate Launcher
+...
+Build complete.
+Launching App...
+...
+Done, skiing-keypunch:v2 deployed to Workflow
+
+Use 'drycc open' to view this application in your browser
+
+To learn more, use 'drycc help' or visit https://www.drycc.cc
+
+To ssh://git@drycc.staging-2.drycc.cc:2222/skiing-keypunch.git
+ * [new branch] master -> master
+
+$ curl -s http://skiing-keypunch.example.com
+Powered by Drycc
+Release v2 on skiing-keypunch-v2-web-02zb9
+
+Because a Buildpacks-style application is detected, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of pods running that process.
For convenience, a number of buildpacks come bundled with Drycc:
+Drycc will cycle through the bin/detect
script of each buildpack to match the code you
+are pushing.
!!! note +If you’re testing against the [Scala Buildpack][], the Builder requires at least +512MB of free memory to execute the Scala Build Tool.
+To use a custom buildpack, you need create a .pack_builder
file in your root path app.
$ tee > .pack_builder << EOF
+ > registry.drycc.cc/drycc/buildpacks:bookworm
+ > EOF
+
+On your next git push
, the custom buildpack will be used.
To pull code from private repositories, set the SSH_KEY
environment variable to a private key
+which has access. Use either the path of a private key file or the raw key material:
$ drycc config:set SSH_KEY=/home/user/.ssh/id_rsa
+$ drycc config:set SSH_KEY="""-----BEGIN RSA PRIVATE KEY-----
+(...)
+-----END RSA PRIVATE KEY-----"""
+
+For example, to use a custom buildpack hosted at a private GitHub URL, ensure that an SSH public
+key exists in your GitHub settings. Then set SSH_KEY
to the corresponding SSH private key
+and set .pack_builder
to the builder image:
$ tee > .pack_builder << EOF
+ > registry.drycc.cc/drycc/buildpacks:bookworm
+ > EOF
+$ git add .buildpack
+$ git commit -m "chore(buildpack): modify the pack_builder"
+$ git push drycc master
+
+Which way to build a project conforms to the following principles:
+container
buildpack
container
is used by defaultDRYCC_STACK
to container
or buildpack
determine which stack to use.Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+3 minute read
+Drycc supports deploying applications via an existing Docker Image. +This is useful for integrating Drycc into Docker-based CI/CD pipelines.
+Start by cloning an example application:
+$ git clone https://github.com/drycc/example-dockerfile-http.git
+$ cd example-dockerfile-http
+
+Next use your local docker
client to build the image and push
+it to DockerHub.
$ docker build -t <username>/example-dockerfile-http .
+$ docker push <username>/example-dockerfile-http
+
+In order to deploy Docker images, they must conform to the following requirements:
+EXPOSE
directive to expose exactly one port.CMD
directive to define the default process that will run within the container.!!! note
+Note that if you are using a private registry of any kind (gcr
or other) the application environment must include a $PORT
config variable that matches the EXPOSE
’d port, example: drycc config:set PORT=5000
. See Configuring Registry for more info.
Use drycc create
to create an application on the controller.
$ mkdir -p /tmp/example-dockerfile-http && cd /tmp/example-dockerfile-http
+$ drycc create example-dockerfile-http --no-remote
+Creating application... done, created example-dockerfile-http
+
+!!! note
+For all commands except for drycc create
, the drycc
client uses the name of the current directory
+as the app name if you don’t specify it explicitly with --app
.
Use drycc pull
to deploy your application from DockerHub or
+a public registry.
$ drycc pull <username>/example-dockerfile-http:latest
+Creating build... done, v2
+
+$ curl -s http://example-dockerfile-http.local3.dryccapp.com
+Powered by Drycc
+
+Because you are deploying a Docker image, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of Containers
+running that process.
To deploy Docker images from a private registry or from a private repository, use drycc registry
+to attach credentials to your application. These credentials are the same as you’d use when running
+docker login
at your private registry.
To deploy private Docker images, take the following steps:
+drycc registry:set username=<the-user> password=<secret> -a <application-name>
drycc pull
as normal, against an image in the private registryWhen using a GCR.io Long Lived Token, the JSON blob will have to be compacted first using a
+tool like jq and then used in the password field in drycc registry:set
. For the username, use
+_json_key
. For example:
drycc registry:set username=_json_key password="$(cat google_cloud_cred.json | jq -c .)"
+
When using a private registry the docker images are no longer pulled into the Drycc Internal Registry via
+the Drycc Workflow Controller but rather is managed by Kubernetes. This will increase security and overall speed,
+however the application port
information can no longer be discovered. Instead the application port
information can be set via
+drycc config:set PORT=80
prior to setting the registry information.
!!! note +Currently GCR.io and ECR in short lived auth token mode are not supported.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+4 minute read
+Drycc supports deploying applications via Dockerfiles. A Dockerfile automates the steps for crafting a [Container Image][]. +Dockerfiles are incredibly powerful but require some extra work to define your exact application runtime environment.
+For Dockerfile based application deploys via git push
, Drycc Workflow identifies users via SSH keys. SSH keys are pushed to the platform and must be unique to each user.
See this document for instructions on how to generate an SSH key.
+Run drycc keys:add
to upload your SSH key to Drycc Workflow.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
Read more about adding/removing SSH Keys here.
+If you do not have an existing application, you can clone an example application that demonstrates the Dockerfile workflow.
+$ git clone https://github.com/drycc/helloworld.git
+$ cd helloworld
+
+In order to deploy Dockerfile applications, they must conform to the following requirements:
+EXPOSE
directive to expose exactly one port.CMD
directive to define the default process that will run within the container.!!! note
+Note that if you are using a private registry of any kind (gcr
or other) the application environment must include a $PORT
config variable that matches the EXPOSE
’d port, example: drycc config:set PORT=5000
. See Configuring Registry for more info.
Use drycc create
to create an application on the Controller.
$ drycc create
+Creating application... done, created folksy-offshoot
+Git remote drycc added
+
+Use git push drycc master
to deploy your application.
$ git push drycc master
+Counting objects: 13, done.
+Delta compression using up to 8 threads.
+Compressing objects: 100% (13/13), done.
+Writing objects: 100% (13/13), 1.99 KiB | 0 bytes/s, done.
+Total 13 (delta 2), reused 0 (delta 0)
+-----> Building Docker image
+Uploading context 4.096 kB
+Uploading context
+Step 0 : FROM drycc/base:latest
+ ---> 60024338bc63
+Step 1 : RUN wget -O /tmp/go1.2.1.linux-amd64.tar.gz -q https://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> cf9ef8c5caa7
+Step 2 : RUN tar -C /usr/local -xzf /tmp/go1.2.1.linux-amd64.tar.gz
+ ---> Using cache
+ ---> 515b1faf3bd8
+Step 3 : RUN mkdir -p /go
+ ---> Using cache
+ ---> ebf4927a00e9
+Step 4 : ENV GOPATH /go
+ ---> Using cache
+ ---> c6a276eded37
+Step 5 : ENV PATH /usr/local/go/bin:/go/bin:$PATH
+ ---> Using cache
+ ---> 2ba6f6c9f108
+Step 6 : ADD . /go/src/github.com/drycc/helloworld
+ ---> 94ab7f4b977b
+Removing intermediate container 171b7d9fdb34
+Step 7 : RUN cd /go/src/github.com/drycc/helloworld && go install -v .
+ ---> Running in 0c8fbb2d2812
+github.com/drycc/helloworld
+ ---> 13b5af931393
+Removing intermediate container 0c8fbb2d2812
+Step 8 : ENV PORT 80
+ ---> Running in 9b07da36a272
+ ---> 2dce83167874
+Removing intermediate container 9b07da36a272
+Step 9 : CMD ["/go/bin/helloworld"]
+ ---> Running in f7b215199940
+ ---> b1e55ce5195a
+Removing intermediate container f7b215199940
+Step 10 : EXPOSE 80
+ ---> Running in 7eb8ec45dcb0
+ ---> ea1a8cc93ca3
+Removing intermediate container 7eb8ec45dcb0
+Successfully built ea1a8cc93ca3
+-----> Pushing image to private registry
+
+ Launching... done, v2
+
+-----> folksy-offshoot deployed to Drycc
+ http://folksy-offshoot.local3.dryccapp.com
+
+ To learn more, use `drycc help` or visit https://www.drycc.cc
+
+To ssh://git@local3.dryccapp.com:2222/folksy-offshoot.git
+ * [new branch] master -> master
+
+$ curl -s http://folksy-offshoot.local3.dryccapp.com
+Welcome to Drycc!
+See the documentation at http://docs.drycc.cc/ for more information.
+
+Because a Dockerfile application is detected, the web
process type is automatically scaled to 1 on first deploy.
Use drycc scale web=3
to increase web
processes to 3, for example. Scaling a
+process type directly changes the number of containers
+running that process.
As of Workflow v2.13.0, users can inject their application config into the Container image using +Container build arguments. To opt into this, users must add a new environment variable +to their application:
+$ drycc config:set DRYCC_DOCKER_BUILD_ARGS_ENABLED=1
+
Every environment variable set with drycc config:set
will then be available for use inside the
+user’s Dockerfile. For example, if a user runs drycc config:set POWERED_BY=Workflow
,
+the user can utilize that build argument in their Dockerfile:
ARG POWERED_BY
+RUN echo "Powered by $POWERED_BY" > /etc/motd
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+The Drycc stack is intended for advanced use cases only. Unless you have a specific need for custom Docker images, we recommend using Drycc’s default buildpack-powered build system. It offers automatic base image security updates and language-specific optimizations. It also avoids the need to maintain a .containerDockerfile
+A manifest has three top-level sections.
+Here’s an example that illustrates using a manifest to build Docker images.
+build:
+ docker:
+ web: Dockerfile
+ worker: worker/Dockerfile
+ config:
+ web:
+ FOO: bar
+ worker:
+ RAILS_ENV: development
+run:
+- command:
+ - ./deployment-tasks.sh
+ image: worker
+ # If the field is empty, it means it will be executed forever
+ when:
+ ptypes:
+ - web
+ - webbbsbs
+ # Maximum execution time
+ timeout: 100
+deploy:
+ web:
+ command:
+ - bash
+ - -ec
+ args:
+ - bundle exec puma -C config/puma.rb
+ worker:
+ command:
+ - bash
+ - -ec
+ args:
+ - python myworker.py
+ asset-syncer:
+ command:
+ - bash
+ - -ec
+ args:
+ - python asset-syncer.py
+ image: worker
+
For more deployment information, please refer to the drycc examples.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+Find a bug? Want to see a new feature? Have a request for the maintainers? Open a Github issue in the applicable repository and we’ll get the conversation started.
+Our official support channel is the Drycc #community Slack channel.
+Don’t know what the applicable repository for an issue is? Open up in issue in workflow or chat with a maintainer in the Drycc #community Slack channel and we’ll make sure it gets to the right place.
+Additionally, take a look at the troubleshooting documentation for common issues.
+Before opening a new issue, it’s helpful to search and see if anyone else has already reported the problem. You can search through a list of issues for all Drycc projects here.
+We are always looking to improve and expand our documentation. Most docs reside in the drycc/workflow repository. Simply fork the project, update docs and send us a pull request.
+We are always looking for help improving the core platform, other workloads, tooling, and test coverage. Interested in contributing code? Let’s chat in the Drycc #community Slack channel. Make sure to check out issues tagged easy fix or help wanted.
+When you’re ready to begin writing code, review Design Documents and get your Development Environment set up.
+By contributing to any Drycc project you agree to its Developer Certificate of Origin (DCO). This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.
+If you don’t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See Triaging Issues for more info.
+Interact with the community on our user mailing list or live in our Drycc #community Slack channel, where you can chat with other Drycc Workflow users any time of day.
+ +Before submitting a pull request which will significantly alter the behavior of any Drycc component, such as a new feature or major refactoring, contributors should first open an issue representing a design document.
+Design documents help ensure project contributors:
+Design document issues should be named Design Doc: <change description>
and contain the following sections:
This section should briefly describe the proposed change and the motivations behind it. Tests will be written to ensure this design goal is met by the change.
+This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.
+This section should detail the code changes necessary to accomplish the change, as well as the proposed implementation. This should be as detailed as necessary to help reviewers understand the change.
+All changes should be covered by automated tests, either unit or integration tests (ideally both). This section should detail how tests will be written to validate that the change accomplishes the design goals and doesn’t introduce any regressions.
+If a change cannot be sufficiently covered by automated testing, the design should be reconsidered. If there is no test coverage whatsoever for an affected section of code, a separate issue should be filed to integrate automated testing with that section of the codebase.
+The tests described here also form the acceptance criteria for the change, so that when it’s completed maintainers can merge the pull request after confirming the tests pass CI.
+A design document follows the same merge approval review process as final pull requests do, and maintainers will take extra care to ensure that any stakeholders for the change are included in the discussion and review of the design document.
+Once the design is accepted, the author can complete the change and submit a pull request for review. The pull request should close both the design document for the change as well as any issues that either track the issue or are closed as a result of the change.
+See Submitting a Pull Request for more information on pull request and commit message formatting.
+ +In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components.
+We try to make it simple to hack on Drycc components. However, there are necessarily several moving pieces and some setup required. We welcome any suggestions for automating or simplifying this process.
+!!! note +The Drycc team is actively engaged in containerizing Go and Python based development environments tailored specifically for Drycc development in order to minimize the setup required. This work is ongoing. Refer to the drycc/router project for a working example of a fully containerized development environment.
+If you’re just getting into the Drycc codebase, look for GitHub issues with the label easy-fix. These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc.
+In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:
+linux/amd64
For drycc/controller, in particular, you will also need:
+pip
)sudo pip install virtualenv
)In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below.
+If your local workstation does not support the linux/amd64
target environment, you will have to install Go from source with cross-compile support for that environment. This is because some of the components are built on your local machine and then injected into a container.
Homebrew users can just install with cross compiling support:
+$ brew install go --with-cc-common
+
It is also straightforward to build Go from source:
+$ sudo su
+$ curl -sSL https://golang.org/dl/go1.5.src.tar.gz | tar -v -C /usr/local -xz
+$ cd /usr/local/go/src
+$ # compile Go for our default platform first, then add cross-compile support
+$ ./make.bash --no-clean
+$ GOOS=linux GOARCH=amd64 ./make.bash --no-clean
+
Once you can compile to linux/amd64
, you should be able to compile Drycc components as normal.
Once the prerequisites have been met, we can begin to work with Drycc components.
+Begin at Github by forking whichever Drycc project you would like to contribute to, then clone that fork locally. Since Drycc is predominantly written in Go, the best place to put it is under $GOPATH/src/github.com/drycc/
.
$ mkdir -p $GOPATH/src/github.com/drycc
+$ cd $GOPATH/src/github.com/drycc
+$ git clone git@github.com:<username>/<component>.git
+$ cd <component>
+
!!! note
+By checking out the forked copy into the namespace github.com/drycc/<component>
, we are tricking the Go toolchain into seeing our fork as the “official” source tree.
If you are going to be issuing pull requests to the upstream repository from which you forked, we suggest configuring Git such that you can easily rebase your code to the upstream repository’s main branch. There are various strategies for doing this, but the most common is to add an upstream
remote:
$ git remote add upstream https://github.com/drycc/<component>.git
+
For the sake of simplicity, you may want to point an environment variable to your Drycc code - the directory containing one or more Drycc components:
+$ export DRYCC=$GOPATH/src/github.com/drycc
+
Throughout the rest of this document, $DRYCC
refers to that location.
A number of Drycc contributors prefer to pull directly from drycc/<component>
, but push to <username>/<component>
. If that workflow suits you better, you can set it up this way:
$ git clone git@github.com:drycc/<component>.git
+$ cd drycc
+$ git config remote.origin.pushurl git@github.com:<username>/<component>.git
+
In this setup, fetching and pulling code will work directly with the upstream repository, while pushing code will send changes to your fork. This makes it easy to stay up to date, but also make changes and then issue pull requests.
+With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.
+Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.
+Although writing and executing tests are critical to ensuring code quality, most contributors will also want to deploy their changes to a live environment, whether to make use of those changes or to test them further. The remainder of this section documents the procedure for running officially released Drycc components in a development cluster and replacing any one of those with your customizations.
+To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.
+To facilitate deploying Container images containing your changes to your Kubernetes cluster, you will need to make use of a Container registry. This is a location to where you can push your custom-built images and from where your Kubernetes cluster can retrieve those same images.
+If your development cluster runs locally (in Minikube, for instance), the most efficient and economical means of achieving this is to run a Container registry locally as a Container container.
+To facilitate this, most Drycc components provide a make target to create such a registry:
+$ make dev-registry
+
In a Linux environment, to begin using the registry:
+export DRYCC_REGISTRY=<IP of the host machine>:5000
+
In non-Linux environments:
+export DRYCC_REGISTRY=<IP of the drycc Container Machine VM>:5000
+
If your development cluster runs on a cloud provider such as Google Container Engine, a local registry such as the one above will not be accessible to your Kubernetes nodes. In such cases, a public registry such as [DockerHub][dh] or quay.io will suffice.
+To use DockerHub for this purpose, for instance:
+$ export DRYCC_REGISTRY="registry.drycc.cc"
+$ export IMAGE_PREFIX=<your DockerHub username>
+
To use quay.io:
+$ export DRYCC_REGISTRY=quay.io
+$ export IMAGE_PREFIX=<your quay.io username>
+
Note the importance of the trailing slash.
+With a functioning Kubernetes cluster and the officially released Drycc components installed onto it, deployment and further testing of any Drycc component you have made changes to is facilitated by replacing the officially released component with a custom built image that contains your changes. Most Drycc components include Makefiles with targets specifically intended to facilitate this workflow with minimal friction.
+In the general case, this workflow looks like this:
+git
make build
to build a new Container imagemake dev-release
to generate Kubernetes manifest(s)make deploy
to restart the component using the updated manifestThis can be shortened to a one-liner using just the deploy
target:
$ make deploy
+
Once your customized Drycc component has been deployed, here are some helpful commands that will allow you to inspect your cluster and to troubleshoot, if necessary:
+$ kubectl --namespace=drycc get pods
+
This is often useful for troubleshooting pods that are in pending or crashed states:
+$ kubectl --namespace=drycc describe -f <pod name>
+
$ kubectl --namespace=drycc logs -f <pod name>
+
Specific to drycc/controller
+$ kubectl --namespace=drycc exec -it <pod name> -- python manage.py shell
+
Have commands other Drycc contributors might find useful? Send us a PR!
+Satisfied with your changes? Share them!
+Please read Submitting a Pull Request. It contains a checklist of +things you should do when proposing a change to any Drycc component.
+ +Each Drycc component includes its own suite of style checks, unit tests, and black-box type functional tests.
+Integration tests verify the behavior of the Drycc components together as a system and are provided separately by the drycc/workflow-e2e project.
+GitHub pull requests for all Drycc components are tested automatically by the Travis CI continuous integration system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase.
+Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.
+The style checks, unit tests, and functional tests for each component can all be executed via make targets:
+To execute style checks:
+$ make test-style
+
To execute unit tests:
+$ make test-unit
+
To execute functional tests:
+$ make test-functional
+
To execute style checks, unit tests, and functional tests all in one shot:
+$ make test
+
To execute integration tests, refer to drycc/workflow-e2e documentation.
+ +Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.
+It’s hard to reach agreement on the merit of a PR when it isn’t focused. When fixing an issue or implementing a new feature, resist the temptation to refactor nearby code or to fix that potential bug you noticed. Instead, open a separate issue or pull request. Keeping concerns separated allows pull requests to be tested, reviewed, and merged more quickly.
+Squash and rebase the commit or commits in your pull request into logical units of work with git
. Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix.
Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as “closes #1234”. The issue referenced will automatically be closed when your PR is merged.
+If you significantly alter or add functionality to a component that impacts the broader Drycc Workflow PaaS, you should submit a complementary PR to modify or amend end-to-end integration tests. These integration tests can be found in the drycc/workflow-e2e repository.
+See testing for more information.
+Changes to any Drycc Workflow component that could affect a user’s experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component’s own documentation. In some cases where a component is tightly integrated into drycc/workflow, its documentation must also be updated.
+If a pull request is part of a larger piece of work involving one or more additional commits in other Workflow repositories, these commits can be referenced in the last PR to be submitted. The downstream e2e test job will then supply every referenced commit (derived from PR issue number supplied) to the test runner so it can source the necessary Container images for inclusion in the generated Workflow chart to be tested.
+For example, consider paired commits in drycc/controller and drycc/workflow-e2e. The commit body for the first PR in drycc/workflow-e2e
would look like:
feat(foo_test): add e2e test for feature foo
+
+[skip e2e] test for controller#42
+
Adding [skip e2e]
forgoes the e2e tests on this commit. This and any other required PRs aside from the final PR should be submitted first, so that their respective build and image push jobs run.
Lastly, the final PR in drycc/controller
should be created with the required PR number(s) listed, in the form of [Rr]equires <repoName>#<pullRequestNumber>
, for use by the downstream e2e run.
feat(foo): add feature foo
+
+Requires workflow-e2e#42
+
Drycc components are implemented in Go and Python. For both languages, we agree with The Zen of Python, which emphasizes simple over clever. Readability counts.
+Go code should always be run through gofmt
on the default settings. Lines of code may be up to 99 characters long. Documentation strings and tests are required for all exported functions. Use of third-party go packages should be minimal, but when doing so, such dependencies should be managed via the glide tool.
Python code should always adhere to PEP8, the python code style guide, with the exception that lines of code may be up to 99 characters long. Docstrings and tests are required for all public methods, although the flake8 tool used by Drycc does not enforce this.
+We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs +from AngularJS. This is an example of a commit:
+feat(scripts/test-cluster): add a cluster test command
+
+this uses tmux to setup a test cluster that you can easily kill and
+start for debugging.
+
To make it more formal, it looks something like this:
+{type}({scope}): {subject}
+<BLANK LINE>
+{body}
+<BLANK LINE>
+{footer}
+
The allowed {types}
are as follows:
feat
-> featurefix
-> bug fixdocs
-> documentationstyle
-> formattingref
-> refactoring codetest
-> adding missing testschore
-> maintenanceThe {scope}
can be anything specifying the location(s) of the commit change(s).
The {subject}
needs to be an imperative, present tense verb: “change”, not “changed” nor
+“changes”. The first letter should not be capitalized, and there is no dot (.) at the end.
Just like the {subject}
, the message {body}
needs to be in the present tense, and includes
+the motivation for the change, as well as a contrast with the previous behavior. The first
+letter in a paragraph must be capitalized.
All breaking changes need to be mentioned in the {footer}
with the description of the
+change, the justification behind the change and any migration notes required.
Any line of the commit message cannot be longer than 72 characters, with the subject line +limited to 50 characters. This allows the message to be easier to read on GitHub as well +as in various git tools.
+Any code change - other than a simple typo fix or one-line documentation change - requires at least two Drycc maintainers to accept it. Maintainers tag pull requests with “LGTM1” and “LGTM2” (Looks Good To Me) labels to indicate acceptance.
+No pull requests can be merged until at least one core maintainer signs off with an LGTM. The other LGTM can come from either a core maintainer or contributing maintainer.
+If the PR is from a Drycc maintainer, then he or she should be the one to close it. This keeps the commit stream clean and gives the maintainer the benefit of revisiting the PR before deciding whether or not to merge the changes.
+An exception to this is when an errant commit needs to be reverted urgently. If necessary, a PR that only reverts a previous commit can be merged without waiting for LGTM approval.
+ +Drycc software is fully open source. As such, the “Drycc community” consists of anyone who uses the Drycc software and participates in its evolution, whether by answering questions, finding bugs, suggesting enhancements, or writing documentation or code.
+Drycc development is coordinated through numerous project repositories on GitHub. Anyone can check out the source code for any Drycc component, fork it, make improvements, and create a pull request to offer those changes back to the Drycc community.
+Engine Yard maintains the numerous Drycc projects, and as such, decides what ends up in the official GitHub repositories. Drycc depends on the contributions of the community; the maintainers will not ignore pull requests or issues.
+Drycc uses the timeless, highly efficient, and totally unfair system known as “Benevolent Dictator for Life” (BDFL). Gabriel Monroy, the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc.
+Drycc projects are bounty-friendly. We believe open source bounty sites can be constructive tools in the development of open source software. Community members are encouraged to a) offer bounties and b) receive bounties for open source contributions that benefit everyone. The Drycc maintainers, however, will not accept bounties on this project but are more than happy to help community members attempting bounties.
+ +Triage helps ensure issues resolve quickly by:
+If you don’t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.
+Before triaging an issue very far, make sure that the issue’s author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that should be included in most issues are things such as:
+Depending on the issue, you might not feel all this information is needed. Use your best judgment. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem.
+If the author provides the recommended information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author’s time.
+If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided.
+An issue can have multiple of the following labels:
+Kind | +Description | +
---|---|
bug | +Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. | +
docs | +Writing documentation, man pages, articles, blogs, or other significant word-driven task. | +
enhancement | +Enhancements can drastically improve usability or performance of a component. | +
question | +Contains a user or contributor question requiring a response. | +
security | +Security-related issues such as TLS encryption, network segregation, authn/authz features, etc. | +
“Easy Fix” issues are a way for a new contributor to find issues that are fit for their experience level. These issues are typically for users who are new to Drycc, and possibly Go, and is looking to help while learning the basics.
+When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.
+Priority | +Description | +
---|---|
priority 0 | +Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release. | +
priority 1 | +Serious: Impedes user actions or is a regression. Fix this before the next planned release. | +
And that’s it. That should be all the information required for a new or existing contributor to come in an resolve an issue.
+ +The Drycc community welcomes and encourages participation by everyone.
+No matter how you identify yourself or how others perceive you: we welcome you. We welcome contributions from everyone as long as they interact constructively with our community.
+The Drycc developer community continues to grow, and it is inevitable that disagreements and conflict will arise. We ask that participants conduct themselves according to these principles:
+Be welcoming, friendly, and patient.
+Be considerate.
+Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we’re a world-wide community, so you might not be communicating in someone else’s primary language.
+Not all of us will agree all the time, but disagreement is no excuse for poor behavior and bad manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one.
+Be kind to others. Do not insult or put down other participants. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are never appropriate for the community.
+(Thanks to the Debian and Django communities for their text and +their inspiration.)
+ +(Unabashedly stolen from the Podman project)
+There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:
+Maintainers are often under-appreciated, because their work is harder to appreciate. +It’s easy to appreciate a really cool and technically advanced feature. It’s harder +to appreciate the absence of bugs, the slow but steady improvement in stability, +or the reliability of a release process. But those things distinguish a good +project from a great one.
+Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.
+Drycc follows the timeless, highly efficient and totally unfair system known as Benevolent dictator +for life.
+Gabriel Monroy (@gabrtv), as creator of the Drycc project, serves as our +project’s BDFL. While the day-to-day project management is carried out by the maintainers, Gabriel +serves as the final arbiter of any disputes and has the final say on project direction.
+Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc +full-time, although this is not a requirement.
+The duties of a core maintainer include:
+The current list of core maintainers can be seen here.
+No pull requests can be merged until at least one core maintainer signs off with an +LGTM. The other LGTM can +come from either a core maintainer or contributing maintainer.
+Contributing maintainers are exceptionally knowledgeable about some but not necessarily all areas +of Drycc, and are often selected due to specific domain knowledge that complements the project (but +a willingness to continually contribute to the project is most important!). Often, +core maintainers will ask a contributing maintainer to weigh in on issues, pull requests, or +conversations where the contributing maintainer is knowledgeable.
+The duties of a contributing maintainer are very similar to those of a core maintainer, but they are limited to areas of the Drycc project where the contributing maintainer is knowledgeable.
+Contributing maintainers are defined in practice as those who have write access to the Drycc repository. All maintainers can review pull requests and add LGTM labels as appropriate.
+The Drycc project wouldn’t be where it is today without its community. Many of the project’s +community members embody the spirit of maintainership, and have contributed substantially to +the project.
+The contributing maintainers group was created in part so that exceptional members of the community +who have an interest in the continued success of the project have the opportunity to join the +core maintainers in guiding the future of Drycc.
+Generally, potential contributing maintainers are selected by the Drycc core maintainers based in +part on the following criteria:
+The Drycc core maintainers must unanimously agree before inviting a community member to join as a +contributing maintainer, although in many cases the candidate has already been acting in the +capacity of a contributing maintainer for some time, and has been consulted on issues, pull requests, +etc.
+ +less than a minute
+Drycc software is fully open source. As such, the “Drycc community” consists of anyone who uses the Drycc software and participates in its evolution, whether by answering questions, finding bugs, suggesting enhancements, or writing documentation or code.
+Drycc development is coordinated through numerous project repositories on GitHub. Anyone can check out the source code for any Drycc component, fork it, make improvements, and create a pull request to offer those changes back to the Drycc community.
+Engine Yard maintains the numerous Drycc projects, and as such, decides what ends up in the official GitHub repositories. Drycc depends on the contributions of the community; the maintainers will not ignore pull requests or issues.
+Drycc uses the timeless, highly efficient, and totally unfair system known as “Benevolent Dictator for Life” (BDFL). Gabriel Monroy, the creator of Drycc, is our BDFL and has final say over all decisions related to Drycc.
+Drycc projects are bounty-friendly. We believe open source bounty sites can be constructive tools in the development of open source software. Community members are encouraged to a) offer bounties and b) receive bounties for open source contributions that benefit everyone. The Drycc maintainers, however, will not accept bounties on this project but are more than happy to help community members attempting bounties.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+The Drycc community welcomes and encourages participation by everyone.
+No matter how you identify yourself or how others perceive you: we welcome you. We welcome contributions from everyone as long as they interact constructively with our community.
+The Drycc developer community continues to grow, and it is inevitable that disagreements and conflict will arise. We ask that participants conduct themselves according to these principles:
+Be welcoming, friendly, and patient.
+Be considerate.
+Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we’re a world-wide community, so you might not be communicating in someone else’s primary language.
+Not all of us will agree all the time, but disagreement is no excuse for poor behavior and bad manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one.
+Be kind to others. Do not insult or put down other participants. Behave professionally. Remember that harassment and sexist, racist, or exclusionary jokes are never appropriate for the community.
+(Thanks to the Debian and Django communities for their text and +their inspiration.)
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+Before submitting a pull request which will significantly alter the behavior of any Drycc component, such as a new feature or major refactoring, contributors should first open an issue representing a design document.
+Design documents help ensure project contributors:
+Design document issues should be named Design Doc: <change description>
and contain the following sections:
This section should briefly describe the proposed change and the motivations behind it. Tests will be written to ensure this design goal is met by the change.
+This section should also reference a separate GitHub issue tracking the feature or change, which will typically be assigned to a release milestone.
+This section should detail the code changes necessary to accomplish the change, as well as the proposed implementation. This should be as detailed as necessary to help reviewers understand the change.
+All changes should be covered by automated tests, either unit or integration tests (ideally both). This section should detail how tests will be written to validate that the change accomplishes the design goals and doesn’t introduce any regressions.
+If a change cannot be sufficiently covered by automated testing, the design should be reconsidered. If there is no test coverage whatsoever for an affected section of code, a separate issue should be filed to integrate automated testing with that section of the codebase.
+The tests described here also form the acceptance criteria for the change, so that when it’s completed maintainers can merge the pull request after confirming the tests pass CI.
+A design document follows the same merge approval review process as final pull requests do, and maintainers will take extra care to ensure that any stakeholders for the change are included in the discussion and review of the design document.
+Once the design is accepted, the author can complete the change and submit a pull request for review. The pull request should close both the design document for the change as well as any issues that either track the issue or are closed as a result of the change.
+See Submitting a Pull Request for more information on pull request and commit message formatting.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+6 minute read
+In this guide, we walk you through the process of setting up a development environment that is suitable for hacking on most Drycc components.
+We try to make it simple to hack on Drycc components. However, there are necessarily several moving pieces and some setup required. We welcome any suggestions for automating or simplifying this process.
+!!! note +The Drycc team is actively engaged in containerizing Go and Python based development environments tailored specifically for Drycc development in order to minimize the setup required. This work is ongoing. Refer to the drycc/router project for a working example of a fully containerized development environment.
+If you’re just getting into the Drycc codebase, look for GitHub issues with the label easy-fix. These are more straightforward or low-risk issues and are a great way to become more familiar with Drycc.
+In order to successfully compile and test Drycc binaries and build Container images of Drycc components, the following are required:
+linux/amd64
For drycc/controller, in particular, you will also need:
+pip
)sudo pip install virtualenv
)In most cases, you should simply install according to the instructions. There are a few special cases, though. We cover these below.
+If your local workstation does not support the linux/amd64
target environment, you will have to install Go from source with cross-compile support for that environment. This is because some of the components are built on your local machine and then injected into a container.
Homebrew users can just install with cross compiling support:
+$ brew install go --with-cc-common
+
It is also straightforward to build Go from source:
+$ sudo su
+$ curl -sSL https://golang.org/dl/go1.5.src.tar.gz | tar -v -C /usr/local -xz
+$ cd /usr/local/go/src
+$ # compile Go for our default platform first, then add cross-compile support
+$ ./make.bash --no-clean
+$ GOOS=linux GOARCH=amd64 ./make.bash --no-clean
+
Once you can compile to linux/amd64
, you should be able to compile Drycc components as normal.
Once the prerequisites have been met, we can begin to work with Drycc components.
+Begin at Github by forking whichever Drycc project you would like to contribute to, then clone that fork locally. Since Drycc is predominantly written in Go, the best place to put it is under $GOPATH/src/github.com/drycc/
.
$ mkdir -p $GOPATH/src/github.com/drycc
+$ cd $GOPATH/src/github.com/drycc
+$ git clone git@github.com:<username>/<component>.git
+$ cd <component>
+
!!! note
+By checking out the forked copy into the namespace github.com/drycc/<component>
, we are tricking the Go toolchain into seeing our fork as the “official” source tree.
If you are going to be issuing pull requests to the upstream repository from which you forked, we suggest configuring Git such that you can easily rebase your code to the upstream repository’s main branch. There are various strategies for doing this, but the most common is to add an upstream
remote:
$ git remote add upstream https://github.com/drycc/<component>.git
+
For the sake of simplicity, you may want to point an environment variable to your Drycc code - the directory containing one or more Drycc components:
+$ export DRYCC=$GOPATH/src/github.com/drycc
+
Throughout the rest of this document, $DRYCC
refers to that location.
A number of Drycc contributors prefer to pull directly from drycc/<component>
, but push to <username>/<component>
. If that workflow suits you better, you can set it up this way:
$ git clone git@github.com:drycc/<component>.git
+$ cd drycc
+$ git config remote.origin.pushurl git@github.com:<username>/<component>.git
+
In this setup, fetching and pulling code will work directly with the upstream repository, while pushing code will send changes to your fork. This makes it easy to stay up to date, but also make changes and then issue pull requests.
+With your development environment set up and the code you wish to work on forked and cloned, you can begin making your changes.
+Drycc components each include a comprehensive suite of automated tests, mostly written in Go. See testing for instructions on running the tests.
+Although writing and executing tests are critical to ensuring code quality, most contributors will also want to deploy their changes to a live environment, whether to make use of those changes or to test them further. The remainder of this section documents the procedure for running officially released Drycc components in a development cluster and replacing any one of those with your customizations.
+To run a Kubernetes cluster locally or elsewhere to support your development activities, refer to Drycc installation instructions here.
+To facilitate deploying Container images containing your changes to your Kubernetes cluster, you will need to make use of a Container registry. This is a location to where you can push your custom-built images and from where your Kubernetes cluster can retrieve those same images.
+If your development cluster runs locally (in Minikube, for instance), the most efficient and economical means of achieving this is to run a Container registry locally as a Container container.
+To facilitate this, most Drycc components provide a make target to create such a registry:
+$ make dev-registry
+
In a Linux environment, to begin using the registry:
+export DRYCC_REGISTRY=<IP of the host machine>:5000
+
In non-Linux environments:
+export DRYCC_REGISTRY=<IP of the drycc Container Machine VM>:5000
+
If your development cluster runs on a cloud provider such as Google Container Engine, a local registry such as the one above will not be accessible to your Kubernetes nodes. In such cases, a public registry such as [DockerHub][dh] or quay.io will suffice.
+To use DockerHub for this purpose, for instance:
+$ export DRYCC_REGISTRY="registry.drycc.cc"
+$ export IMAGE_PREFIX=<your DockerHub username>
+
To use quay.io:
+$ export DRYCC_REGISTRY=quay.io
+$ export IMAGE_PREFIX=<your quay.io username>
+
Note the importance of the trailing slash.
+With a functioning Kubernetes cluster and the officially released Drycc components installed onto it, deployment and further testing of any Drycc component you have made changes to is facilitated by replacing the officially released component with a custom built image that contains your changes. Most Drycc components include Makefiles with targets specifically intended to facilitate this workflow with minimal friction.
+In the general case, this workflow looks like this:
+git
make build
to build a new Container imagemake dev-release
to generate Kubernetes manifest(s)make deploy
to restart the component using the updated manifestThis can be shortened to a one-liner using just the deploy
target:
$ make deploy
+
Once your customized Drycc component has been deployed, here are some helpful commands that will allow you to inspect your cluster and to troubleshoot, if necessary:
+$ kubectl --namespace=drycc get pods
+
This is often useful for troubleshooting pods that are in pending or crashed states:
+$ kubectl --namespace=drycc describe -f <pod name>
+
$ kubectl --namespace=drycc logs -f <pod name>
+
Specific to drycc/controller
+$ kubectl --namespace=drycc exec -it <pod name> -- python manage.py shell
+
Have commands other Drycc contributors might find useful? Send us a PR!
+Satisfied with your changes? Share them!
+Please read Submitting a Pull Request. It contains a checklist of +things you should do when proposing a change to any Drycc component.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Interested in contributing to a Drycc project? There are lots of ways to help.
+Before submitting a pull request which will significantly alter the behavior of any Drycc component.
+This document is for developers who are interested in working directly on the Drycc codebase.
+Each Drycc component is one among an ecosystem of such components - many of which integrate with one another - which makes testing each component thoroughly a matter of paramount importance.
+Proposed changes to Drycc projects are made as GitHub pull requests.
+Drycc is an open source project that anyone in the community can use, improve, and enjoy. We’d love you to join us! Here’s a few ways to find out what’s happening and get involved.
+Issue triage provides an important way to contribute to an open source project.
+The Drycc community welcomes and encourages participation by everyone.
+This document serves to describe the leadership structure of the Drycc project, and list the current project maintainers.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+3 minute read
+(Unabashedly stolen from the Podman project)
+There are different types of maintainers, with different responsibilities, but +all maintainers have 3 things in common:
+Maintainers are often under-appreciated, because their work is harder to appreciate. +It’s easy to appreciate a really cool and technically advanced feature. It’s harder +to appreciate the absence of bugs, the slow but steady improvement in stability, +or the reliability of a release process. But those things distinguish a good +project from a great one.
+Drycc has two groups of maintainers in addition to our beloved Benevolent Dictator for Life.
+Drycc follows the timeless, highly efficient and totally unfair system known as Benevolent dictator +for life.
+Gabriel Monroy (@gabrtv), as creator of the Drycc project, serves as our +project’s BDFL. While the day-to-day project management is carried out by the maintainers, Gabriel +serves as the final arbiter of any disputes and has the final say on project direction.
+Core maintainers are exceptionally knowledgeable about all areas of Drycc. Some maintainers work on Drycc +full-time, although this is not a requirement.
+The duties of a core maintainer include:
+The current list of core maintainers can be seen here.
+No pull requests can be merged until at least one core maintainer signs off with an +LGTM. The other LGTM can +come from either a core maintainer or contributing maintainer.
+Contributing maintainers are exceptionally knowledgeable about some but not necessarily all areas +of Drycc, and are often selected due to specific domain knowledge that complements the project (but +a willingness to continually contribute to the project is most important!). Often, +core maintainers will ask a contributing maintainer to weigh in on issues, pull requests, or +conversations where the contributing maintainer is knowledgeable.
+The duties of a contributing maintainer are very similar to those of a core maintainer, but they are limited to areas of the Drycc project where the contributing maintainer is knowledgeable.
+Contributing maintainers are defined in practice as those who have write access to the Drycc repository. All maintainers can review pull requests and add LGTM labels as appropriate.
+The Drycc project wouldn’t be where it is today without its community. Many of the project’s +community members embody the spirit of maintainership, and have contributed substantially to +the project.
+The contributing maintainers group was created in part so that exceptional members of the community +who have an interest in the continued success of the project have the opportunity to join the +core maintainers in guiding the future of Drycc.
+Generally, potential contributing maintainers are selected by the Drycc core maintainers based in +part on the following criteria:
+The Drycc core maintainers must unanimously agree before inviting a community member to join as a +contributing maintainer, although in many cases the candidate has already been acting in the +capacity of a contributing maintainer for some time, and has been consulted on issues, pull requests, +etc.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+Find a bug? Want to see a new feature? Have a request for the maintainers? Open a Github issue in the applicable repository and we’ll get the conversation started.
+Our official support channel is the Drycc #community Slack channel.
+Don’t know what the applicable repository for an issue is? Open up in issue in workflow or chat with a maintainer in the Drycc #community Slack channel and we’ll make sure it gets to the right place.
+Additionally, take a look at the troubleshooting documentation for common issues.
+Before opening a new issue, it’s helpful to search and see if anyone else has already reported the problem. You can search through a list of issues for all Drycc projects here.
+We are always looking to improve and expand our documentation. Most docs reside in the drycc/workflow repository. Simply fork the project, update docs and send us a pull request.
+We are always looking for help improving the core platform, other workloads, tooling, and test coverage. Interested in contributing code? Let’s chat in the Drycc #community Slack channel. Make sure to check out issues tagged easy fix or help wanted.
+When you’re ready to begin writing code, review Design Documents and get your Development Environment set up.
+By contributing to any Drycc project you agree to its Developer Certificate of Origin (DCO). This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.
+If you don’t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours. See Triaging Issues for more info.
+Interact with the community on our user mailing list or live in our Drycc #community Slack channel, where you can chat with other Drycc Workflow users any time of day.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+5 minute read
+Before opening a pull request, ensure your change also references a design document if the contribution is substantial. For more information, see Design Documents.
+It’s hard to reach agreement on the merit of a PR when it isn’t focused. When fixing an issue or implementing a new feature, resist the temptation to refactor nearby code or to fix that potential bug you noticed. Instead, open a separate issue or pull request. Keeping concerns separated allows pull requests to be tested, reviewed, and merged more quickly.
+Squash and rebase the commit or commits in your pull request into logical units of work with git
. Include tests and documentation changes in the same commit, so that a revert would remove all traces of the feature or fix.
Most pull requests will reference a GitHub issue. In the PR description - not in the commit itself - include a line such as “closes #1234”. The issue referenced will automatically be closed when your PR is merged.
+If you significantly alter or add functionality to a component that impacts the broader Drycc Workflow PaaS, you should submit a complementary PR to modify or amend end-to-end integration tests. These integration tests can be found in the drycc/workflow-e2e repository.
+See testing for more information.
+Changes to any Drycc Workflow component that could affect a user’s experience also require a change or addition to the relevant documentation. For most Drycc components, this involves updating the component’s own documentation. In some cases where a component is tightly integrated into drycc/workflow, its documentation must also be updated.
+If a pull request is part of a larger piece of work involving one or more additional commits in other Workflow repositories, these commits can be referenced in the last PR to be submitted. The downstream e2e test job will then supply every referenced commit (derived from PR issue number supplied) to the test runner so it can source the necessary Container images for inclusion in the generated Workflow chart to be tested.
+For example, consider paired commits in drycc/controller and drycc/workflow-e2e. The commit body for the first PR in drycc/workflow-e2e
would look like:
feat(foo_test): add e2e test for feature foo
+
+[skip e2e] test for controller#42
+
Adding [skip e2e]
forgoes the e2e tests on this commit. This and any other required PRs aside from the final PR should be submitted first, so that their respective build and image push jobs run.
Lastly, the final PR in drycc/controller
should be created with the required PR number(s) listed, in the form of [Rr]equires <repoName>#<pullRequestNumber>
, for use by the downstream e2e run.
feat(foo): add feature foo
+
+Requires workflow-e2e#42
+
Drycc components are implemented in Go and Python. For both languages, we agree with The Zen of Python, which emphasizes simple over clever. Readability counts.
+Go code should always be run through gofmt
on the default settings. Lines of code may be up to 99 characters long. Documentation strings and tests are required for all exported functions. Use of third-party go packages should be minimal, but when doing so, such dependencies should be managed via the glide tool.
Python code should always adhere to PEP8, the python code style guide, with the exception that lines of code may be up to 99 characters long. Docstrings and tests are required for all public methods, although the flake8 tool used by Drycc does not enforce this.
+We follow a convention for commit messages borrowed from CoreOS, who borrowed theirs +from AngularJS. This is an example of a commit:
+feat(scripts/test-cluster): add a cluster test command
+
+this uses tmux to setup a test cluster that you can easily kill and
+start for debugging.
+
To make it more formal, it looks something like this:
+{type}({scope}): {subject}
+<BLANK LINE>
+{body}
+<BLANK LINE>
+{footer}
+
The allowed {types}
are as follows:
feat
-> featurefix
-> bug fixdocs
-> documentationstyle
-> formattingref
-> refactoring codetest
-> adding missing testschore
-> maintenanceThe {scope}
can be anything specifying the location(s) of the commit change(s).
The {subject}
needs to be an imperative, present tense verb: “change”, not “changed” nor
+“changes”. The first letter should not be capitalized, and there is no dot (.) at the end.
Just like the {subject}
, the message {body}
needs to be in the present tense, and includes
+the motivation for the change, as well as a contrast with the previous behavior. The first
+letter in a paragraph must be capitalized.
All breaking changes need to be mentioned in the {footer}
with the description of the
+change, the justification behind the change and any migration notes required.
Any line of the commit message cannot be longer than 72 characters, with the subject line +limited to 50 characters. This allows the message to be easier to read on GitHub as well +as in various git tools.
+Any code change - other than a simple typo fix or one-line documentation change - requires at least two Drycc maintainers to accept it. Maintainers tag pull requests with “LGTM1” and “LGTM2” (Looks Good To Me) labels to indicate acceptance.
+No pull requests can be merged until at least one core maintainer signs off with an LGTM. The other LGTM can come from either a core maintainer or contributing maintainer.
+If the PR is from a Drycc maintainer, then he or she should be the one to close it. This keeps the commit stream clean and gives the maintainer the benefit of revisiting the PR before deciding whether or not to merge the changes.
+An exception to this is when an errant commit needs to be reverted urgently. If necessary, a PR that only reverts a previous commit can be merged without waiting for LGTM approval.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Each Drycc component includes its own suite of style checks, unit tests, and black-box type functional tests.
+Integration tests verify the behavior of the Drycc components together as a system and are provided separately by the drycc/workflow-e2e project.
+GitHub pull requests for all Drycc components are tested automatically by the Travis CI continuous integration system. Contributors should run the same tests locally before proposing any changes to the Drycc codebase.
+Successfully executing the unit and functional tests for any Drycc component requires that the Development Environment is set up first.
+The style checks, unit tests, and functional tests for each component can all be executed via make targets:
+To execute style checks:
+$ make test-style
+
To execute unit tests:
+$ make test-unit
+
To execute functional tests:
+$ make test-functional
+
To execute style checks, unit tests, and functional tests all in one shot:
+$ make test
+
To execute integration tests, refer to drycc/workflow-e2e documentation.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+3 minute read
+Triage helps ensure issues resolve quickly by:
+If you don’t have time to code, consider helping with triage. The community will thank you for saving them time by spending some of yours.
+Before triaging an issue very far, make sure that the issue’s author provided the standard issue information. This will help you make an educated recommendation on how this to categorize the issue. Standard information that should be included in most issues are things such as:
+Depending on the issue, you might not feel all this information is needed. Use your best judgment. If you cannot triage an issue using what its author provided, explain kindly to the author that they must provide the above information to clarify the problem.
+If the author provides the recommended information but you are still unable to triage the issue, request additional information. Do this kindly and politely because you are asking for more of the author’s time.
+If the author does not respond requested information within the timespan of a week, close the issue with a kind note stating that the author can request for the issue to be reopened when the necessary information is provided.
+An issue can have multiple of the following labels:
+Kind | +Description | +
---|---|
bug | +Bugs are bugs. The cause may or may not be known at triage time so debugging should be taken account into the time estimate. | +
docs | +Writing documentation, man pages, articles, blogs, or other significant word-driven task. | +
enhancement | +Enhancements can drastically improve usability or performance of a component. | +
question | +Contains a user or contributor question requiring a response. | +
security | +Security-related issues such as TLS encryption, network segregation, authn/authz features, etc. | +
“Easy Fix” issues are a way for a new contributor to find issues that are fit for their experience level. These issues are typically for users who are new to Drycc, and possibly Go, and is looking to help while learning the basics.
+When attached to a specific milestone, an issue can be attributed one of the following labels to indicate their degree of priority.
+Priority | +Description | +
---|---|
priority 0 | +Urgent: Security, critical bugs, blocking issues. Drop everything and fix this today, then consider creating a patch release. | +
priority 1 | +Serious: Impedes user actions or is a regression. Fix this before the next planned release. | +
And that’s it. That should be all the information required for a new or existing contributor to come in an resolve an issue.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+A Open, Unified, Lightweight, Simpler Containers as a Service (CaaS).
+ +Drycc Workflow is an open source container cloud platform.
+Usually we also call it Container as a Service(CaaS) that adds a developer-friendly layer +to any Kubernetes cluster, making it easy to deploy and manage applications.
+Drycc Workflow includes capabilities for building and deploying from source via git push
, simple
+application configuration, creating and rolling back releases, managing domain names and SSL
+certificates, providing seamless edge routing, aggregating logs, and sharing applications with
+teams. All of this is exposed through a simple REST API and command line interface.
To get started with Workflow, follow our Quick Start guide.
+Take a deep dive into Drycc Workflow in our Concepts, Architecture, and +Components sections.
+Feel like contibuting some code or want to get started as a maintainer? Pick an issue tagged as an +easy fix or help wanted and start contributing!
+ +Step-by-step guides for deploying your first app and mastering the basics of Drycc.
+Understanding the architecture design of workflow.
+Deploying Drycc on a Kubernetes Cluster.
+In this tutorial, you’ll learn how to manage users.
+A simple and scalable cloud platform for all developer needs.
+Managing Workflow using the kubectl.
+Troubleshooting is systematic approach to problem-solving.
+Browse the ever-growing list of up-to-date, community driven roadmaps.
+This HowTo is for project maintainers who need a Contributing Guide for their project.
+Reference gxwuide definition and meaning.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+Drycc Workflow requires Kubernetes v1.16.15 or later.
+Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using istio or kong.
+Workflow supports the use of ACME to manage automatic certificates, cert-manager is also one of the necessary components, if you use cert-manager EAB, you need to set the clusterResourceNamespace
to the namespace of drycc.
Workflow supports stateful apps. You can create and use them through the ‘drycc volumes’ command. If you want to use this feature, you must have a StorageClass
that supports ReadWriteMany
.
Workflow also supports the OSB API through the ‘drycc resources’ command. If you want to use this function, you need to install service-catalog.
+A variety of Drycc Workflow components rely on an object storage system to do their work, including storing application +slugs, Container images and database logs.
+Drycc Workflow ships with drycc storage by default, which provides in-cluster.
+Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob +Storage. See configuring object storage for setup instructions.
+When deploying Drycc Workflow, it’s important to provision machines with adequate resources. Drycc is a highly-available +distributed system, which means that Drycc components and your deployed applications will move around the cluster onto +healthy hosts as hosts leave the cluster for various reasons (failures, reboots, autoscalers, etc.). Because of this, +you should have ample spare resources on any machine in your cluster to withstand the additional load of running +services for failed machines.
+Drycc Workflow components use about 2.5GB of memory across the cluster, and require approximately 30GB of hard disk +space. Because it may need to handle additional load if another one fails, each machine has minimum requirements of:
+Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your +application footprint as well.
+Running smaller machines will likely result in increased system load and has been known to result in component failures +and instability.
+ +Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running:
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.gatewayClass=istio \
+ --set global.platformDomain=drycc.cc \
+ --set builder.service.type=LoadBalancer
+
Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort:
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.gatewayClass=istio \
+ --set global.platformDomain=drycc.cc \
+ --set builder.service.type=NodePort \
+ --set builder.service.nodePort=32222
+
If you want to use Load Balancer on a bare machine, you can look at metallb
+Where global.platformDomain
is a required parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using drycc.cc
for $hostname
.
Helm will install a variety of Kubernetes resources in the drycc
namespace.
+Wait for the pods that Helm launched to be ready. Monitor their status by running:
$ kubectl --namespace=drycc get pods
+
You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running:
+$ kubectl get gatewayclass --namespace drycc
+
Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component’s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.
+Here, it can be seen that the controller, builder and registry all took a few loops waiting for storage before they were able to start:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-hy3xv 1/1 Running 5 5m
+drycc-controller-g3cu8 1/1 Running 5 5m
+drycc-controller-celery-cmxxn 3/3 Running 0 5m
+drycc-database-rad1o 1/1 Running 0 5m
+drycc-logger-fluentbit-1v8uk 1/1 Running 0 5m
+drycc-logger-fluentbit-esm60 1/1 Running 0 5m
+drycc-logger-sm8b3 1/1 Running 0 5m
+drycc-storage-4ww3t 1/1 Running 0 5m
+drycc-registry-asozo 1/1 Running 1 5m
+drycc-rabbitmq-0 1/1 Running 0 5m
+
Now that Workflow has been deployed with the global.gatewayClass
, we will need a Kubernetes gateway in place to begin routing traffic.
Here is an example of how to use istio as an gateway for Workflow. Of course, you are welcome to use any controller you wish.
+$ helm repo add istio https://istio-release.storage.googleapis.com/charts
+$ helm repo update
+$ kubectl create namespace istio-system
+$ helm install istio-base istio/base -n istio-system
+$ helm install istiod istio/istiod -n istio-system --wait
+$ kubectl create namespace istio-ingress
+$ helm install istio-ingress istio/gateway -n istio-ingress --wait
+
User must install drycc and then set up a hostname, and assumes the *.$host
convention.
We need to point the *.$host
record to the public IP address of your gateway. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.
$ kubectl get gateway --namespace drycc
+NAME CLASS ADDRESS PROGRAMMED AGE
+gateway istio 138.91.243.152 True 36d
+
If we were using drycc.cc
as a hostname, we would need to create the following A DNS records.
Name | +Type | +Value | +
---|---|---|
*.drycc.cc | +A | +138.91.243.152 | +
Once all of the pods are in the READY
state, and *.$host
resolves to the external IP found above, the preparation of gateway has been completed!
After installing Workflow, register a user and deploy an application.
+If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can
+access both internal and external networks, and then expose 80
and 443
.
If help is required getting started with Kubernetes and +Drycc Workflow, follow the quickstart guide for assistance.
+Check that the helm
command is available and the version is v2.5.0 or newer.
$ helm version
+Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+
Drycc Workflow includes everything it needs to run out of the box. However, these defaults are aimed at simplicity rather than +production readiness. Production and staging deployments of Workflow should, at a minimum, use off-cluster storage +which is used by Workflow components to store and backup critical data. Should an operator need to completely re-install +Workflow, the required components can recover from off-cluster storage. See the documentation for configuring object +storage for more details.
+More rigorous installations would benefit from using outside sources for the following things:
+Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.
+If the version of helm is 3.0 +; you need to create the namespace in advance:
+kubectl create ns drycc
+
If you want to change it, set the variable when using helm.
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set builder.imageRegistry=quay.io \
+ --set imagebuilder.imageRegistry=quay.io \
+ --set controller.imageRegistry=quay.io \
+ --set database.imageRegistry=quay.io \
+ --set fluentbit.imageRegistry=quay.io \
+ --set redis.imageRegistry=quay.io \
+ --set rabbitmq.imageRegistry=quay.io \
+ --set logger.imageRegistry=quay.io \
+ --set storage.imageRegistry=quay.io \
+ --set monitor.imageRegistry=quay.io \
+ --set registry.imageRegistry=quay.io \
+ --set registry-proxy.imageRegistry=quay.io \
+ --set global.platformDomain=drycc.cc
+
Helm will install a variety of Kubernetes resources in the drycc
namespace.
+Wait for the pods that Helm launched to be ready. Monitor their status by running:
$ kubectl --namespace=drycc get pods
+
If it’s preferred to have kubectl
automatically update as the pod states change, run (type Ctrl-C to stop the watch):
$ kubectl --namespace=drycc get pods -w
+
Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component’s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.
+Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-574483744-l15zj 1/1 Running 0 4m
+drycc-controller-3953262871-pncgq 1/1 Running 2 4m
+drycc-controller-celery-cmxxn 3/3 Running 0 4m
+drycc-database-83844344-47ld6 1/1 Running 0 4m
+drycc-logger-176328999-wjckx 1/1 Running 4 4m
+drycc-logger-fluentbit-zxnqb 1/1 Running 0 4m
+drycc-redis-304849759-1f35p 1/1 Running 0 4m
+drycc-storage-676004970-nxqgt 1/1 Running 0 4m
+drycc-monitor-grafana-432627134-lnl2h 1/1 Running 0 4m
+drycc-monitor-telegraf-wmcmn 1/1 Running 1 4m
+drycc-registry-756475849-lwc6b 1/1 Running 1 4m
+drycc-registry-proxy-96c4p 1/1 Running 0 4m
+drycc-rabbitmq-0 1/1 Running 0 4m
+
Once all of the pods are in the READY
state, Drycc Workflow is up and running!
For more installation parameters, please check the values.yaml file of workflow.
+After installing Workflow, register a user and deploy an application.
+User must to set up a hostname, and assumes the drycc-builder.$host
convention.
We need to point the drycc-builder.$host
record to the public IP address of your builder. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.
$ kubectl get svc drycc-builder --namespace drycc
+NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+drycc-builder 10.0.25.3 138.91.243.152 2222:31625/TCP 33m
+
If we were using drycc.cc
as a hostname, we would need to create the following A DNS records.
Name | +Type | +Value | +
---|---|---|
drycc-builder.drycc.cc | +A | +138.91.243.152 | +
Once all of the pods are in the READY
state, and drycc-builder.$host
resolves to the external IP found above, Workflow is up and running!
After installing Workflow, register a user and deploy an application.
+If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can
+access both internal and external networks, and then expose 80
and 443
.
Drycc Workflow ships with Storage by default, which provides in-cluster.
+Every component that relies on object storage uses two inputs for configuration:
+storage-creds
The helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster object storage. Drycc Workflow currently supports Google Compute Storage, Amazon S3, Azure Blob Storage and OpenStack Swift Storage.
+Create storage buckets for each of the Workflow subsystems: builder
, registry
, and database
.
Depending on your chosen object storage you may need to provide globally unique bucket names. If you are using S3, use hyphens instead of periods in the bucket names. Using periods in the bucket name will cause an ssl certificate validation issue with S3.
+If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.
+If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.
+If you are using AWS S3 and your Kubernetes nodes are configured with appropriate IAM API keys via InstanceRoles, you do not need to create API credentials. Do, however, validate that the InstanceRole has appropriate permissions to the configured buckets!
+Operators should configure object storage by editing the Helm values file before running helm install
. To do so:
helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml
global/storage
parameter to reference the platform you are using, e.g. s3
, azure
, gcs
, or swift
!!! note
+All values will be automatically (base64) encoded except the key_json
values under gcs
/gcr
. These must be base64-encoded. This is to support cleanly passing said encoded text via helm --set
cli functionality rather than attempting to pass the raw JSON data. For example:
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.platformDomain=youdomain.com
+ --set global.storage=gcs,gcs.key_json="$(cat /path/to/gcs_creds.json | base64 -w 0)"
+
+You are now ready to run helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
using your desired object storage.
By default, Drycc Workflow ships with the database component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster object storage. Currently, for object storage, which is utilized by several Workflow components, only off-cluster solutions such as S3 or GCS are recommended in production environments. Experience has shown that many operators already opting for off-cluster object storage similarly prefer to host Postgres off-cluster as well, using Amazon RDS or similar. When excercising both options, a Workflow installation becomes entirely stateless, and is thus restored or rebuilt with greater ease should the need ever arise.
+First, provision a PostgreSQL RDBMS using the cloud provider or other infrastructure of your choice. Take care to ensure that security groups or other firewall rules will permit connectivity from your Kubernetes worker nodes, any of which may play host to the Workflow controller component.
+Take note of the following:
+Within the off-cluster RDBMS, manually provision the following:
+If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will typically look like this:
+$ psql -h <host> -p <port> -d postgres -U <"postgres" or your own username>
+> create user <drycc username; typically "drycc"> with password '<password>';
+> create database <database name; typically "drycc"> with owner <drycc username>;
+> \q
+
The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.
+helm inspect values drycc/workflow > values.yaml
values.yaml
:
+databaseLocation
parameter to off-cluster
.[database]
configuration section to properly reflect all connection details.[controller]
configuration section to properly reflect platformDomain details.You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
as usual.
Drycc Workflow ships with a registry component by default, which provides an in-cluster Container registry backed by the platform-configured object storage. Operators might want to use an off-cluster registry for performance or security reasons.
+Every component that relies on a registry uses two inputs for configuration:
+DRYCC_REGISTRY_LOCATION
registry-secret
The Helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster registry. Drycc Workflow supports external registries which provide either short-lived tokens that are valid only for a specified amount of time or long-lived tokens (basic username/password) which are valid forever for authenticating to them. For those registries which provide short lived tokens for authentication, Drycc Workflow will generate and refresh them such that the deployed apps will only have access to the short-lived tokens and not to the actual credentials for the registries.
+When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by Kubernetes. This will increase security and overall speed, however the port
information can no longer be discovered. Instead the port
information can be set via drycc config:set PORT=<port>
prior to deploying the application.
Drycc Workflow currently supports:
+helm inspect values drycc/workflow > values.yaml
registryLocation
parameter to reference the registry location you are using: off-cluster
, ecr
, gcr
+* Update the values in the section which corresponds to your registry location type.You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
using your desired registry.
Here we show how the relevant parts of the fetched values.yaml
file might look like after configuring for a particular off-cluster registry:
After following the docs and creating a registry, e.g. myregistry
, with its corresponding login server of myregistry.azurecr.io
, the following values should be supplied:
global:
+...
+ registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+ registry:
+ hostname: "myregistry.azurecr.io"
+ organization: "myorg"
+ username: "myusername"
+ password: "mypassword"
+...
+
Note: The mandatory organization field (here myorg
) will be created as an ACR repository if it does not already exist.
global:
+...
+ registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+ registry:
+ hostname: "quay.io"
+ organization: "myorg"
+ username: "myusername"
+ password: "mypassword"
+...
+
+2 minute read
+Drycc Workflow ships with Storage by default, which provides in-cluster.
+Every component that relies on object storage uses two inputs for configuration:
+storage-creds
The helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster object storage. Drycc Workflow currently supports Google Compute Storage, Amazon S3, Azure Blob Storage and OpenStack Swift Storage.
+Create storage buckets for each of the Workflow subsystems: builder
, registry
, and database
.
Depending on your chosen object storage you may need to provide globally unique bucket names. If you are using S3, use hyphens instead of periods in the bucket names. Using periods in the bucket name will cause an ssl certificate validation issue with S3.
+If you provide credentials with sufficient access to the underlying storage, Workflow components will create the buckets if they do not exist.
+If applicable, generate credentials that have create and write access to the storage buckets created in Step 1.
+If you are using AWS S3 and your Kubernetes nodes are configured with appropriate IAM API keys via InstanceRoles, you do not need to create API credentials. Do, however, validate that the InstanceRole has appropriate permissions to the configured buckets!
+Operators should configure object storage by editing the Helm values file before running helm install
. To do so:
helm inspect values oci://registry.drycc.cc/charts/workflow > values.yaml
global/storage
parameter to reference the platform you are using, e.g. s3
, azure
, gcs
, or swift
!!! note
+All values will be automatically (base64) encoded except the key_json
values under gcs
/gcr
. These must be base64-encoded. This is to support cleanly passing said encoded text via helm --set
cli functionality rather than attempting to pass the raw JSON data. For example:
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.platformDomain=youdomain.com
+ --set global.storage=gcs,gcs.key_json="$(cat /path/to/gcs_creds.json | base64 -w 0)"
+
+You are now ready to run helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
using your desired object storage.
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+By default, Drycc Workflow ships with the database component, which provides an in-cluster PostgreSQL database backed up to in-cluster or off-cluster object storage. Currently, for object storage, which is utilized by several Workflow components, only off-cluster solutions such as S3 or GCS are recommended in production environments. Experience has shown that many operators already opting for off-cluster object storage similarly prefer to host Postgres off-cluster as well, using Amazon RDS or similar. When excercising both options, a Workflow installation becomes entirely stateless, and is thus restored or rebuilt with greater ease should the need ever arise.
+First, provision a PostgreSQL RDBMS using the cloud provider or other infrastructure of your choice. Take care to ensure that security groups or other firewall rules will permit connectivity from your Kubernetes worker nodes, any of which may play host to the Workflow controller component.
+Take note of the following:
+Within the off-cluster RDBMS, manually provision the following:
+If you are able to log into the RDBMS as a superuser or a user with appropriate permissions, this process will typically look like this:
+$ psql -h <host> -p <port> -d postgres -U <"postgres" or your own username>
+> create user <drycc username; typically "drycc"> with password '<password>';
+> create database <database name; typically "drycc"> with owner <drycc username>;
+> \q
+
The Helm chart for Drycc Workflow can be easily configured to connect the Workflow controller component to an off-cluster PostgreSQL database.
+helm inspect values drycc/workflow > values.yaml
values.yaml
:
+databaseLocation
parameter to off-cluster
.[database]
configuration section to properly reflect all connection details.[controller]
configuration section to properly reflect platformDomain details.You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
as usual.
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+Drycc Workflow ships with a registry component by default, which provides an in-cluster Container registry backed by the platform-configured object storage. Operators might want to use an off-cluster registry for performance or security reasons.
+Every component that relies on a registry uses two inputs for configuration:
+DRYCC_REGISTRY_LOCATION
registry-secret
The Helm chart for Drycc Workflow can be easily configured to connect Workflow components to off-cluster registry. Drycc Workflow supports external registries which provide either short-lived tokens that are valid only for a specified amount of time or long-lived tokens (basic username/password) which are valid forever for authenticating to them. For those registries which provide short lived tokens for authentication, Drycc Workflow will generate and refresh them such that the deployed apps will only have access to the short-lived tokens and not to the actual credentials for the registries.
+When using a private registry the container images are no longer pulled by Drycc Workflow Controller but rather are managed by Kubernetes. This will increase security and overall speed, however the port
information can no longer be discovered. Instead the port
information can be set via drycc config:set PORT=<port>
prior to deploying the application.
Drycc Workflow currently supports:
+helm inspect values drycc/workflow > values.yaml
registryLocation
parameter to reference the registry location you are using: off-cluster
, ecr
, gcr
+* Update the values in the section which corresponds to your registry location type.You are now ready to helm install drycc oci://registry.drycc.cc/charts/workflow --namespace drycc -f values.yaml
using your desired registry.
Here we show how the relevant parts of the fetched values.yaml
file might look like after configuring for a particular off-cluster registry:
After following the docs and creating a registry, e.g. myregistry
, with its corresponding login server of myregistry.azurecr.io
, the following values should be supplied:
global:
+...
+ registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+ registry:
+ hostname: "myregistry.azurecr.io"
+ organization: "myorg"
+ username: "myusername"
+ password: "mypassword"
+...
+
Note: The mandatory organization field (here myorg
) will be created as an ACR repository if it does not already exist.
global:
+...
+ registryLocation: "off-cluster"
+...
+registry-token-refresher:
+...
+ registry:
+ hostname: "quay.io"
+ organization: "myorg"
+ username: "myusername"
+ password: "mypassword"
+...
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+3 minute read
+Now that Helm is installed and the repository has been added, install Workflow with a native gateway by running:
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.gatewayClass=istio \
+ --set global.platformDomain=drycc.cc \
+ --set builder.service.type=LoadBalancer
+
Of course, if you deploy it on a bare machine, you probably do not have Load Balancer. You need to use NodePort:
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set global.gatewayClass=istio \
+ --set global.platformDomain=drycc.cc \
+ --set builder.service.type=NodePort \
+ --set builder.service.nodePort=32222
+
If you want to use Load Balancer on a bare machine, you can look at metallb
+Where global.platformDomain
is a required parameter that is traditionally not required for Workflow that is explained in the next section. In this example we are using drycc.cc
for $hostname
.
Helm will install a variety of Kubernetes resources in the drycc
namespace.
+Wait for the pods that Helm launched to be ready. Monitor their status by running:
$ kubectl --namespace=drycc get pods
+
You should also notice that several Kubernetes gatewayclass has been installed on your cluster. You can view it by running:
+$ kubectl get gatewayclass --namespace drycc
+
Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component’s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.
+Here, it can be seen that the controller, builder and registry all took a few loops waiting for storage before they were able to start:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-hy3xv 1/1 Running 5 5m
+drycc-controller-g3cu8 1/1 Running 5 5m
+drycc-controller-celery-cmxxn 3/3 Running 0 5m
+drycc-database-rad1o 1/1 Running 0 5m
+drycc-logger-fluentbit-1v8uk 1/1 Running 0 5m
+drycc-logger-fluentbit-esm60 1/1 Running 0 5m
+drycc-logger-sm8b3 1/1 Running 0 5m
+drycc-storage-4ww3t 1/1 Running 0 5m
+drycc-registry-asozo 1/1 Running 1 5m
+drycc-rabbitmq-0 1/1 Running 0 5m
+
Now that Workflow has been deployed with the global.gatewayClass
, we will need a Kubernetes gateway in place to begin routing traffic.
Here is an example of how to use istio as an gateway for Workflow. Of course, you are welcome to use any controller you wish.
+$ helm repo add istio https://istio-release.storage.googleapis.com/charts
+$ helm repo update
+$ kubectl create namespace istio-system
+$ helm install istio-base istio/base -n istio-system
+$ helm install istiod istio/istiod -n istio-system --wait
+$ kubectl create namespace istio-ingress
+$ helm install istio-ingress istio/gateway -n istio-ingress --wait
+
User must install drycc and then set up a hostname, and assumes the *.$host
convention.
We need to point the *.$host
record to the public IP address of your gateway. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.
$ kubectl get gateway --namespace drycc
+NAME CLASS ADDRESS PROGRAMMED AGE
+gateway istio 138.91.243.152 True 36d
+
If we were using drycc.cc
as a hostname, we would need to create the following A DNS records.
Name | +Type | +Value | +
---|---|---|
*.drycc.cc | +A | +138.91.243.152 | +
Once all of the pods are in the READY
state, and *.$host
resolves to the external IP found above, the preparation of gateway has been completed!
After installing Workflow, register a user and deploy an application.
+If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can
+access both internal and external networks, and then expose 80
and 443
.
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+To run Drycc Workflow on a Kubernetes cluster, there are a few requirements to keep in mind.
+Choose the gateway provider that best suits your needs and platform.
+This document is aimed at those who have already provisioned a Kubernetes cluster and want to install Drycc Workflow.
+A variety of Drycc Workflow components rely on an object storage system to do their work including storing application slugs, Container images and database logs.
+Drycc Workflow’s controller and passport component rely on a PostgreSQL database to store platform state.
+Drycc Workflow’s builder component relies on a registry for storing application container images.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+Drycc Workflow requires Kubernetes v1.16.15 or later.
+Drycc uses gateway as a routing implementation, so you have to choose an gateway. We recommend using istio or kong.
+Workflow supports the use of ACME to manage automatic certificates, cert-manager is also one of the necessary components, if you use cert-manager EAB, you need to set the clusterResourceNamespace
to the namespace of drycc.
Workflow supports stateful apps. You can create and use them through the ‘drycc volumes’ command. If you want to use this feature, you must have a StorageClass
that supports ReadWriteMany
.
Workflow also supports the OSB API through the ‘drycc resources’ command. If you want to use this function, you need to install service-catalog.
+A variety of Drycc Workflow components rely on an object storage system to do their work, including storing application +slugs, Container images and database logs.
+Drycc Workflow ships with drycc storage by default, which provides in-cluster.
+Workflow supports Amazon Simple Storage Service (S3), Google Cloud Storage (GCS), OpenShift Swift, and Azure Blob +Storage. See configuring object storage for setup instructions.
+When deploying Drycc Workflow, it’s important to provision machines with adequate resources. Drycc is a highly-available +distributed system, which means that Drycc components and your deployed applications will move around the cluster onto +healthy hosts as hosts leave the cluster for various reasons (failures, reboots, autoscalers, etc.). Because of this, +you should have ample spare resources on any machine in your cluster to withstand the additional load of running +services for failed machines.
+Drycc Workflow components use about 2.5GB of memory across the cluster, and require approximately 30GB of hard disk +space. Because it may need to handle additional load if another one fails, each machine has minimum requirements of:
+Note that these estimates are for Drycc Workflow and Kubernetes only. Be sure to leave enough spare capacity for your +application footprint as well.
+Running smaller machines will likely result in increased system load and has been known to result in component failures +and instability.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+4 minute read
+If help is required getting started with Kubernetes and +Drycc Workflow, follow the quickstart guide for assistance.
+Check that the helm
command is available and the version is v2.5.0 or newer.
$ helm version
+Client: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+Server: &version.Version{SemVer:"v2.5.0", GitCommit:"012cb0ac1a1b2f888144ef5a67b8dab6c2d45be6", GitTreeState:"clean"}
+
Drycc Workflow includes everything it needs to run out of the box. However, these defaults are aimed at simplicity rather than +production readiness. Production and staging deployments of Workflow should, at a minimum, use off-cluster storage +which is used by Workflow components to store and backup critical data. Should an operator need to completely re-install +Workflow, the required components can recover from off-cluster storage. See the documentation for configuring object +storage for more details.
+More rigorous installations would benefit from using outside sources for the following things:
+Now, workflow requires that gateway and cert-manager must be installed. Any compatible Kubernetes entry controller can be used.
+If the version of helm is 3.0 +; you need to create the namespace in advance:
+kubectl create ns drycc
+
If you want to change it, set the variable when using helm.
+$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ --namespace drycc \
+ --set builder.imageRegistry=quay.io \
+ --set imagebuilder.imageRegistry=quay.io \
+ --set controller.imageRegistry=quay.io \
+ --set database.imageRegistry=quay.io \
+ --set fluentbit.imageRegistry=quay.io \
+ --set redis.imageRegistry=quay.io \
+ --set rabbitmq.imageRegistry=quay.io \
+ --set logger.imageRegistry=quay.io \
+ --set storage.imageRegistry=quay.io \
+ --set monitor.imageRegistry=quay.io \
+ --set registry.imageRegistry=quay.io \
+ --set registry-proxy.imageRegistry=quay.io \
+ --set global.platformDomain=drycc.cc
+
Helm will install a variety of Kubernetes resources in the drycc
namespace.
+Wait for the pods that Helm launched to be ready. Monitor their status by running:
$ kubectl --namespace=drycc get pods
+
If it’s preferred to have kubectl
automatically update as the pod states change, run (type Ctrl-C to stop the watch):
$ kubectl --namespace=drycc get pods -w
+
Depending on the order in which the Workflow components initialize, some pods may restart. This is common during the +installation: if a component’s dependencies are not yet available, that component will exit and Kubernetes will +automatically restart it.
+Here, it can be seen that the controller, builder and registry all took a few loops before they were able to start:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-574483744-l15zj 1/1 Running 0 4m
+drycc-controller-3953262871-pncgq 1/1 Running 2 4m
+drycc-controller-celery-cmxxn 3/3 Running 0 4m
+drycc-database-83844344-47ld6 1/1 Running 0 4m
+drycc-logger-176328999-wjckx 1/1 Running 4 4m
+drycc-logger-fluentbit-zxnqb 1/1 Running 0 4m
+drycc-redis-304849759-1f35p 1/1 Running 0 4m
+drycc-storage-676004970-nxqgt 1/1 Running 0 4m
+drycc-monitor-grafana-432627134-lnl2h 1/1 Running 0 4m
+drycc-monitor-telegraf-wmcmn 1/1 Running 1 4m
+drycc-registry-756475849-lwc6b 1/1 Running 1 4m
+drycc-registry-proxy-96c4p 1/1 Running 0 4m
+drycc-rabbitmq-0 1/1 Running 0 4m
+
Once all of the pods are in the READY
state, Drycc Workflow is up and running!
For more installation parameters, please check the values.yaml file of workflow.
+After installing Workflow, register a user and deploy an application.
+User must to set up a hostname, and assumes the drycc-builder.$host
convention.
We need to point the drycc-builder.$host
record to the public IP address of your builder. You can get the public IP using the following command. A wildcard entry is necessary here as apps will use the same rule after they are deployed.
$ kubectl get svc drycc-builder --namespace drycc
+NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+drycc-builder 10.0.25.3 138.91.243.152 2222:31625/TCP 33m
+
If we were using drycc.cc
as a hostname, we would need to create the following A DNS records.
Name | +Type | +Value | +
---|---|---|
drycc-builder.drycc.cc | +A | +138.91.243.152 | +
Once all of the pods are in the READY
state, and drycc-builder.$host
resolves to the external IP found above, Workflow is up and running!
After installing Workflow, register a user and deploy an application.
+If your k8s does not provide public network loadblance, you need to install TCP proxy services such as haproxy on machines that can
+access both internal and external networks, and then expose 80
and 443
.
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+After you add the Drycc Chart Repository, you can customize the chart using
+helm inspect values drycc/workflow > values.yaml
before using helm install
to complete the
+installation.
There are a few ways to customize the respective component:
+If the value is exposed in the values.yaml
file as derived above, one may modify the section of the component to tune these settings. The modified value(s) will then take effect at chart installation or release upgrade time via either of the two respective commands:
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ -n drycc \
+ --namespace drycc \
+ -f values.yaml
+ $ helm upgrade drycc oci://registry.drycc.cc/charts/workflow \
+ -n drycc \
+ --namespace drycc \
+ -f values.yaml
+
+If the value hasn’t yet been exposed in the values.yaml
file, one may edit the component deployment with the tuned setting. Here we edit the drycc-controller
deployment:
$ kubectl --namespace drycc edit deployment drycc-controller
+
+Add/edit the setting via the appropriate environment variable and value under the env
section and save. The updated deployment will recreate the component pod with the new/modified setting.
Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself:
+ $ helm fetch oci://registry.drycc.cc/charts/workflow --untar
+ $ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml
+
+Then run helm install ./workflow --namespace drycc --name drycc
to apply the changes, or helm upgrade drycc ./workflow
if the cluster is already running.
You can set resource limits to Workflow components by modifying the values.yaml file fetched
+earlier. This file has a section for each Workflow component. To set a limit to any Workflow
+component just add limitsCpu
, limitsMemory
in the section and set them to the appropriate
+values.
Below is an example of how the builder section of values.yaml
might look with CPU and memory
+limits set:
builder:
+ imageOrg: "drycc"
+ imagePullPolicy: "Always"
+ imageTag: "canary"
+ limitsCpu: "100m"
+ limitsMemory: "50Mi"
+
The following environment variables are tunable for the Builder component:
+Setting | +Description | +
---|---|
DEBUG | +Enable debug log output (default: false) | +
BUILDER_POD_NODE_SELECTOR | +A node selector setting for builder job. As it may sometimes consume a lot of node resources, one may want a given builder job to run in a specific node only, so it won’t affect critical nodes. for example pool:testing,disk:magnetic |
+
The following environment variables are tunable for the Controller component:
+Setting | +Description | +
---|---|
REGISTRATION_MODE | +set registration to “enabled”, “disabled”, or “admin_only” (default: “admin_only”) | +
GUNICORN_WORKERS | +number of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1) | +
RESERVED_NAMES | +a comma-separated list of names which applications cannot reserve for routing (default: “drycc, drycc-builder”) | +
DRYCC_DEPLOY_HOOK_URLS | +a comma-separated list of URLs to send deploy hooks to. | +
DRYCC_DEPLOY_HOOK_SECRET_KEY | +a private key used to compute the HMAC signature for deploy hooks. | +
DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSING | +rejects a deploy if the previous build had a Procfile but the current deploy is missing it. A 409 is thrown in the API. Prevents accidental process types removal. (default: “false”, allowed values: “true”, “false”) | +
DRYCC_DEPLOY_PROCFILE_MISSING_REMOVE | +when turned on (default) any missing process type in a Procfile compared to the previous deploy is removed. When set to false will allow an empty Procfile to go through without removing missing process types, note that new images, configs and so on will get updated on all proc types. (default: “true”, allowed values: “true”, “false”) | +
DRYCC_DEFAULT_CONFIG_TAGS | +set tags for all applications by default, for example: ‘{“role”: “worker”}’. (default: ‘’) | +
KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPEC | +set resource quota to application namespace by setting ResourceQuota spec, for example: {"spec":{"hard":{"pods":"10"}}} , restrict app owner to spawn more then 10 pods (default: “”, no quota will be applied to namespace) |
+
Configuration options for LDAP authentication are detailed here.
+The following environment variables are available for enabling LDAP +authentication of user accounts in the Passport component:
+Setting | +Description | +
---|---|
LDAP_ENDPOINT | +The URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: “”, example: ldap://hostname ). |
+
LDAP_BIND_DN | +The distinguished name to use when binding to the LDAP server (default: “”) | +
LDAP_BIND_PASSWORD | +The password to use with LDAP_BIND_DN (default: “”) | +
LDAP_USER_BASEDN | +The distinguished name of the search base for user names (default: “”) | +
LDAP_USER_FILTER | +The name of the login field in the users search base (default: “username”) | +
LDAP_GROUP_BASEDN | +The distinguished name of the search base for user’s groups names (default: “”) | +
LDAP_GROUP_FILTER | +The filter for user’s groups (default: “”, example: objectClass=person ) |
+
Setting | +Description | +
---|---|
DRYCC_DEPLOY_BATCHES | +the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) | +
DRYCC_DEPLOY_TIMEOUT | +deploy timeout in seconds per deploy batch (default: 120) | +
IMAGE_PULL_POLICY | +the kubernetes image pull policy for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”) | +
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT | +how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) | +
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS | +how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) | +
See the Deploying Apps guide for more detailed information on those.
+The following environment variables are tunable for the Database component:
+Setting | +Description | +
---|---|
BACKUP_FREQUENCY | +how often the database should perform a base backup (default: “12h”) | +
BACKUPS_TO_RETAIN | +number of base backups the backing store should retain (default: 5) | +
The following values can be changed in the values.yaml
file or by using the --values
flag with the Helm CLI.
Key | +Description | +
---|---|
config.service | +The service section defines the global properties of the service. | +
config.inputs | +An input section defines a source (related to an input plugin). | +
config.filters | +A filter section defines a filter (related to a filter plugin) | +
config.outputs | +The outputs section specify a destination that certain records should follow after a Tag match. | +
For more information about the various variables that can be set please see the fluentbit.
+The following environment variables are tunable for the Logger component:
+Setting | +Description | +
---|---|
STORAGE_ADAPTER | +How to store logs that are sent to the logger. Legal values are “file”, “memory”, and “redis”. (default: “redis”) | +
NUMBER_OF_LINES | +How many lines to store in the ring buffer (default: 1000) | +
We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the values.yaml
file or by using the --set
flag with the Helm CLI. You can see these options below:
Setting | +Default Value | +Description | +
---|---|---|
user | +“admin” | +The first user created in the database (this user has admin privileges) | +
password | +“admin” | +Password for the first user. | +
allow_sign_up | +“true” | +Allows users to sign up for an account. | +
For a list of other options you can set by using environment variables please see the configuration file in Github.
+For a list of configuration values that can be set by using environment variables please see the following configuration file.
+You can find a list of values that can be set using environment variables here.
+The Registry component can be tuned by following the +drycc/distribution config doc.
+The majority of router settings are tunable through annotations, which allows the router to be +re-configured with zero downtime post-installation. You can find the list of annotations to tune +here.
+The following environment variables are tunable for the [Router][] component:
+Setting | +Description | +
---|---|
POD_NAMESPACE | +The pod namespace the router resides in. This is set by the Kubernetes downward API. | +
The following environment variables are tunable for [Workflow Manager][]:
+Setting | +Description | +
---|---|
CHECK_VERSIONS | +Enables the external version check at https://versions.drycc.info/ (default: “true”) | +
POLL_INTERVAL_SEC | +The interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours) | +
VERSIONS_API_URL | +The versions API URL (default: “https://versions-staging.drycc.info”) | +
DOCTOR_API_URL | +The doctor API URL (default: “https://doctor-staging.drycc.info”) | +
API_VERSION | +The version number Workflow Manager sends to the versions API (default: “v2”) | +
For example, assuming example.com
were a cluster’s domain:
drycc.example.com
<application name>.example.com
Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster’s domain be directed to the cluster node(s) hosting the platform’s router component, which is capable of directing traffic within the cluster to the correct endpoints.
+Generally, it is recommended that a [load balancer][] be used to direct inbound traffic to one or more routers. In such a case, configuring DNS is as simple as defining a wildcard record in DNS that points to the load balancer.
+For example, assuming a domain of example.com
:
A
record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)CNAME
record referencing an existing fully-qualified domain name for the load balancer
+DNS for any applications using a “custom domain” (a fully-qualified domain name that is not a subdomain of the cluster’s own domain) can be configured by creating a CNAME
record that references the wildcard record described above.
Although it is dependent upon your distribution of Kubernetes and your underlying infrastructure, in many cases, the IP(s) or existing fully-qualified domain name of a load balancer can be determined directly using the kubectl
tool:
$ kubectl --namespace=istio-nginx describe service | grep "LoadBalancer"
+LoadBalancer Ingress: a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com
+
The LoadBalancer Ingress
field typically describes an existing domain name or public IP(s). Note that if Kubernetes is able to automatically provision a load balancer for you, it does so asynchronously. If the command shown above is issued very soon after Workflow installation, the load balancer may not exist yet.
On some platforms (Minikube, for instance), a load balancer is not an easy or practical thing to provision. In these cases, one can directly identify the public IP of a Kubernetes node that is hosting a router pod and use that information to configure the local /etc/hosts
file.
Because wildcard entries do not work in a local /etc/hosts
file, using this strategy may result in frequent editing of that file to add fully-qualified subdomains of a cluster for each application added to that cluster. Because of this a more viable option may be to utilize the xip.io service.
In general, for any IP, a.b.c.d
, the fully-qualified domain name any-subdomain.a.b.c.d.xip.io
will resolve to the IP a.b.c.d
. This can be enormously useful.
To begin, find the node(s) hosting router instances using kubectl
:
$ kubectl --namespace=istio-ingress describe pod | grep Node:
+Node: ip-10-0-0-199.us-west-2.compute.internal/10.0.0.199
+Node: ip-10-0-0-198.us-west-2.compute.internal/10.0.0.198
+
The command will display information for every router pod. For each, a node name and IP are displayed in the Node
field. If the IPs appearing in these fields are public, any of these may be used to configure your local /etc/hosts
file or may be used with xip.io. If the IPs shown are not public, further investigation may be needed.
You can list the IP addresses of a node using kubectl
:
$ kubectl describe node ip-10-0-0-199.us-west-2.compute.internal
+# ...
+Addresses: 10.0.0.199,10.0.0.199,54.218.85.175
+# ...
+
Here, the Addresses
field lists all the node’s IPs. If any of them are public, again, they may be used to configure your local /etc/hosts
file or may be used with xip.io.
In this section, we’ll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster.
+We’ll assume the following in this section:
+mystuff.com
domain name registered with a registrar
+mystuff.com
in the instructions to followHere are the steps for configuring cloud DNS to route to your drycc cluster:
+kubectl get svc -n istio-ingress
and look for the LoadBalancer Ingress
column to get the IP addressNetworking
=> Cloud DNS
, then click on Create Zone
)mystuff.com.
(note the .
at the endCreate
buttonAdd Record Set
button on the resulting pageDNS Name
: *
Resource Record Type
: A
TTL
: the DNS TTL of your choosing. If you’re testing or you anticipate that you’ll tear down and rebuild many drycc clusters over time, we recommend a low TTLIPv4 Address
: The IP that you got in the very first stepCreate
buttonlbdomain.com
, enter the following fields in the resulting form:DNS Name
: *
Resource Record Type
: CNAME
TTL
: the DNS TTL of your choosing. If you’re testing or you anticipate that you’ll tear down and rebuild many drycc clusters over time, we recommend a low TTLCanonical name
: lbdomain.com.
(note the .
a the end)Create
buttonmystuff.com
domain to the ones under the data
column in the NS
record on the same page. They’ll often be something like the below (note the trailing .
characters).ns-cloud-b1.googledomains.com.
+ns-cloud-b2.googledomains.com.
+ns-cloud-b3.googledomains.com.
+ns-cloud-b4.googledomains.com.
+
Note: If you ever have to re-create your drycc cluster, simply go back to step 6.4 or 7.4 (depending on your load balancer) and change the IP address or domain name to the new value. You may have to wait for the TTL you set to expire.
+To test that traffic reaches its intended destination, a request can be +sent to the Drycc controller like so (do not forget the trailing slash!):
+curl http://drycc.example.com/v2/
+
Or:
+curl http://drycc.54.218.85.175.xip.io/v2/
+
Since such requests require authentication, a response such as the following should be considered an indicator of success:
+{"detail":"Authentication credentials were not provided."}
+
+It’s useful to help keep the development team informed about deploys, while +it can also be used to integrate different systems together.
+After one or more hooks are setup, hook output and errors appear in your application’s logs:
+$ drycc logs
+...
+2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks
+
Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy +hooks by tuning the controller settings via the Helm chart.
+The HTTP deploy hook performs an HTTP POST to a URL. The parameters included in the request are the
+same as the variables available in the hook message: app
, release
, release_summary
, sha
and
+user
. See below for their descriptions:
app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv
+
Optionally, if a deploy hook secret key is added to the controller through
+tuning the controller settings, a new Authorization
header will be
+present in the POST request. The value of this header is computed as the HMAC hex digest of the
+request URL, using the secret as the key.
In order to authenticate that this request came from Workflow, use the secret key, the full URL and +the HMAC-SHA1 hashing algorithm to compute the signature. In Python, that would look something like +this:
+import hashlib
+import hmac
+
+hmac.new("my_secret_key", "http://drycc.rocks?app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv", digestmod=hashlib.sha1).hexdigest()
+
If the value of the computed HMAC hex digest and the value in the Authorization
header are
+identical, then the request came from Workflow.
!!! important +When computing the signature, ensure that the URL parameters are in alphabetic order. This is +critical when computing the cryptographic signature as most web applications don’t care about +the order of the HTTP parameters, but the cryptographic signature will not be the same.
+ +The logging platform is made up of 2 components - Fluentbit and Logger.
+Fluentbit runs on every worker node of the cluster and is deployed as a Daemon Set. The Fluentbit pods capture all of the stderr and stdout streams of every container running on the host (even those not hosted directly by kubernetes). Once the log message arrives in our custom fluentbit plugin we determine where the message originated.
+If the message was from the Workflow Controller or from an application deployed via workflow we send it to the logs topic on the local Redis Stream instance.
+Logger then acts as a consumer reading messages off of the Redis Stream logs topic storing those messages in a local Redis instance. When a user wants to retrieve log entries using the drycc logs
command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis.
Even though we provide a redis instance with the default Workflow install, it is recommended that operators use a third-party source like Elasticache or similar offering. This way your data is durable across upgrades or outages. If you have a third-party Redis installation you would like to use all you need to do is set the following values in your helm chart:
+These can be changed by running helm inspect values drycc/workflow > values.yaml
before using
+helm install
to complete the installation. To customize the redis credentials, edit values.yaml
+and modify the redis
section of the file to tune these settings.
If the drycc logs
command encounters an error it will return the following message:
Error: There are currently no log messages. Please check the following things:
+1) Logger and fluentbit pods are running.
+2) The application is writing logs to the logger component by checking that an entry in the ring buffer was created: kubectl --namespace=drycc logs <logger pod>
+3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec <fluentbit pod> ls /var/log/containers
+
┌────────┐
+ │ Router │ ┌────────┐ ┌─────┐
+ └────────┘ │ Logger │◀───▶│Redis│
+ │ └────────┘ └─────┘
+ Log file ▲
+ │ │
+ ▼ │
+┌────────┐ ┌─────────┐ logs/metrics ┌──────────────┐
+│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │
+└────────┘ └─────────┘ └──────────────┘
+
+
Fluent Bit is based in a pluggable architecture where different plugins plays a major role in the data pipeline, more than 70 built-in plugins available. +Please refer to charts values.yaml for specific configurations.
+ +We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:
+┌────────────────┐
+│ HOST │
+│ node-exporter │◀──┐ ┌──────────────────┐
+└────────────────┘ │ │kube-state-metrics│
+ │ └──────────────────┘
+┌────────────────┐ │ ▲
+│ HOST │ │ ┌────────────┐ │
+│ node-exporter │◀──┼────│ Prometheus │─────────────┘
+└────────────────┘ │ └────────────┘
+ │ ▲
+┌───────────────┐ │ │
+│ HOST │ │ ▼
+│ node-exporter│◀───┘ ┌──────────┐
+└───────────────┘ │ Grafana │
+ └──────────┘
+
Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a service annotation through the router at the following URL: http://grafana.mydomain.com
. The default login is admin/admin
. If you are interested in changing these values please see [Tuning Component Settings][].
Grafana will preload several dashboards to help operators get started with monitoring Kubernetes and Drycc Workflow. +These dashboards are meant as starting points and don’t include every item that might be desirable to monitor in a +production installation.
+Drycc Workflow monitoring by default does not write data to the host filesystem or to long-term storage. If the Grafana instance fails, modified dashboards are lost.
+A production install of Grafana should have the following configuration values changed if possible:
+admin/admin
. The value for the password is passed in plain text so it is best to set this value on the command line instead of checking it into version control.Enabling persistence will allow your custom configuration to persist across pod restarts. This means that the default sqllite database (which stores things like sessions and user data) will not disappear if you upgrade the Workflow installation.
+If you wish to have persistence for Grafana you can set enabled
to true
in the values.yaml
file before running helm install
.
grafana:
+ # Configure the following ONLY if you want persistence for on-cluster grafana
+ # GCP PDs and EBS volumes are supported only
+ persistence:
+ enabled: true # Set to true to enable persistence
+ size: 5Gi # PVC size
+
If you wish to provide your own Grafana instance you can set grafanaLocation
in the values.yaml
file before running helm install
.
Prometheus writes data to the host disk; however, if the prometheus pod dies and comes back on another host, the data will not be recovered. The prometheus graph UI is also exposed through the router allowing users to access the query engine by going to prometheus.mydomain.com
.
You can set node-exporter
and kube-state-metrics
to true
or false
in the values.yaml
.
+If you wish to have persistence for Prometheus you can set enabled
to true
in the values.yaml
file before running helm install
.
prometheus:
+ prometheus-server:
+ persistence:
+ enabled: true # Set to true to enable persistence
+ size: 10Gi # PVC size
+node-exporter:
+ enabled: true
+kube-state-metrics:
+ enabled: true
+
To use off-cluster Prometheus, please provide the following values in the values.yaml
file before running helm install
.
global.prometheusLocation=off-cluster
url = "http://my.prometheus.url:9090"
In production, persistent storage can be achieved by running an external object store. +For users on AWS, GCE/GKE or Azure, the convenience of Amazon S3, Google GCS or Microsoft Azure Storage +makes the prospect of running a Storage-less Workflow cluster quite reasonable. For users who have restriction +on using external object storage using swift object storage can be an option.
+Running a Workflow cluster without Storage provides several advantages:
+See Configuring Object Storage for details on removing this operational complexity.
+There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.
+By default, registration with the Workflow controller is in “admin_only” mode. The first user
+to run a drycc register
command becomes the initial “admin” user, and registrations after that
+are disallowed unless requested by an admin.
Please see the following documentation to learn about changing registration mode:
+ +It is also recommended to disable signups for the Grafana dashboards.
+Please see the following documentation to learn about disabling Grafana signups:
+ +If your cluster has RBAC amongst your authorization modes ($ kubectl api-versions
should contains rbac.authorization.k8s.io
) it may be necessary to enable RBAC in Workflow.
+This can be achieved by setting use_rbac
in the global
section of values.yaml
to true
, or by adding --set=global.use_rbac=true
to the $ helm install/upgrade
command.
+RBAC support was announced in Kubernetes-1.5 and is enabled by default if:
Note: helm may need to be given specific permissions under RBAC if not already done.
+Attention: Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this PR for more details.
+ +This upgrade process requires:
+!!! note +If upgrading from a Helm Classic install, you’ll need to ‘migrate’ the cluster to a Kubernetes Helm installation. See Workflow-Migration for steps.
+Helm will remove all components from the previous release. Traffic to applications deployed through +Workflow will continue to flow during the upgrade. No service interruptions should occur.
+If Workflow is not configured to use off-cluster Postgres, the Workflow API will experience a brief +period of downtime while the database recovers from backup.
+First, find the name of the release helm gave to your deployment with helm ls
, then run
$ helm upgrade <release-name> oci://registry.drycc.cc/charts/workflow
+
Note: If using off-cluster object storage on gcs and/or off-cluster registry using gcr and intending to upgrade from a pre-v2.10.0
chart to v2.10.0
or greater, the key_json
values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing values.yaml
used for previous installs, the following may be run:
$ B64_KEY_JSON="$(cat ~/path/to/key.json | base64 -w 0)"
+$ helm upgrade <release_name> drycc/workflow -f values.yaml --set gcs.key_json="${B64_KEY_JSON}",registry-token-refresher.gcr.key_json="${B64_KEY_JSON}"
+
Alternatively, simply replace the appropriate values in values.yaml and do without the --set
+parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when
+upgrading.
Verify that all components have started and passed their readiness checks:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-2448122224-3cibz 1/1 Running 0 5m
+drycc-controller-1410285775-ipc34 1/1 Running 3 5m
+drycc-controller-celery-694f75749b-cmxxn 3/3 Running 0 5m
+drycc-database-e7c5z 1/1 Running 0 5m
+drycc-logger-cgjup 1/1 Running 3 5m
+drycc-logger-fluentbit-45h7j 1/1 Running 0 5m
+drycc-logger-fluentbit-4z7lw 1/1 Running 0 5m
+drycc-logger-fluentbit-k2wsw 1/1 Running 0 5m
+drycc-logger-fluentbit-skdw4 1/1 Running 0 5m
+drycc-redis-8nazu 1/1 Running 0 5m
+drycc-monitor-grafana-tm266 1/1 Running 0 5m
+drycc-monitor-telegraf-51zel 1/1 Running 1 5m
+drycc-monitor-telegraf-cdasg 1/1 Running 0 5m
+drycc-monitor-telegraf-hea6x 1/1 Running 0 5m
+drycc-monitor-telegraf-r7lsg 1/1 Running 0 5m
+drycc-registry-1814324048-yomz5 1/1 Running 0 5m
+drycc-registry-proxy-4m3o4 1/1 Running 0 5m
+drycc-registry-proxy-no3r1 1/1 Running 0 5m
+drycc-registry-proxy-ou8is 1/1 Running 0 5m
+drycc-registry-proxy-zyajl 1/1 Running 0 5m
+drycc-rabbitmq-0 1/1 Running 0 5m
+
Users of Drycc Workflow should now upgrade their drycc client to avoid getting WARNING: Client and server API versions do not match. Please consider upgrading.
warnings.
curl -sfL https://www.drycc.cc/install-cli.sh | bash - && sudo mv drycc $(which drycc)
+
+5 minute read
+For example, assuming example.com
were a cluster’s domain:
drycc.example.com
<application name>.example.com
Given that this is the case, the primary objective in configuring DNS is that traffic for all subdomains of a cluster’s domain be directed to the cluster node(s) hosting the platform’s router component, which is capable of directing traffic within the cluster to the correct endpoints.
+Generally, it is recommended that a [load balancer][] be used to direct inbound traffic to one or more routers. In such a case, configuring DNS is as simple as defining a wildcard record in DNS that points to the load balancer.
+For example, assuming a domain of example.com
:
A
record enumerating each of your load balancer(s) IPs (i.e. DNS round-robining)CNAME
record referencing an existing fully-qualified domain name for the load balancer
+DNS for any applications using a “custom domain” (a fully-qualified domain name that is not a subdomain of the cluster’s own domain) can be configured by creating a CNAME
record that references the wildcard record described above.
Although it is dependent upon your distribution of Kubernetes and your underlying infrastructure, in many cases, the IP(s) or existing fully-qualified domain name of a load balancer can be determined directly using the kubectl
tool:
$ kubectl --namespace=istio-nginx describe service | grep "LoadBalancer"
+LoadBalancer Ingress: a493e4e58ea0511e5bb390686bc85da3-1558404688.us-west-2.elb.amazonaws.com
+
The LoadBalancer Ingress
field typically describes an existing domain name or public IP(s). Note that if Kubernetes is able to automatically provision a load balancer for you, it does so asynchronously. If the command shown above is issued very soon after Workflow installation, the load balancer may not exist yet.
On some platforms (Minikube, for instance), a load balancer is not an easy or practical thing to provision. In these cases, one can directly identify the public IP of a Kubernetes node that is hosting a router pod and use that information to configure the local /etc/hosts
file.
Because wildcard entries do not work in a local /etc/hosts
file, using this strategy may result in frequent editing of that file to add fully-qualified subdomains of a cluster for each application added to that cluster. Because of this a more viable option may be to utilize the xip.io service.
In general, for any IP, a.b.c.d
, the fully-qualified domain name any-subdomain.a.b.c.d.xip.io
will resolve to the IP a.b.c.d
. This can be enormously useful.
To begin, find the node(s) hosting router instances using kubectl
:
$ kubectl --namespace=istio-ingress describe pod | grep Node:
+Node: ip-10-0-0-199.us-west-2.compute.internal/10.0.0.199
+Node: ip-10-0-0-198.us-west-2.compute.internal/10.0.0.198
+
The command will display information for every router pod. For each, a node name and IP are displayed in the Node
field. If the IPs appearing in these fields are public, any of these may be used to configure your local /etc/hosts
file or may be used with xip.io. If the IPs shown are not public, further investigation may be needed.
You can list the IP addresses of a node using kubectl
:
$ kubectl describe node ip-10-0-0-199.us-west-2.compute.internal
+# ...
+Addresses: 10.0.0.199,10.0.0.199,54.218.85.175
+# ...
+
Here, the Addresses
field lists all the node’s IPs. If any of them are public, again, they may be used to configure your local /etc/hosts
file or may be used with xip.io.
In this section, we’ll describe how to configure Google Cloud DNS for routing your domain name to your Drycc cluster.
+We’ll assume the following in this section:
+mystuff.com
domain name registered with a registrar
+mystuff.com
in the instructions to followHere are the steps for configuring cloud DNS to route to your drycc cluster:
+kubectl get svc -n istio-ingress
and look for the LoadBalancer Ingress
column to get the IP addressNetworking
=> Cloud DNS
, then click on Create Zone
)mystuff.com.
(note the .
at the endCreate
buttonAdd Record Set
button on the resulting pageDNS Name
: *
Resource Record Type
: A
TTL
: the DNS TTL of your choosing. If you’re testing or you anticipate that you’ll tear down and rebuild many drycc clusters over time, we recommend a low TTLIPv4 Address
: The IP that you got in the very first stepCreate
buttonlbdomain.com
, enter the following fields in the resulting form:DNS Name
: *
Resource Record Type
: CNAME
TTL
: the DNS TTL of your choosing. If you’re testing or you anticipate that you’ll tear down and rebuild many drycc clusters over time, we recommend a low TTLCanonical name
: lbdomain.com.
(note the .
a the end)Create
buttonmystuff.com
domain to the ones under the data
column in the NS
record on the same page. They’ll often be something like the below (note the trailing .
characters).ns-cloud-b1.googledomains.com.
+ns-cloud-b2.googledomains.com.
+ns-cloud-b3.googledomains.com.
+ns-cloud-b4.googledomains.com.
+
Note: If you ever have to re-create your drycc cluster, simply go back to step 6.4 or 7.4 (depending on your load balancer) and change the IP address or domain name to the new value. You may have to wait for the TTL you set to expire.
+To test that traffic reaches its intended destination, a request can be +sent to the Drycc controller like so (do not forget the trailing slash!):
+curl http://drycc.example.com/v2/
+
Or:
+curl http://drycc.54.218.85.175.xip.io/v2/
+
Since such requests require authentication, a response such as the following should be considered an indicator of success:
+{"detail":"Authentication credentials were not provided."}
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+It’s useful to help keep the development team informed about deploys, while +it can also be used to integrate different systems together.
+After one or more hooks are setup, hook output and errors appear in your application’s logs:
+$ drycc logs
+...
+2011-03-15T15:07:29-07:00 drycc[api]: Deploy hook sent to http://drycc.rocks
+
Deploy hooks are a generic HTTP hook. An administrator can create and configure multiple deploy +hooks by tuning the controller settings via the Helm chart.
+The HTTP deploy hook performs an HTTP POST to a URL. The parameters included in the request are the
+same as the variables available in the hook message: app
, release
, release_summary
, sha
and
+user
. See below for their descriptions:
app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv
+
Optionally, if a deploy hook secret key is added to the controller through
+tuning the controller settings, a new Authorization
header will be
+present in the POST request. The value of this header is computed as the HMAC hex digest of the
+request URL, using the secret as the key.
In order to authenticate that this request came from Workflow, use the secret key, the full URL and +the HMAC-SHA1 hashing algorithm to compute the signature. In Python, that would look something like +this:
+import hashlib
+import hmac
+
+hmac.new("my_secret_key", "http://drycc.rocks?app=secure-woodland&release=v4&release_summary=gabrtv%20deployed%35b3726&sha=35b3726&user=gabrtv", digestmod=hashlib.sha1).hexdigest()
+
If the value of the computed HMAC hex digest and the value in the Authorization
header are
+identical, then the request came from Workflow.
!!! important +When computing the signature, ensure that the URL parameters are in alphabetic order. This is +critical when computing the cryptographic signature as most web applications don’t care about +the order of the HTTP parameters, but the cryptographic signature will not be the same.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Helm Charts are a set of Kubernetes manifests that reflect best practices for deploying an application or service on Kubernetes.
+The Drycc Workflow controller and all applications deployed via Workflow are intended (by default) to be accessible as subdomains of the Workflow cluster’s domain.
+Deploy hooks allow an external service to receive a notification whenever a new version of your app is pushed to Workflow.
+Logs are a stream of time-stamped events aggregated from the output streams of all your app’s running processes. Retrieve, filter, or use syslog drains.
+Platform monitoring to your apps to spot issues in advance and respond to incidents quickly.
+When readying a Workflow deployment for production workloads, there are some additional recommendations.
+Drycc Workflow releases may be upgraded in-place with minimal downtime.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+The logging platform is made up of 2 components - Fluentbit and Logger.
+Fluentbit runs on every worker node of the cluster and is deployed as a Daemon Set. The Fluentbit pods capture all of the stderr and stdout streams of every container running on the host (even those not hosted directly by kubernetes). Once the log message arrives in our custom fluentbit plugin we determine where the message originated.
+If the message was from the Workflow Controller or from an application deployed via workflow we send it to the logs topic on the local Redis Stream instance.
+Logger then acts as a consumer reading messages off of the Redis Stream logs topic storing those messages in a local Redis instance. When a user wants to retrieve log entries using the drycc logs
command we make an HTTP request from Controller to Logger which then fetches the appropriate data from Redis.
Even though we provide a redis instance with the default Workflow install, it is recommended that operators use a third-party source like Elasticache or similar offering. This way your data is durable across upgrades or outages. If you have a third-party Redis installation you would like to use all you need to do is set the following values in your helm chart:
+These can be changed by running helm inspect values drycc/workflow > values.yaml
before using
+helm install
to complete the installation. To customize the redis credentials, edit values.yaml
+and modify the redis
section of the file to tune these settings.
If the drycc logs
command encounters an error it will return the following message:
Error: There are currently no log messages. Please check the following things:
+1) Logger and fluentbit pods are running.
+2) The application is writing logs to the logger component by checking that an entry in the ring buffer was created: kubectl --namespace=drycc logs <logger pod>
+3) Making sure that the container logs were mounted properly into the fluentbit pod: kubectl --namespace=drycc exec <fluentbit pod> ls /var/log/containers
+
┌────────┐
+ │ Router │ ┌────────┐ ┌─────┐
+ └────────┘ │ Logger │◀───▶│Redis│
+ │ └────────┘ └─────┘
+ Log file ▲
+ │ │
+ ▼ │
+┌────────┐ ┌─────────┐ logs/metrics ┌──────────────┐
+│App Logs│──Log File──▶│Fluentbit│───────topics─────▶│ Redis Stream │
+└────────┘ └─────────┘ └──────────────┘
+
+
Fluent Bit is based in a pluggable architecture where different plugins plays a major role in the data pipeline, more than 70 built-in plugins available. +Please refer to charts values.yaml for specific configurations.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+3 minute read
+We now include a monitoring stack for introspection on a running Kubernetes cluster. The stack includes 4 components:
+┌────────────────┐
+│ HOST │
+│ node-exporter │◀──┐ ┌──────────────────┐
+└────────────────┘ │ │kube-state-metrics│
+ │ └──────────────────┘
+┌────────────────┐ │ ▲
+│ HOST │ │ ┌────────────┐ │
+│ node-exporter │◀──┼────│ Prometheus │─────────────┘
+└────────────────┘ │ └────────────┘
+ │ ▲
+┌───────────────┐ │ │
+│ HOST │ │ ▼
+│ node-exporter│◀───┘ ┌──────────┐
+└───────────────┘ │ Grafana │
+ └──────────┘
+
Grafana allows users to create custom dashboards that visualize the data captured to the running Prometheus component. By default Grafana is exposed using a service annotation through the router at the following URL: http://grafana.mydomain.com
. The default login is admin/admin
. If you are interested in changing these values please see [Tuning Component Settings][].
Grafana will preload several dashboards to help operators get started with monitoring Kubernetes and Drycc Workflow. +These dashboards are meant as starting points and don’t include every item that might be desirable to monitor in a +production installation.
+Drycc Workflow monitoring by default does not write data to the host filesystem or to long-term storage. If the Grafana instance fails, modified dashboards are lost.
+A production install of Grafana should have the following configuration values changed if possible:
+admin/admin
. The value for the password is passed in plain text so it is best to set this value on the command line instead of checking it into version control.Enabling persistence will allow your custom configuration to persist across pod restarts. This means that the default sqllite database (which stores things like sessions and user data) will not disappear if you upgrade the Workflow installation.
+If you wish to have persistence for Grafana you can set enabled
to true
in the values.yaml
file before running helm install
.
grafana:
+ # Configure the following ONLY if you want persistence for on-cluster grafana
+ # GCP PDs and EBS volumes are supported only
+ persistence:
+ enabled: true # Set to true to enable persistence
+ size: 5Gi # PVC size
+
If you wish to provide your own Grafana instance you can set grafanaLocation
in the values.yaml
file before running helm install
.
Prometheus writes data to the host disk; however, if the prometheus pod dies and comes back on another host, the data will not be recovered. The prometheus graph UI is also exposed through the router allowing users to access the query engine by going to prometheus.mydomain.com
.
You can set node-exporter
and kube-state-metrics
to true
or false
in the values.yaml
.
+If you wish to have persistence for Prometheus you can set enabled
to true
in the values.yaml
file before running helm install
.
prometheus:
+ prometheus-server:
+ persistence:
+ enabled: true # Set to true to enable persistence
+ size: 10Gi # PVC size
+node-exporter:
+ enabled: true
+kube-state-metrics:
+ enabled: true
+
To use off-cluster Prometheus, please provide the following values in the values.yaml
file before running helm install
.
global.prometheusLocation=off-cluster
url = "http://my.prometheus.url:9090"
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+In production, persistent storage can be achieved by running an external object store. +For users on AWS, GCE/GKE or Azure, the convenience of Amazon S3, Google GCS or Microsoft Azure Storage +makes the prospect of running a Storage-less Workflow cluster quite reasonable. For users who have restriction +on using external object storage using swift object storage can be an option.
+Running a Workflow cluster without Storage provides several advantages:
+See Configuring Object Storage for details on removing this operational complexity.
+There are some additional security-related considerations when running Workflow in production. +See [Security Considerations][] for details.
+By default, registration with the Workflow controller is in “admin_only” mode. The first user
+to run a drycc register
command becomes the initial “admin” user, and registrations after that
+are disallowed unless requested by an admin.
Please see the following documentation to learn about changing registration mode:
+ +It is also recommended to disable signups for the Grafana dashboards.
+Please see the following documentation to learn about disabling Grafana signups:
+ +If your cluster has RBAC amongst your authorization modes ($ kubectl api-versions
should contains rbac.authorization.k8s.io
) it may be necessary to enable RBAC in Workflow.
+This can be achieved by setting use_rbac
in the global
section of values.yaml
to true
, or by adding --set=global.use_rbac=true
to the $ helm install/upgrade
command.
+RBAC support was announced in Kubernetes-1.5 and is enabled by default if:
Note: helm may need to be given specific permissions under RBAC if not already done.
+Attention: Azure ACS Kubernetes clusters are not RBAC-enabled for today due to lack in authentication strategy. Feel free to watch this PR for more details.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+6 minute read
+After you add the Drycc Chart Repository, you can customize the chart using
+helm inspect values drycc/workflow > values.yaml
before using helm install
to complete the
+installation.
There are a few ways to customize the respective component:
+If the value is exposed in the values.yaml
file as derived above, one may modify the section of the component to tune these settings. The modified value(s) will then take effect at chart installation or release upgrade time via either of the two respective commands:
$ helm install drycc oci://registry.drycc.cc/charts/workflow \
+ -n drycc \
+ --namespace drycc \
+ -f values.yaml
+ $ helm upgrade drycc oci://registry.drycc.cc/charts/workflow \
+ -n drycc \
+ --namespace drycc \
+ -f values.yaml
+
+If the value hasn’t yet been exposed in the values.yaml
file, one may edit the component deployment with the tuned setting. Here we edit the drycc-controller
deployment:
$ kubectl --namespace drycc edit deployment drycc-controller
+
+Add/edit the setting via the appropriate environment variable and value under the env
section and save. The updated deployment will recreate the component pod with the new/modified setting.
Lastly, one may also fetch and edit the chart as served by version control/the chart repository itself:
+ $ helm fetch oci://registry.drycc.cc/charts/workflow --untar
+ $ $EDITOR workflow/charts/controller/templates/controller-deployment.yaml
+
+Then run helm install ./workflow --namespace drycc --name drycc
to apply the changes, or helm upgrade drycc ./workflow
if the cluster is already running.
You can set resource limits to Workflow components by modifying the values.yaml file fetched
+earlier. This file has a section for each Workflow component. To set a limit to any Workflow
+component just add limitsCpu
, limitsMemory
in the section and set them to the appropriate
+values.
Below is an example of how the builder section of values.yaml
might look with CPU and memory
+limits set:
builder:
+ imageOrg: "drycc"
+ imagePullPolicy: "Always"
+ imageTag: "canary"
+ limitsCpu: "100m"
+ limitsMemory: "50Mi"
+
The following environment variables are tunable for the Builder component:
+Setting | +Description | +
---|---|
DEBUG | +Enable debug log output (default: false) | +
BUILDER_POD_NODE_SELECTOR | +A node selector setting for builder job. As it may sometimes consume a lot of node resources, one may want a given builder job to run in a specific node only, so it won’t affect critical nodes. for example pool:testing,disk:magnetic |
+
The following environment variables are tunable for the Controller component:
+Setting | +Description | +
---|---|
REGISTRATION_MODE | +set registration to “enabled”, “disabled”, or “admin_only” (default: “admin_only”) | +
GUNICORN_WORKERS | +number of gunicorn workers spawned to process requests (default: CPU cores * 4 + 1) | +
RESERVED_NAMES | +a comma-separated list of names which applications cannot reserve for routing (default: “drycc, drycc-builder”) | +
DRYCC_DEPLOY_HOOK_URLS | +a comma-separated list of URLs to send deploy hooks to. | +
DRYCC_DEPLOY_HOOK_SECRET_KEY | +a private key used to compute the HMAC signature for deploy hooks. | +
DRYCC_DEPLOY_REJECT_IF_PROCFILE_MISSING | +rejects a deploy if the previous build had a Procfile but the current deploy is missing it. A 409 is thrown in the API. Prevents accidental process types removal. (default: “false”, allowed values: “true”, “false”) | +
DRYCC_DEPLOY_PROCFILE_MISSING_REMOVE | +when turned on (default) any missing process type in a Procfile compared to the previous deploy is removed. When set to false will allow an empty Procfile to go through without removing missing process types, note that new images, configs and so on will get updated on all proc types. (default: “true”, allowed values: “true”, “false”) | +
DRYCC_DEFAULT_CONFIG_TAGS | +set tags for all applications by default, for example: ‘{“role”: “worker”}’. (default: ‘’) | +
KUBERNETES_NAMESPACE_DEFAULT_QUOTA_SPEC | +set resource quota to application namespace by setting ResourceQuota spec, for example: {"spec":{"hard":{"pods":"10"}}} , restrict app owner to spawn more then 10 pods (default: “”, no quota will be applied to namespace) |
+
Configuration options for LDAP authentication are detailed here.
+The following environment variables are available for enabling LDAP +authentication of user accounts in the Passport component:
+Setting | +Description | +
---|---|
LDAP_ENDPOINT | +The URI of the LDAP server. If not specified, LDAP authentication is not enabled (default: “”, example: ldap://hostname ). |
+
LDAP_BIND_DN | +The distinguished name to use when binding to the LDAP server (default: “”) | +
LDAP_BIND_PASSWORD | +The password to use with LDAP_BIND_DN (default: “”) | +
LDAP_USER_BASEDN | +The distinguished name of the search base for user names (default: “”) | +
LDAP_USER_FILTER | +The name of the login field in the users search base (default: “username”) | +
LDAP_GROUP_BASEDN | +The distinguished name of the search base for user’s groups names (default: “”) | +
LDAP_GROUP_FILTER | +The filter for user’s groups (default: “”, example: objectClass=person ) |
+
Setting | +Description | +
---|---|
DRYCC_DEPLOY_BATCHES | +the number of pods to bring up and take down sequentially during a scale (default: number of available nodes) | +
DRYCC_DEPLOY_TIMEOUT | +deploy timeout in seconds per deploy batch (default: 120) | +
IMAGE_PULL_POLICY | +the kubernetes image pull policy for application images (default: “IfNotPresent”) (allowed values: “Always”, “IfNotPresent”) | +
KUBERNETES_DEPLOYMENTS_REVISION_HISTORY_LIMIT | +how many revisions Kubernetes keeps around of a given Deployment (default: all revisions) | +
KUBERNETES_POD_TERMINATION_GRACE_PERIOD_SECONDS | +how many seconds kubernetes waits for a pod to finish work after a SIGTERM before sending SIGKILL (default: 30) | +
See the Deploying Apps guide for more detailed information on those.
+The following environment variables are tunable for the Database component:
+Setting | +Description | +
---|---|
BACKUP_FREQUENCY | +how often the database should perform a base backup (default: “12h”) | +
BACKUPS_TO_RETAIN | +number of base backups the backing store should retain (default: 5) | +
The following values can be changed in the values.yaml
file or by using the --values
flag with the Helm CLI.
Key | +Description | +
---|---|
config.service | +The service section defines the global properties of the service. | +
config.inputs | +An input section defines a source (related to an input plugin). | +
config.filters | +A filter section defines a filter (related to a filter plugin) | +
config.outputs | +The outputs section specify a destination that certain records should follow after a Tag match. | +
For more information about the various variables that can be set please see the fluentbit.
+The following environment variables are tunable for the Logger component:
+Setting | +Description | +
---|---|
STORAGE_ADAPTER | +How to store logs that are sent to the logger. Legal values are “file”, “memory”, and “redis”. (default: “redis”) | +
NUMBER_OF_LINES | +How many lines to store in the ring buffer (default: 1000) | +
We have exposed some of the more useful configuration values directly in the chart. This allows them to be set using either the values.yaml
file or by using the --set
flag with the Helm CLI. You can see these options below:
Setting | +Default Value | +Description | +
---|---|---|
user | +“admin” | +The first user created in the database (this user has admin privileges) | +
password | +“admin” | +Password for the first user. | +
allow_sign_up | +“true” | +Allows users to sign up for an account. | +
For a list of other options you can set by using environment variables please see the configuration file in Github.
+For a list of configuration values that can be set by using environment variables please see the following configuration file.
+You can find a list of values that can be set using environment variables here.
+The Registry component can be tuned by following the +drycc/distribution config doc.
+The majority of router settings are tunable through annotations, which allows the router to be +re-configured with zero downtime post-installation. You can find the list of annotations to tune +here.
+The following environment variables are tunable for the [Router][] component:
+Setting | +Description | +
---|---|
POD_NAMESPACE | +The pod namespace the router resides in. This is set by the Kubernetes downward API. | +
The following environment variables are tunable for [Workflow Manager][]:
+Setting | +Description | +
---|---|
CHECK_VERSIONS | +Enables the external version check at https://versions.drycc.info/ (default: “true”) | +
POLL_INTERVAL_SEC | +The interval when Workflow Manager performs a version check, in seconds (default: 43200, or 12 hours) | +
VERSIONS_API_URL | +The versions API URL (default: “https://versions-staging.drycc.info”) | +
DOCTOR_API_URL | +The doctor API URL (default: “https://doctor-staging.drycc.info”) | +
API_VERSION | +The version number Workflow Manager sends to the versions API (default: “v2”) | +
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+This upgrade process requires:
+!!! note +If upgrading from a Helm Classic install, you’ll need to ‘migrate’ the cluster to a Kubernetes Helm installation. See Workflow-Migration for steps.
+Helm will remove all components from the previous release. Traffic to applications deployed through +Workflow will continue to flow during the upgrade. No service interruptions should occur.
+If Workflow is not configured to use off-cluster Postgres, the Workflow API will experience a brief +period of downtime while the database recovers from backup.
+First, find the name of the release helm gave to your deployment with helm ls
, then run
$ helm upgrade <release-name> oci://registry.drycc.cc/charts/workflow
+
Note: If using off-cluster object storage on gcs and/or off-cluster registry using gcr and intending to upgrade from a pre-v2.10.0
chart to v2.10.0
or greater, the key_json
values will now need to be pre-base64-encoded. Therefore, assuming the rest of the custom/off-cluster values are defined in the existing values.yaml
used for previous installs, the following may be run:
$ B64_KEY_JSON="$(cat ~/path/to/key.json | base64 -w 0)"
+$ helm upgrade <release_name> drycc/workflow -f values.yaml --set gcs.key_json="${B64_KEY_JSON}",registry-token-refresher.gcr.key_json="${B64_KEY_JSON}"
+
Alternatively, simply replace the appropriate values in values.yaml and do without the --set
+parameter. Make sure to wrap it in single quotes as double quotes will give a parser error when
+upgrading.
Verify that all components have started and passed their readiness checks:
+$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-2448122224-3cibz 1/1 Running 0 5m
+drycc-controller-1410285775-ipc34 1/1 Running 3 5m
+drycc-controller-celery-694f75749b-cmxxn 3/3 Running 0 5m
+drycc-database-e7c5z 1/1 Running 0 5m
+drycc-logger-cgjup 1/1 Running 3 5m
+drycc-logger-fluentbit-45h7j 1/1 Running 0 5m
+drycc-logger-fluentbit-4z7lw 1/1 Running 0 5m
+drycc-logger-fluentbit-k2wsw 1/1 Running 0 5m
+drycc-logger-fluentbit-skdw4 1/1 Running 0 5m
+drycc-redis-8nazu 1/1 Running 0 5m
+drycc-monitor-grafana-tm266 1/1 Running 0 5m
+drycc-monitor-telegraf-51zel 1/1 Running 1 5m
+drycc-monitor-telegraf-cdasg 1/1 Running 0 5m
+drycc-monitor-telegraf-hea6x 1/1 Running 0 5m
+drycc-monitor-telegraf-r7lsg 1/1 Running 0 5m
+drycc-registry-1814324048-yomz5 1/1 Running 0 5m
+drycc-registry-proxy-4m3o4 1/1 Running 0 5m
+drycc-registry-proxy-no3r1 1/1 Running 0 5m
+drycc-registry-proxy-ou8is 1/1 Running 0 5m
+drycc-registry-proxy-zyajl 1/1 Running 0 5m
+drycc-rabbitmq-0 1/1 Running 0 5m
+
Users of Drycc Workflow should now upgrade their drycc client to avoid getting WARNING: Client and server API versions do not match. Please consider upgrading.
warnings.
curl -sfL https://www.drycc.cc/install-cli.sh | bash - && sudo mv drycc $(which drycc)
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+Get started with Drycc Workflow in three easy steps.
+This guide will help you set up a cluster suitable for evaluation, development and testing. When you are ready for staging and production, view our production checklist.
+For the quickstart we will install Drycc Workflow.
+For the quickstart we will install Drycc Workflow CLI.
+Last but not least, login and deploy your first application.
+ +If you have a pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop. Then this chapter is very suitable for you.
+Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:
+If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.
+Some basic software needs to be installed before installing drycc workflow.
+K8s requires a large number of ports. If you are not sure what they are, please close the local firewall or open these ports. +At the same time, because k8s you need system time, you need to ensure that the system time is correct.
+The command used to install a NFSv4 client differs depending on the Linux distribution.
+For Debian and Ubuntu, use this command:
+$ apt-get install nfs-common
+
For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:
+$ yum install nfs-utils
+
For Debian and Ubuntu, use this command:
+$ apt-get install curl
+
For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:
+$ yum install curl
+
Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.
+This configuration only contains the minimum requirements that can meet the operation.
+Drycc performance depends on the performance of the database. To ensure optimal speed, we recommend using an SSD when possible. Disk performance will vary on ARM devices utilizing an SD card or eMMC.
+Drycc needs a root domain name under your full control and points this domain name to the server to be installed.
+Suppose there is a wildcard domain pointing to the current server to install drycc, which is the name *.dryccdoman.com
.
+We need to set the PLATFORM_DOMAIN
environment variables before installation.
$ export PLATFORM_DOMAIN=dryccdoman.co
+
Of course, if it is a test environment, we can also use nip.io
, an IP to domain name service.
+For example, your host IP is 59.46.3.190
, we will get the following domain name 59.46.3.190.nip.io
$ export PLATFORM_DOMAIN=59.46.3.190.nip.io
+
Before installation, please make sure whether your installation environment is a public network. +If it is an intranet environment and there is no public IP, you need to disable the automatic certificate.
+$ export CERT_MANAGER_ENABLED=false
+
Then you can use the installation script available at https://www.drycc.cc/install.sh to install drycc as a service on systemd and openrc based systems.
+$ curl -sfL https://www.drycc.cc/install.sh | bash -
+
!!! important +If you are in China, you need to use mirror acceleration:
+```
+$ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash -
+```
+
+Node can be a simple agent or a server; Server has the function of agent. Multiple servers have high availability, but the number of servers should not +exceed 7 at most. There is no limit to the number of agents.
+$ cat /var/lib/rancher/k3s/server/node-token
+K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa
+
We assume that the IP address of the cluster master is 192.168.6.240
, in that way.
$ export K3S_URL=https://192.168.6.240:6443
+$ export K3S_TOKEN="K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa"
+
!!! important +If you are in China, you need to use mirror acceleration:
+```
+$ export INSTALL_DRYCC_MIRROR=cn
+```
+
+$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent
+
When using this method to install drycc, the following environment variables can be used to configure the installation:
+ENVIRONMENT VARIABLE | +DESCRIPTION | +
---|---|
PLATFORM_DOMAIN | +Required item, specify drycc’s domain name | +
DRYCC_ADMIN_USERNAME | +Required item, specify drycc’s admin username | +
DRYCC_ADMIN_PASSWORD | +Required item, specify drycc’s admin password | +
CERT_MANAGER_ENABLED | +Whether to use automatic certificate. It is false by default |
+
CHANNEL | +By default, stable channel will be installed. You can also specify testing |
+
REGISTRY_FILE | +The config.yaml file path used by k3s containers registry |
+
KUBERNETES_SERVICE_HOST | +Set with the HOST of the loadbalancer that was in front of kube-apiserver | +
KUBERNETES_SERVICE_PORT | +Set with the PORT of the loadbalancer that was in front of kube-apiserver | +
METALLB_CONFIG_FILE | +The metallb config file path, layer 2 network is used by default | +
INSTALL_DRYCC_MIRROR | +Specify the accelerated mirror location. Currently, only cn is supported |
+
BUILDER_REPLICAS | +Number of builder replicas to deploy | +
CONTROLLER_API_REPLICAS | +Number of controller api replicas to deploy | +
CONTROLLER_CELERY_REPLICAS | +Number of controller celery replicas to deploy | +
CONTROLLER_WEBHOOK_REPLICAS | +Number of controller webhook replicas to deploy | +
CONTROLLER_APP_RUNTIME_CLASS | +RuntimeClass is a feature for selecting the container runtime configuration. | +
CONTROLLER_APP_STORAGE_CLASS | +StorageClass allocated by drycc volumes ; default storageClass is used by default |
+
REDIS_REPLICAS | +Number of redis replicas to deploy | +
REDIS_PERSISTENCE_SIZE | +The size of the persistence space allocated to redis , which is 5Gi by default |
+
REDIS_PERSISTENCE_STORAGE_CLASS | +StorangeClass of redis ; default storangeclass is used by default |
+
STORAGE_CSI_STATEFULSET_REPLICAS | +Number of storage csi controller replicas to deploy | +
STORAGE_MAINNODE_TIPD_REPLICAS | +Number of storage mainode tipd replicas to deploy | +
STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE | +The size of the persistence space allocated to mainnode tipd , which is 10Gi by default |
+
STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode tipd ; default storangeclass is used by default |
+
STORAGE_MAINNODE_WEED_REPLICAS | +Number of storage mainode weed replicas to deploy | +
STORAGE_MAINNODE_WEED_PREALLOCATE | +Preallocate disk space for volumes, false is used by default |
+
STORAGE_MAINNODE_WEED_SIZE_LIMIT_MB | +Master stops directing writes to oversized volumes, 30000 is used by default |
+
STORAGE_MAINNODE_WEED_DEFAULT_REPLICATION | +default replication type if not specified, which is 000 by default |
+
STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to mainnode weed , which is 10Gi by default |
+
STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode weed ; default storangeclass is used by default |
+
STORAGE_METANODE_TIKV_REPLICAS | +Number of storage metanode tikv replicas to deploy | +
STORAGE_METANODE_TIKV_PERSISTENCE_SIZE | +The size of the persistence space allocated to metanode tikv , which is 10Gi by default |
+
STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode tikv ; default storangeclass is used by default |
+
STORAGE_METANODE_WEED_REPLICAS | +Number of storage metanode weed replicas to deploy | +
STORAGE_METANODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to metanode weed , which is 10Gi by default |
+
STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode weed ; default storangeclass is used by default |
+
STORAGE_DATANODE_WEED_REPLICAS | +Number of storage datanode weed replicas to deploy | +
STORAGE_DATANODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to datanode weed , which is 20Gi by default |
+
STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of datanode weed ; default storangeclass is used by default |
+
MONITOR_GRAFANA_PERSISTENCE_SIZE | +The size of the persistence space allocated to monitor.grafana , which is 5Gi by default |
+
MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS | +StorangeClass of monitor grafana; default storangeclass is used by default |
+
LOGGER_REPLICAS | +Number of logger replicas to deploy | +
RABBITMQ_REPLICAS | +Number of rabbitmq replicas to deploy | +
RABBITMQ_PERSISTENCE_SIZE | +The size of the persistence space allocated to rabbitmq , which is 5Gi by default |
+
RABBITMQ_PERSISTENCE_STORAGE_CLASS | +StorangeClass of rabbitmq ; default storangeclass is used by default |
+
DATABASE_REPLICAS | +Number of database replicas to deploy | +
DATABASE_PERSISTENCE_SIZE | +The size of the persistence space allocated to database , which is 5Gi by default |
+
DATABASE_PERSISTENCE_STORAGE_CLASS | +StorangeClass of database ; default storangeclass is used by default |
+
TIMESERIES_REPLICAS | +Number of timeseries replicas to deploy | +
TIMESERIES_PERSISTENCE_SIZE | +The size of the persistence space allocated to timeseries , which is 5Gi by default |
+
TIMESERIES_PERSISTENCE_STORAGE_CLASS | +StorangeClass of timeseries ; default storangeclass is used by default |
+
PASSPORT_REPLICAS | +Number of passport replicas to deploy | +
REGISTRY_REPLICAS | +Number of registry replicas to deploy | +
HELMBROKER_REPLICAS | +Number of helmbroker api replicas to deploy | +
HELMBROKER_CELERY_REPLICAS | +Number of helmbroker celery replicas to deploy | +
HELMBROKER_PERSISTENCE_SIZE | +The size of the persistence space allocated to helmbroker , which is 5Gi by default |
+
HELMBROKER_PERSISTENCE_STORAGE_CLASS | +StorangeClass of helmbroker ; default storangeclass is used by default |
+
PROMETHEUS_SERVER_RETENTION | +Prometheus data retention period (default if not specified is 15 days) | +
PROMETHEUS_SERVER_PERSISTENCE_SIZE | +The size of the persistence space allocated to prometheus-server , which is 10Gi by default |
+
PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS | +StorangeClass of prometheus-server ; default storangeclass is used by default |
+
K3S_DATA_DIR | +The config of k3s data dir; If not set, the default path is used | +
ACME_SERVER | +ACME Server url, default use letsencrypt | +
ACME_EAB_KEY_ID | +The key ID of which your external account binding is indexed by the external account | +
ACME_EAB_KEY_SECRET | +The key Secret of which your external account symmetric MAC key | +
Since the installation script will install k3s, other environment variables can refer to k3s installation environment variables.
+If you installed drycc using an installation script, you can uninstall the entire drycc using this script.
+$ curl -sfL https://www.drycc.cc/uninstall.sh | bash -
+
+The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. +Use the CLI to create and configure and manage applications.
+Install the drycc
client for Linux or Mac OS X with:
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+
!!! important +Users in Chinese mainland can use the following methods to speed up installation:
+```
+$ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash -
+```
+
+Others please visit: https://github.com/drycc/workflow-cli/releases
+The installer places the drycc
binary in your current directory, but you
+should move it somewhere in your $PATH:
$ sudo ln -fs $PWD/drycc /usr/local/bin/drycc
+
or:
+$ sudo mv $PWD/drycc /usr/local/bin/drycc
+
Check your work by running drycc version
:
$ drycc version
+v1.1.0
+
Update workflow cli to latest release.
+drycc update
+
!!! note +Note that version numbers may vary as new releases become available
+ +Drycc workflow requires a wildcard DNS record to dynamically map app names to the router.
+User should already have DNS set up pointing to their known host. The $hostname
value can be calculated by prepending drycc.
to the value set in global.platformDomain
.
Workflow use the passport component to create and authorize users.
+If you already have an account, use drycc login
to authenticate against the Drycc Workflow API.
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+
Or you can login with username and password
+$ drycc login http://drycc.example.com --username=demo --password=demo
+Configuration file written to /root/.drycc/client.json
+
Drycc Workflow supports three different types of applications, Buildpacks, +Dockerfiles and Container Images. Our first application will be a simple Container +Image-based application, so you don’t have to wrestle with checking out code.
+Run drycc create
to create a new application on Drycc Workflow. If you do not
+specify a name for your application, Workflow automatically generates a
+friendly (and sometimes funny) name.
$ drycc create --no-remote
+Creating Application... done, created proper-barbecue
+If you want to add a git remote for this app later, use `drycc git:remote -a proper-barbecue`
+
Our application has been created and named proper-barbecue
. As with the
+drycc
hostname, any HTTP traffic to proper-barbecue
will be automatically
+routed to your application pods by the edge router.
Let’s use the CLI to tell the platform to deploy an application and then use curl to send a request to the app:
+$ drycc pull drycc/example-go -a proper-barbecue
+Creating build... done
+$ curl http://proper-barbecue.$hostname
+Powered by Drycc
+
!!! note
+If you see a 404 error, make sure you specified your application name with -a <appname>
!
Workflow’s edge router knows all about application names and automatically
+sends traffic to the right application. The router sends traffic for
+proper-barbecue.104.197.125.75.nip.io
to your app, just like
+drycc.104.197.125.75.nip.io
was sent to the Workflow API service.
Next, let’s change some configuration using the CLI. Our example app is built
+to read configuration from the environment. By using drycc config:set
we can
+change how the application behaves:
$ drycc config:set POWERED_BY="Container Images + Kubernetes" -a proper-barbecue
+Creating config... done
+
+UUID OWNER NAME VALUE
+04bb6e45-9221-4843-a1f9-acc7fded3b06 dev POWERED_BY Container Images + Kubernetes
+
Behind the scenes, Workflow creates a new release for your application and uses +Kubernetes to provide a zero-downtime rolling deploy to the new release!
+Validate that our configuration change has worked:
+$ curl http://proper-barbecue.104.197.125.75.nip.io
+Powered by Container Images + Kubernetes
+
Last, let’s scale our application by adding more application processes. Using the CLI you can easily add and remove +additional processes to service requests:
+$ drycc scale web=2 -a proper-barbecue
+Scaling processes... but first, coffee!
+done in 36s
+
+NAME RELEASE STATE PTYPE STARTED
+proper-barbecue-v18-web-rk644 v18 up web 2023-12-08T03:09:25UTC
+proper-barbecue-v18-web-0ag04 v18 up web 2023-12-08T03:09:25UTC
+
Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow.
+There is a lot more you can do with Drycc Workflow, play around with the CLI:
+!!! important +In order to have permission to push an app you must add a SSH key to your user on the Drycc Workflow. +For more information, please check Users and SSH Keys and Troubleshooting Workflow.
+drycc rollback -a proper-barbecue
drycc logs -a proper-barbecue
3 minute read
+Drycc workflow requires a wildcard DNS record to dynamically map app names to the router.
+User should already have DNS set up pointing to their known host. The $hostname
value can be calculated by prepending drycc.
to the value set in global.platformDomain
.
Workflow use the passport component to create and authorize users.
+If you already have an account, use drycc login
to authenticate against the Drycc Workflow API.
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as admin
+Configuration file written to /root/.drycc/client.json
+
Or you can login with username and password
+$ drycc login http://drycc.example.com --username=demo --password=demo
+Configuration file written to /root/.drycc/client.json
+
Drycc Workflow supports three different types of applications, Buildpacks, +Dockerfiles and Container Images. Our first application will be a simple Container +Image-based application, so you don’t have to wrestle with checking out code.
+Run drycc create
to create a new application on Drycc Workflow. If you do not
+specify a name for your application, Workflow automatically generates a
+friendly (and sometimes funny) name.
$ drycc create --no-remote
+Creating Application... done, created proper-barbecue
+If you want to add a git remote for this app later, use `drycc git:remote -a proper-barbecue`
+
Our application has been created and named proper-barbecue
. As with the
+drycc
hostname, any HTTP traffic to proper-barbecue
will be automatically
+routed to your application pods by the edge router.
Let’s use the CLI to tell the platform to deploy an application and then use curl to send a request to the app:
+$ drycc pull drycc/example-go -a proper-barbecue
+Creating build... done
+$ curl http://proper-barbecue.$hostname
+Powered by Drycc
+
!!! note
+If you see a 404 error, make sure you specified your application name with -a <appname>
!
Workflow’s edge router knows all about application names and automatically
+sends traffic to the right application. The router sends traffic for
+proper-barbecue.104.197.125.75.nip.io
to your app, just like
+drycc.104.197.125.75.nip.io
was sent to the Workflow API service.
Next, let’s change some configuration using the CLI. Our example app is built
+to read configuration from the environment. By using drycc config:set
we can
+change how the application behaves:
$ drycc config:set POWERED_BY="Container Images + Kubernetes" -a proper-barbecue
+Creating config... done
+
+UUID OWNER NAME VALUE
+04bb6e45-9221-4843-a1f9-acc7fded3b06 dev POWERED_BY Container Images + Kubernetes
+
Behind the scenes, Workflow creates a new release for your application and uses +Kubernetes to provide a zero-downtime rolling deploy to the new release!
+Validate that our configuration change has worked:
+$ curl http://proper-barbecue.104.197.125.75.nip.io
+Powered by Container Images + Kubernetes
+
Last, let’s scale our application by adding more application processes. Using the CLI you can easily add and remove +additional processes to service requests:
+$ drycc scale web=2 -a proper-barbecue
+Scaling processes... but first, coffee!
+done in 36s
+
+NAME RELEASE STATE PTYPE STARTED
+proper-barbecue-v18-web-rk644 v18 up web 2023-12-08T03:09:25UTC
+proper-barbecue-v18-web-0ag04 v18 up web 2023-12-08T03:09:25UTC
+
Congratulations! You have deployed, configured, and scaled your first application using Drycc Workflow.
+There is a lot more you can do with Drycc Workflow, play around with the CLI:
+!!! important +In order to have permission to push an app you must add a SSH key to your user on the Drycc Workflow. +For more information, please check Users and SSH Keys and Troubleshooting Workflow.
+drycc rollback -a proper-barbecue
drycc logs -a proper-barbecue
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+This guide helps you set up the Drycc workflow.
+Install Workflow in pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop.
+How to download, install Drycc CLI tools.
+Deploy an application using drycc cli.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+The Drycc command-line interface (CLI), lets you interact with Drycc Workflow. +Use the CLI to create and configure and manage applications.
+Install the drycc
client for Linux or Mac OS X with:
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+
!!! important +Users in Chinese mainland can use the following methods to speed up installation:
+```
+$ curl -sfL https://www.drycc.cc/install-cli.sh | INSTALL_DRYCC_MIRROR=cn bash -
+```
+
+Others please visit: https://github.com/drycc/workflow-cli/releases
+The installer places the drycc
binary in your current directory, but you
+should move it somewhere in your $PATH:
$ sudo ln -fs $PWD/drycc /usr/local/bin/drycc
+
or:
+$ sudo mv $PWD/drycc /usr/local/bin/drycc
+
Check your work by running drycc version
:
$ drycc version
+v1.1.0
+
Update workflow cli to latest release.
+drycc update
+
!!! note +Note that version numbers may vary as new releases become available
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+7 minute read
+If you have a pure host, it can be a cloud server, bare metal server, virtual machine, or even your laptop. Then this chapter is very suitable for you.
+Drycc is expected to work on most modern Linux systems. Some OSS have specific requirements:
+If you want to add more Linux distribution support, please submit a issue on github or submit PR directly.
+Some basic software needs to be installed before installing drycc workflow.
+K8s requires a large number of ports. If you are not sure what they are, please close the local firewall or open these ports. +At the same time, because k8s you need system time, you need to ensure that the system time is correct.
+The command used to install a NFSv4 client differs depending on the Linux distribution.
+For Debian and Ubuntu, use this command:
+$ apt-get install nfs-common
+
For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:
+$ yum install nfs-utils
+
For Debian and Ubuntu, use this command:
+$ apt-get install curl
+
For RHEL, CentOS, and EKS with EKS Kubernetes Worker AMI with AmazonLinux2 image, use this command:
+$ yum install curl
+
Hardware requirements scale based on the size of your deployments. Minimum recommendations are outlined here.
+This configuration only contains the minimum requirements that can meet the operation.
+Drycc performance depends on the performance of the database. To ensure optimal speed, we recommend using an SSD when possible. Disk performance will vary on ARM devices utilizing an SD card or eMMC.
+Drycc needs a root domain name under your full control and points this domain name to the server to be installed.
+Suppose there is a wildcard domain pointing to the current server to install drycc, which is the name *.dryccdoman.com
.
+We need to set the PLATFORM_DOMAIN
environment variables before installation.
$ export PLATFORM_DOMAIN=dryccdoman.co
+
Of course, if it is a test environment, we can also use nip.io
, an IP to domain name service.
+For example, your host IP is 59.46.3.190
, we will get the following domain name 59.46.3.190.nip.io
$ export PLATFORM_DOMAIN=59.46.3.190.nip.io
+
Before installation, please make sure whether your installation environment is a public network. +If it is an intranet environment and there is no public IP, you need to disable the automatic certificate.
+$ export CERT_MANAGER_ENABLED=false
+
Then you can use the installation script available at https://www.drycc.cc/install.sh to install drycc as a service on systemd and openrc based systems.
+$ curl -sfL https://www.drycc.cc/install.sh | bash -
+
!!! important +If you are in China, you need to use mirror acceleration:
+```
+$ curl -sfL https://www.drycc.cc/install.sh | INSTALL_DRYCC_MIRROR=cn bash -
+```
+
+Node can be a simple agent or a server; Server has the function of agent. Multiple servers have high availability, but the number of servers should not +exceed 7 at most. There is no limit to the number of agents.
+$ cat /var/lib/rancher/k3s/server/node-token
+K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa
+
We assume that the IP address of the cluster master is 192.168.6.240
, in that way.
$ export K3S_URL=https://192.168.6.240:6443
+$ export K3S_TOKEN="K1078e7213ca32bdaabb44536f14b9ce7926bb201f41c3f3edd39975c16ff4901ea::server:33bde27f-ac49-4483-b6ac-f4eec2c6dbfa"
+
!!! important +If you are in China, you need to use mirror acceleration:
+```
+$ export INSTALL_DRYCC_MIRROR=cn
+```
+
+$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_server
+
$ curl -sfL https://www.drycc.cc/install.sh | bash -s - install_k3s_agent
+
When using this method to install drycc, the following environment variables can be used to configure the installation:
+ENVIRONMENT VARIABLE | +DESCRIPTION | +
---|---|
PLATFORM_DOMAIN | +Required item, specify drycc’s domain name | +
DRYCC_ADMIN_USERNAME | +Required item, specify drycc’s admin username | +
DRYCC_ADMIN_PASSWORD | +Required item, specify drycc’s admin password | +
CERT_MANAGER_ENABLED | +Whether to use automatic certificate. It is false by default |
+
CHANNEL | +By default, stable channel will be installed. You can also specify testing |
+
REGISTRY_FILE | +The config.yaml file path used by k3s containers registry |
+
KUBERNETES_SERVICE_HOST | +Set with the HOST of the loadbalancer that was in front of kube-apiserver | +
KUBERNETES_SERVICE_PORT | +Set with the PORT of the loadbalancer that was in front of kube-apiserver | +
METALLB_CONFIG_FILE | +The metallb config file path, layer 2 network is used by default | +
INSTALL_DRYCC_MIRROR | +Specify the accelerated mirror location. Currently, only cn is supported |
+
BUILDER_REPLICAS | +Number of builder replicas to deploy | +
CONTROLLER_API_REPLICAS | +Number of controller api replicas to deploy | +
CONTROLLER_CELERY_REPLICAS | +Number of controller celery replicas to deploy | +
CONTROLLER_WEBHOOK_REPLICAS | +Number of controller webhook replicas to deploy | +
CONTROLLER_APP_RUNTIME_CLASS | +RuntimeClass is a feature for selecting the container runtime configuration. | +
CONTROLLER_APP_STORAGE_CLASS | +StorageClass allocated by drycc volumes ; default storageClass is used by default |
+
REDIS_REPLICAS | +Number of redis replicas to deploy | +
REDIS_PERSISTENCE_SIZE | +The size of the persistence space allocated to redis , which is 5Gi by default |
+
REDIS_PERSISTENCE_STORAGE_CLASS | +StorangeClass of redis ; default storangeclass is used by default |
+
STORAGE_CSI_STATEFULSET_REPLICAS | +Number of storage csi controller replicas to deploy | +
STORAGE_MAINNODE_TIPD_REPLICAS | +Number of storage mainode tipd replicas to deploy | +
STORAGE_MAINNODE_TIPD_PERSISTENCE_SIZE | +The size of the persistence space allocated to mainnode tipd , which is 10Gi by default |
+
STORAGE_MAINNODE_TIPD_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode tipd ; default storangeclass is used by default |
+
STORAGE_MAINNODE_WEED_REPLICAS | +Number of storage mainode weed replicas to deploy | +
STORAGE_MAINNODE_WEED_PREALLOCATE | +Preallocate disk space for volumes, false is used by default |
+
STORAGE_MAINNODE_WEED_SIZE_LIMIT_MB | +Master stops directing writes to oversized volumes, 30000 is used by default |
+
STORAGE_MAINNODE_WEED_DEFAULT_REPLICATION | +default replication type if not specified, which is 000 by default |
+
STORAGE_MAINNODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to mainnode weed , which is 10Gi by default |
+
STORAGE_MAINNODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode weed ; default storangeclass is used by default |
+
STORAGE_METANODE_TIKV_REPLICAS | +Number of storage metanode tikv replicas to deploy | +
STORAGE_METANODE_TIKV_PERSISTENCE_SIZE | +The size of the persistence space allocated to metanode tikv , which is 10Gi by default |
+
STORAGE_METANODE_TIKV_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode tikv ; default storangeclass is used by default |
+
STORAGE_METANODE_WEED_REPLICAS | +Number of storage metanode weed replicas to deploy | +
STORAGE_METANODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to metanode weed , which is 10Gi by default |
+
STORAGE_METANODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of mainnode weed ; default storangeclass is used by default |
+
STORAGE_DATANODE_WEED_REPLICAS | +Number of storage datanode weed replicas to deploy | +
STORAGE_DATANODE_WEED_PERSISTENCE_SIZE | +The size of the persistence space allocated to datanode weed , which is 20Gi by default |
+
STORAGE_DATANODE_WEED_PERSISTENCE_STORAGE_CLASS | +StorangeClass of datanode weed ; default storangeclass is used by default |
+
MONITOR_GRAFANA_PERSISTENCE_SIZE | +The size of the persistence space allocated to monitor.grafana , which is 5Gi by default |
+
MONITOR_GRAFANA_PERSISTENCE_STORAGE_CLASS | +StorangeClass of monitor grafana; default storangeclass is used by default |
+
LOGGER_REPLICAS | +Number of logger replicas to deploy | +
RABBITMQ_REPLICAS | +Number of rabbitmq replicas to deploy | +
RABBITMQ_PERSISTENCE_SIZE | +The size of the persistence space allocated to rabbitmq , which is 5Gi by default |
+
RABBITMQ_PERSISTENCE_STORAGE_CLASS | +StorangeClass of rabbitmq ; default storangeclass is used by default |
+
DATABASE_REPLICAS | +Number of database replicas to deploy | +
DATABASE_PERSISTENCE_SIZE | +The size of the persistence space allocated to database , which is 5Gi by default |
+
DATABASE_PERSISTENCE_STORAGE_CLASS | +StorangeClass of database ; default storangeclass is used by default |
+
TIMESERIES_REPLICAS | +Number of timeseries replicas to deploy | +
TIMESERIES_PERSISTENCE_SIZE | +The size of the persistence space allocated to timeseries , which is 5Gi by default |
+
TIMESERIES_PERSISTENCE_STORAGE_CLASS | +StorangeClass of timeseries ; default storangeclass is used by default |
+
PASSPORT_REPLICAS | +Number of passport replicas to deploy | +
REGISTRY_REPLICAS | +Number of registry replicas to deploy | +
HELMBROKER_REPLICAS | +Number of helmbroker api replicas to deploy | +
HELMBROKER_CELERY_REPLICAS | +Number of helmbroker celery replicas to deploy | +
HELMBROKER_PERSISTENCE_SIZE | +The size of the persistence space allocated to helmbroker , which is 5Gi by default |
+
HELMBROKER_PERSISTENCE_STORAGE_CLASS | +StorangeClass of helmbroker ; default storangeclass is used by default |
+
PROMETHEUS_SERVER_RETENTION | +Prometheus data retention period (default if not specified is 15 days) | +
PROMETHEUS_SERVER_PERSISTENCE_SIZE | +The size of the persistence space allocated to prometheus-server , which is 10Gi by default |
+
PROMETHEUS_SERVER_PERSISTENCE_STORAGE_CLASS | +StorangeClass of prometheus-server ; default storangeclass is used by default |
+
K3S_DATA_DIR | +The config of k3s data dir; If not set, the default path is used | +
ACME_SERVER | +ACME Server url, default use letsencrypt | +
ACME_EAB_KEY_ID | +The key ID of which your external account binding is indexed by the external account | +
ACME_EAB_KEY_SECRET | +The key Secret of which your external account symmetric MAC key | +
Since the installation script will install k3s, other environment variables can refer to k3s installation environment variables.
+If you installed drycc using an installation script, you can uninstall the entire drycc using this script.
+$ curl -sfL https://www.drycc.cc/uninstall.sh | bash -
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Get started with Drycc Workflow in three easy steps.
+This guide will help you set up a cluster suitable for evaluation, development and testing. When you are ready for staging and production, view our production checklist.
+For the quickstart we will install Drycc Workflow.
+For the quickstart we will install Drycc Workflow CLI.
+Last but not least, login and deploy your first application.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+When using the app ssl feature for non-production applications or when installing SSL for the platform, you can avoid the costs associated with the SSL certificate by using a self-signed SSL certificate. Though the certificate implements full encryption, visitors to your site will see a browser warning indicating that the certificate should not be trusted.
+The openssl library is required to generate your own certificate. Run the following command in your local environment to see if you already have openssl installed.
+$ which openssl
+/usr/bin/openssl
+
+If the which command does not return a path then you will need to install openssl yourself:
+If you have… | +Install with… | +
---|---|
Mac OS X | +Homebrew: brew install openssl |
+
Windows | +complete package .exe installed | +
Ubuntu Linux | +apt-get install openssl |
+
A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a “challenge password”, just press return, leaving the password empty.
+$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
+...
+$ openssl rsa -passin pass:x -in server.pass.key -out server.key
+writing RSA key
+$ rm server.pass.key
+$ openssl req -new -key server.key -out server.csr
+...
+Country Name (2 letter code) [AU]:US
+State or Province Name (full name) [Some-State]:California
+...
+A challenge password []:
+...
+
+The self-signed SSL certificate is generated from the server.key private key and server.csr files.
+$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
+
+The server.crt file is your site certificate suitable for use with Drycc’s SSL endpoint along with the server.key private key.
+ +New! format of POST /v2/apps/<app id>/run
has changed.
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 3
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+New! healthcheck
field in configuration, deprecates the HEALTHCHECK_*
environment variables.
New! Unsetting a configuration variable that does not exist will return a 422.
+New! Creating an identical sequential release returns a 409 rather than create a no-op release.
+Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+New! /v2/auth/whoami
endpoint
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+New! /v2/apps/{name}/logs
endpoint was fixed and no longer returns b'log data'
and instead returns a normal string log data
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+POST /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "https_enforced": true
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "app": "example-go",
+ "owner": "test",
+ "https_enforced": true,
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "app": "example-go",
+ "owner": "test",
+ "https_enforced": false,
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+10 minute read
+New! format of POST /v2/apps/<app id>/run
has changed.
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 3
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+X-Drycc-Release: 4
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.0
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+10 minute read
+New! healthcheck
field in configuration, deprecates the HEALTHCHECK_*
environment variables.
New! Unsetting a configuration variable that does not exist will return a 422.
+New! Creating an identical sequential release returns a 409 rather than create a no-op release.
+Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.1
+DRYCC_PLATFORM_VERSION: 2.1.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+10 minute read
+New! /v2/auth/whoami
endpoint
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22T22:24:20Z",
+ "updated": "2016-06-22T22:24:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "202d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.2
+DRYCC_PLATFORM_VERSION: 2.2.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+10 minute read
+New! /v2/apps/{name}/logs
endpoint was fixed and no longer returns b'log data'
and instead returns a normal string log data
Example Request:
+POST /v2/auth/register/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{
+ "username": "test",
+ "password": "opensesame",
+ "email": "test@example.com"
+}
+
Optional Parameters:
+{
+ "first_name": "test",
+ "last_name": "testerson"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
Example Request:
+POST /v2/auth/login/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+
+{"username": "test", "password": "opensesame"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+DELETE /v2/auth/cancel/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/auth/whoami/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+}
+
++note
+This command could require administrative privileges
+
Example Request:
+POST /v2/auth/tokens/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional Parameters:
+{
+ "username" : "test"
+ "all" : "true"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"token": "abc123"}
+
Example Request:
+POST /v2/auth/passwd/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "password": "foo",
+ "new_password": "bar"
+}
+
Optional parameters:
+{"username": "testuser"}
+
++note
+Using the
+username
parameter requires administrative privileges and makes thepassword
parameter optional.
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
Optional parameters:
+{"id": "example-go"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example-go",
+ "owner": "test",
+ "structure": {},
+ "updated": "2014-01-01T00:00:00UTC",
+ "url": "example-go.example.com",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional parameters:
+{
+ "owner": "test"
+}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 1.8.0
+Content-Type: application/json
+
Example Request:
+GET /v2/apps/example-go/logs/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Optional URL Query Parameters:
+?log_lines=
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: text/plain
+
+"16:51:14 drycc[api]: test created initial release\n"
+
POST /v2/apps/example-go/run/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"command": "echo hi"}
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"exit_code": 0, "output": "hi\n"}
+
Example Request:
+GET /v2/certs HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+ }
+ ]
+}
+
Example Request:
+GET /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+POST /v2/certs/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "name": "foo"
+ "certificate": "-----BEGIN CERTIFICATE-----",
+ "key": "-----BEGIN RSA PRIVATE KEY-----"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "id": 22,
+ "owner": "test",
+ "san": [],
+ "domains": [],
+ "created": "2016-06-22.32.34:20Z",
+ "updated": "2016-06-22.32.34:20Z",
+ "name": "foo",
+ "common_name": "bar.com",
+ "fingerprint": "7A:CA:B8:50:FF:8D:EB:03:3D:AC:AD:13:4F:EE:03:D5:5D:EB:5E:37:51:8C:E0:98:F8:1B:36:2B:20:83:0D:C0",
+ "expires": "2017-01-14T23:57:57Z",
+ "starts": "2016-01-15T23:57:57Z",
+ "issuer": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc",
+ "subject": "/C=US/ST=CA/L=San Francisco/O=Drycc/OU=Engineering/CN=bar.com/emailAddress=engineering@drycc.cc"
+}
+
Example Request:
+DELETE /v2/certs/foo HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+POST /v2/certs/foo/domain/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "domain": "test.com"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+DELETE /v2/certs/foo/domain/test.com/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+POST /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{
+ "https_enforced": true
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "app": "example-go",
+ "owner": "test",
+ "https_enforced": true,
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/tls/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "app": "example-go",
+ "owner": "test",
+ "https_enforced": false,
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/pods/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/pods/web/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "results": [
+ {
+ "name": "go-v2-web-e7dej",
+ "release": "v2",
+ "started": "2014-01-01T00:00:00Z",
+ "state": "up",
+ "type": "web"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/pods/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/web/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/pods/go-v2-web-atots/restart/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+[
+ {
+ "name": "go-v2-web-atots",
+ "release": "v2",
+ "started": "2016-04-11T21:07:54Z",
+ "state": "up",
+ "type": "web"
+ }
+]
+
Example Request:
+POST /v2/apps/example-go/scale/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"web": 3}
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": "world", "PLATFORM": "drycc"}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v3",
+ "HELLO": "world",
+ "PLATFORM": "drycc"
+
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+POST /v2/apps/example-go/config/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"values": {"HELLO": null}}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "owner": "test",
+ "app": "example-go",
+ "values": {
+ "DRYCC_APP": "example-go",
+ "DRYCC_RELEASE": "v4",
+ "PLATFORM": "drycc"
+ },
+ "memory": {},
+ "cpu": {},
+ "tags": {},
+ "healthcheck": {},
+ "created": "2014-01-01T00:00:00UTC",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/domains/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{'domain': 'example.example.com'}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "domain": "example.example.com",
+ "owner": "test",
+ "updated": "2014-01-01T00:00:00UTC"
+}
+
Example Request:
+DELETE /v2/apps/example-go/domains/example.example.com HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "FROM drycc/slugrunner RUN mkdir -p /app WORKDIR /app ENTRYPOINT [\"/runner/init\"] ADD slug.tgz /app ENV GIT_SHA 060da68f654e75fac06dbedd1995d5f8ad9084db",
+ "image": "example-go",
+ "owner": "test",
+ "procfile": {
+ "web": "example-go"
+ },
+ "sha": "060da68f",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/builds/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"image": "drycc/example-go:latest"}
+
Optional Parameters:
+{
+ "procfile": {
+ "web": "./cmd"
+ }
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "created": "2014-01-01T00:00:00UTC",
+ "dockerfile": "",
+ "image": "drycc/example-go:latest",
+ "owner": "test",
+ "procfile": {},
+ "sha": "",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+GET /v2/apps/example-go/releases/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 3,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "app": "example-go",
+ "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "ed637ceb-5d32-44bd-9406-d326a777a513",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test changed nothing",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 3
+ },
+ {
+ "app": "example-go",
+ "build": "2.3d8e4b-600e-4425-a85c-ffc7ea607f61",
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test deployed 060da68",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 2
+ },
+ {
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+ }
+ ]
+}
+
Example Request:
+GET /v2/apps/example-go/releases/v2/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "app": "example-go",
+ "build": null,
+ "config": "95bd6dea-1685-4f78-a03d-fd7270b058d1",
+ "created": "2014-01-01T00:00:00UTC",
+ "owner": "test",
+ "summary": "test created initial release",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
+ "version": 1
+}
+
Example Request:
+POST /v2/apps/example-go/releases/rollback/ HTTP/1.1
+Host: drycc.example.com
+Content-Type: application/json
+Authorization: token abc123
+
+{"version": 1}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{"version": 5}
+
Example Request:
+GET /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "test@example.com",
+ "owner": "test",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+ }
+ ]
+}
+
Example Request:
+POST /v2/keys/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{
+ "id": "example",
+ "public": "ssh-rsa <...>"
+}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "created": "2014-01-01T00:00:00UTC",
+ "id": "example",
+ "owner": "example",
+ "public": "ssh-rsa <...>",
+ "updated": "2014-01-01T00:00:00UTC",
+ "uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
+}
+
Example Request:
+DELETE /v2/keys/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This does not include the app owner.
+
Example Request:
+GET /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "users": [
+ "test",
+ "foo"
+ ]
+}
+
Example Request:
+POST /v2/apps/example-go/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+DELETE /v2/apps/example-go/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
Example Request:
+GET /v2/admin/perms/ HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 2,
+ "next": null
+ "previous": null,
+ "results": [
+ {
+ "username": "test",
+ "is_superuser": true
+ },
+ {
+ "username": "foo",
+ "is_superuser": true
+ }
+ ]
+}
+
++note
+This command requires administrative privileges
+
Example Request:
+POST /v2/admin/perms HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
+{"username": "example"}
+
Example Response:
+HTTP/1.1 201 CREATED
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This command requires administrative privileges
+
Example Request:
+DELETE /v2/admin/perms/example HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 204 NO CONTENT
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+
++note
+This command requires administrative privileges
+
Example Request:
+GET /v2/users HTTP/1.1
+Host: drycc.example.com
+Authorization: token abc123
+
Example Response:
+HTTP/1.1 200 OK
+DRYCC_API_VERSION: 2.3
+DRYCC_PLATFORM_VERSION: 2.3.0
+Content-Type: application/json
+
+{
+ "count": 1,
+ "next": null,
+ "previous": null,
+ "results": [
+ {
+ "id": 1,
+ "last_login": "2014-10-19T22:01:00.601Z",
+ "is_superuser": true,
+ "username": "test",
+ "first_name": "test",
+ "last_name": "testerson",
+ "email": "test@example.com",
+ "is_staff": true,
+ "is_active": true,
+ "date_joined": "2014-10-19T22:01:00.601Z",
+ "groups": [],
+ "user_permissions": []
+ }
+ ]
+}
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+When using the app ssl feature for non-production applications or when installing SSL for the platform, you can avoid the costs associated with the SSL certificate by using a self-signed SSL certificate. Though the certificate implements full encryption, visitors to your site will see a browser warning indicating that the certificate should not be trusted.
+The openssl library is required to generate your own certificate. Run the following command in your local environment to see if you already have openssl installed.
+$ which openssl
+/usr/bin/openssl
+
+If the which command does not return a path then you will need to install openssl yourself:
+If you have… | +Install with… | +
---|---|
Mac OS X | +Homebrew: brew install openssl |
+
Windows | +complete package .exe installed | +
Ubuntu Linux | +apt-get install openssl |
+
A private key and certificate signing request are required to create an SSL certificate. These can be generated with a few simple commands. When the openssl req command asks for a “challenge password”, just press return, leaving the password empty.
+$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
+...
+$ openssl rsa -passin pass:x -in server.pass.key -out server.key
+writing RSA key
+$ rm server.pass.key
+$ openssl req -new -key server.key -out server.csr
+...
+Country Name (2 letter code) [AU]:US
+State or Province Name (full name) [Some-State]:California
+...
+A challenge password []:
+...
+
+The self-signed SSL certificate is generated from the server.key private key and server.csr files.
+$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
+
+The server.crt file is your site certificate suitable for use with Drycc’s SSL endpoint along with the server.key private key.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+A self-signed TLS/SSL certificate is not signed by a publicly trusted certificate authority (CA) but instead by the developer or company that is responsible for the website.
+This is the v2.0 REST API for the Controller.
+This is the v2.1 REST API for the Controller.
+This is the v2.2 REST API for the Controller.
+This is the v2.3 REST API for the Controller.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.
+The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.
+Proposals and issues can be opened by anyone. Every member of the community is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.
+The Roadmap gets delivered progressively via the Release Schedule. Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.
+Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the Release Schedule.
+Release Planning Meetings are open to the public with access coordinated via the Drycc #community Slack channel. +Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.
+Thanks to Amy Lindburg and our friends at Podman for their inspiration.
+ +The Drycc Workflow Roadmap is a community document created as part of the open +Planning Process. Each roadmap item describes a high-level capability or +grouping of features that are deemed important to the future of Drycc.
+Given the project’s rapid Release Schedule, roadmap +items are designed to provide a sense of direction over many releases.
+drycc run /bin/bash
Provide the ability for developers to launch an interactive terminal session in +their application environment.
+Related issues:
+ +Stream application logs via drycc logs -f
https://github.com/drycc/drycc/issues/465
Teams and Permissions represents a more flexible permissions model to allow +more nuanced control to applications, capabilities and resources on the +platform. There have been a number of proposals in this area which need to be +reconciled for Drycc Workflow before we begin implementation.
+Related issues:
+Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +https://github.com/drycc/drycc/issues/231
+Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.
+Drycc uses a continuous delivery approach for creating releases. Every merged commit that passes +testing results in a deliverable that can be given a semantic version tag and shipped.
+The master git
branch of a project should always work. Only changes considered ready to be
+released publicly are merged.
Drycc components release new versions as often as needed. Fixing a high priority bug requires the +project maintainer to create a new patch release. Merging a backward-compatible feature implies +a minor release.
+By releasing often, each component release becomes a safe and routine event. This makes it faster +and easier for users to obtain specific fixes. Continuous delivery also reduces the work +necessary to release a product such as Drycc Workflow, which integrates several components.
+“Components” applies not just to Drycc Workflow projects, but also to development and release +tools, to Container base images, and to other Drycc projects that do semantic version releases.
+See “How to Release a Component” for more detail.
+Drycc Workflow has a regular, public release cadence. From v2.8.0 onward, new Workflow feature +releases arrive on the first Thursday of each month. Patch releases are created at any time, +as needed. GitHub milestones are used to communicate the content and timing of major and minor +releases, and longer-term planning is visible at the Roadmap.
+Workflow release timing is not linked to specific features. If a feature is merged before the +release date, it is included in the next release.
+See “How to Release Workflow” for more detail.
+Drycc releases comply with semantic versioning, with the “public API” broadly +defined as:
+In general, changes to anything a user might reasonably link to, customize, or integrate with +should be backward-compatible, or else require a major release. Drycc users can be confident that +upgrading to a patch or to a minor release will not break anything.
+Most Drycc projects are “components” which produce a Container image or binary executable as a +deliverable. This section leads a maintainer through creating a component release.
+Major or minor releases should happen on the master branch. Patch releases +should check out the previous release tag and cherry-pick specific commits from master.
+Note: if a patch release, the release artifact will have to be manually promoted by triggering +the component-promote job with the following values:
+COMPONENT_NAME=<component name>
+COMPONENT_SHA=<patch commit sha>
+
Make sure you have the dryccrel release tool in your search $PATH
.
Run dryccrel release
once with a fake semver tag to proofread the changelog content. (If HEAD
+of master is not what is intended for the release, add the --sha
flag as described
+in dryccrel release --help
.)
$ dryccrel release controller v0.0.0
+Doing a dry run of the component release...
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v0.0.0
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+
Based on the changelog content, determine whether the component deserves a minor or patch
+release. Run the command again with that semver tag and --dry-run=false
. You will still be
+asked for confirmation before the release is created:
$ dryccrel release controller v2.8.2 --dry-run=false
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v2.8.2
+
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+
+
+Please review the above changelog contents and ensure:
+ 1. All intended commits are mentioned
+ 2. The changes agree with the semver release tag (major, minor, or patch)
+
+Create release for Drycc Controller v2.8.2? [y/n]: y
+New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2
+
Tagging the component (see Step 1) +starts a CI job that eventually results in an artifact being made available for public download. +Please see the CI flow diagrams for details.
+Double-check that the artifact is available, either by a podman pull
command or by running the
+appropriate installer script.
If the artifact can’t be downloaded, ensure that its CI release jobs are still in progress, or
+fix whatever issue arose in the pipeline. For example, the
+master merge pipeline
+may have failed to promote the :git-abc1d23
candidate image and needs to be restarted with
+that component and commit.
If the component has a correlating Kubernetes Helm chart, +this chart will also be packaged, signed and uploaded to its production chart repo. Please +verify it can be fetched (and verified):
+$ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0
+Verification: &{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz}
+
Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart +deliverable. This section leads a maintainer through creating a Workflow release.
+Export two environment variables that will be used in later steps:
+export WORKFLOW_RELEASE=v2.17.0 WORKFLOW_PREV_RELEASE=v2.16.0 # for example
+
Some Workflow components not in the Helm chart must also be tagged in sync with the release. +Follow the component release process above and ensure that +these components are tagged:
+ +The version number for drycc/workflow-cli should always match the overall Workflow version +number.
+To create and stage a release candidate chart for Workflow, we will build the workflow-chart-stage job with the following parameters:
+RELEASE_TAG=$WORKFLOW_RELEASE
This job will gather all of the latest component release tags and use these to specify the versions of all component charts. +It will then package the Workflow chart, upload it to the staging chart repo and kick off an e2e run against said chart.
+Now it’s time to go above and beyond current CI tests. Create a testing matrix spreadsheet (copying +from the previous document is a good start) and sign up testers to cover all permutations.
+Testers should pay special attention to the overall user experience, make sure upgrading from +earlier versions is smooth, and cover various storage configurations and Kubernetes versions and +infrastructure providers.
+When showstopper-level bugs are found, the process is as follows:
+workflow-chart-stage
job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.When testing has completed without uncovering any new showstopper bugs, kick off the workflow-chart-release job with the following parameter:
+RELEASE_TAG=$WORKFLOW_RELEASE
This job will copy the release candidate chart (now approved by CI and manual testing) from the staging repo to the production repo, signing +it if it has not done so already.
+Each component already updated its release notes on GitHub with CHANGELOG content. We’ll now +generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes.
+We’ll employ the requirements.lock
file from the WORKFLOW_PREV_RELEASE
chart, as well as a repo-to-chart-name mapping file, this time invoking dryccrel changelog global
to get all component changes between
+the chart versions existing in the WORKFLOW_PREV_RELEASE
chart and the most recent releases existing in GitHub.
+(Therefore, if there are any unreleased commits in a component repo, they will not appear here):
helm fetch --untar oci://registry.drycc.cc/charts/workflow --version $WORKFLOW_PREV_RELEASE
+dryccrel changelog global workflow/requirements.lock map.json > changelog-$WORKFLOW_RELEASE.md
+
This master changelog should then be placed into a single gist. The file will also be added to the documentation +update PR created in the next step.
+Create a new pull request at drycc/workflow that updates version references to the new release.
+Use git grep $WORKFLOW_PREV_RELEASE
to find any references, but be careful not to change
+CHANGELOG.md
.
Place the $WORKFLOW_RELEASE
master changelog generated in Step 7 in the changelogs
directory.
+Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.:
## Workflow v2.16.0 -> v2.17.0
+
Once the PR has been reviewed and merged, do a component release of +drycc/workflow itself. The version number for drycc/workflow should always match the +overall Workflow version number.
+Create a pull request at seed-repo to close the release +milestone and create the next one. When changes are merged to seed-repo, milestones on all +relevant projects will be updated. If there are open issues attached to the milestone, move them +to the next upcoming milestone before merging the pull request.
+Milestones map to Drycc Workflow releases in drycc/workflow. These milestones do not correspond +to individual component release tags.
+Now that the $WORKFLOW_RELEASE
version of Workflow CLI has been vetted, we can push stable
artifacts based on this version.
Kick off https://ci.drycc.info/job/workflow-cli-build-stable/ with the TAG
build parameter of $WORKFLOW_RELEASE
+and then verify stable
artifacts are available and appropriately updated after the job completes:
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+$ ./drycc version
+# (Should show $WORKFLOW_RELEASE)
+
Let the rest of the team know they can start blogging and tweeting about the new Workflow release. +Post a message to the #company channel on Slack. Include a link to the released chart and to the +master CHANGELOG:
+@here Drycc Workflow v2.17.0 is now live!
+Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/
+
You’re done with the release. Nice job!
+ +less than a minute
+Drycc features a lightweight process that emphasizes openness and ensures every community member can be an integral part of planning for the future.
+Drycc roadmap is community driven and managed through GitHub.
+Drycc’s release model allows applications to record and roll back to previous versions.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Maintainers lead the Drycc projects. Their duties include proposing the Roadmap, reviewing and integrating contributions and maintaining the vision of the project.
+The Drycc Roadmap is a community document. While Maintainers propose the Roadmap, it gets discussed and refined in Release Planning Meetings.
+Proposals and issues can be opened by anyone. Every member of the community is welcome to participate in the discussion by providing feedback and/or offering counter-proposals.
+The Roadmap gets delivered progressively via the Release Schedule. Releases are defined during Release Planning Meetings and managed using GitHub Milestones which track specific deliverables and work-in-progress.
+Major decisions affecting the Roadmap are discussed during Release Planning Meetings on the first Thursday of each month, aligned with the Release Schedule.
+Release Planning Meetings are open to the public with access coordinated via the Drycc #community Slack channel. +Notes from past meetings are below, along with links to a recording of the entire meeting on YouTube.
+Thanks to Amy Lindburg and our friends at Podman for their inspiration.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+8 minute read
+Drycc uses a continuous delivery approach for creating releases. Every merged commit that passes +testing results in a deliverable that can be given a semantic version tag and shipped.
+The master git
branch of a project should always work. Only changes considered ready to be
+released publicly are merged.
Drycc components release new versions as often as needed. Fixing a high priority bug requires the +project maintainer to create a new patch release. Merging a backward-compatible feature implies +a minor release.
+By releasing often, each component release becomes a safe and routine event. This makes it faster +and easier for users to obtain specific fixes. Continuous delivery also reduces the work +necessary to release a product such as Drycc Workflow, which integrates several components.
+“Components” applies not just to Drycc Workflow projects, but also to development and release +tools, to Container base images, and to other Drycc projects that do semantic version releases.
+See “How to Release a Component” for more detail.
+Drycc Workflow has a regular, public release cadence. From v2.8.0 onward, new Workflow feature +releases arrive on the first Thursday of each month. Patch releases are created at any time, +as needed. GitHub milestones are used to communicate the content and timing of major and minor +releases, and longer-term planning is visible at the Roadmap.
+Workflow release timing is not linked to specific features. If a feature is merged before the +release date, it is included in the next release.
+See “How to Release Workflow” for more detail.
+Drycc releases comply with semantic versioning, with the “public API” broadly +defined as:
+In general, changes to anything a user might reasonably link to, customize, or integrate with +should be backward-compatible, or else require a major release. Drycc users can be confident that +upgrading to a patch or to a minor release will not break anything.
+Most Drycc projects are “components” which produce a Container image or binary executable as a +deliverable. This section leads a maintainer through creating a component release.
+Major or minor releases should happen on the master branch. Patch releases +should check out the previous release tag and cherry-pick specific commits from master.
+Note: if a patch release, the release artifact will have to be manually promoted by triggering +the component-promote job with the following values:
+COMPONENT_NAME=<component name>
+COMPONENT_SHA=<patch commit sha>
+
Make sure you have the dryccrel release tool in your search $PATH
.
Run dryccrel release
once with a fake semver tag to proofread the changelog content. (If HEAD
+of master is not what is intended for the release, add the --sha
flag as described
+in dryccrel release --help
.)
$ dryccrel release controller v0.0.0
+Doing a dry run of the component release...
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v0.0.0
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+
Based on the changelog content, determine whether the component deserves a minor or patch
+release. Run the command again with that semver tag and --dry-run=false
. You will still be
+asked for confirmation before the release is created:
$ dryccrel release controller v2.8.2 --dry-run=false
+skipping commit 943a49267eeb28546819a266654806cfcbae0e38
+
+Creating changelog for controller with tag v2.8.1 through commit 943a49267eeb28546819a266654806cfcbae0e38
+
+### v2.8.1 -> v2.8.2
+
+
+#### Fixes
+
+- [`615b834`](https://github.com/drycc/controller/commit/615b834f39cb68a854cc1f1e2f0f82d862ea2731) boot: Ensure DRYCC_DEBUG==true for debug output
+
+
+Please review the above changelog contents and ensure:
+ 1. All intended commits are mentioned
+ 2. The changes agree with the semver release tag (major, minor, or patch)
+
+Create release for Drycc Controller v2.8.2? [y/n]: y
+New release is available at https://github.com/drycc/controller/releases/tag/v2.8.2
+
Tagging the component (see Step 1) +starts a CI job that eventually results in an artifact being made available for public download. +Please see the CI flow diagrams for details.
+Double-check that the artifact is available, either by a podman pull
command or by running the
+appropriate installer script.
If the artifact can’t be downloaded, ensure that its CI release jobs are still in progress, or
+fix whatever issue arose in the pipeline. For example, the
+master merge pipeline
+may have failed to promote the :git-abc1d23
candidate image and needs to be restarted with
+that component and commit.
If the component has a correlating Kubernetes Helm chart, +this chart will also be packaged, signed and uploaded to its production chart repo. Please +verify it can be fetched (and verified):
+$ helm fetch oci://registry.drycc.cc/charts/controller --version 1.0.0
+Verification: &{0xc4207ec870 sha256:026e766e918ff28d2a7041bc3d560d149ee7eb0cb84165c9d9d00a3045ff45c3 controller-v1.0.1.tgz}
+
Drycc Workflow integrates multiple component releases together with a Kubernetes Helm chart +deliverable. This section leads a maintainer through creating a Workflow release.
+Export two environment variables that will be used in later steps:
+export WORKFLOW_RELEASE=v2.17.0 WORKFLOW_PREV_RELEASE=v2.16.0 # for example
+
Some Workflow components not in the Helm chart must also be tagged in sync with the release. +Follow the component release process above and ensure that +these components are tagged:
+ +The version number for drycc/workflow-cli should always match the overall Workflow version +number.
+To create and stage a release candidate chart for Workflow, we will build the workflow-chart-stage job with the following parameters:
+RELEASE_TAG=$WORKFLOW_RELEASE
This job will gather all of the latest component release tags and use these to specify the versions of all component charts. +It will then package the Workflow chart, upload it to the staging chart repo and kick off an e2e run against said chart.
+Now it’s time to go above and beyond current CI tests. Create a testing matrix spreadsheet (copying +from the previous document is a good start) and sign up testers to cover all permutations.
+Testers should pay special attention to the overall user experience, make sure upgrading from +earlier versions is smooth, and cover various storage configurations and Kubernetes versions and +infrastructure providers.
+When showstopper-level bugs are found, the process is as follows:
+workflow-chart-stage
job as mentioned in Step 3 to upload the newly-generated Workflow release candidate chart to staging.When testing has completed without uncovering any new showstopper bugs, kick off the workflow-chart-release job with the following parameter:
+RELEASE_TAG=$WORKFLOW_RELEASE
This job will copy the release candidate chart (now approved by CI and manual testing) from the staging repo to the production repo, signing +it if it has not done so already.
+Each component already updated its release notes on GitHub with CHANGELOG content. We’ll now +generate the master changelog for the Workflow chart, consisting of all component and auxilliary repo changes.
+We’ll employ the requirements.lock
file from the WORKFLOW_PREV_RELEASE
chart, as well as a repo-to-chart-name mapping file, this time invoking dryccrel changelog global
to get all component changes between
+the chart versions existing in the WORKFLOW_PREV_RELEASE
chart and the most recent releases existing in GitHub.
+(Therefore, if there are any unreleased commits in a component repo, they will not appear here):
helm fetch --untar oci://registry.drycc.cc/charts/workflow --version $WORKFLOW_PREV_RELEASE
+dryccrel changelog global workflow/requirements.lock map.json > changelog-$WORKFLOW_RELEASE.md
+
This master changelog should then be placed into a single gist. The file will also be added to the documentation +update PR created in the next step.
+Create a new pull request at drycc/workflow that updates version references to the new release.
+Use git grep $WORKFLOW_PREV_RELEASE
to find any references, but be careful not to change
+CHANGELOG.md
.
Place the $WORKFLOW_RELEASE
master changelog generated in Step 7 in the changelogs
directory.
+Make sure to add a header to the page to make it clear that this is for a Workflow release, e.g.:
## Workflow v2.16.0 -> v2.17.0
+
Once the PR has been reviewed and merged, do a component release of +drycc/workflow itself. The version number for drycc/workflow should always match the +overall Workflow version number.
+Create a pull request at seed-repo to close the release +milestone and create the next one. When changes are merged to seed-repo, milestones on all +relevant projects will be updated. If there are open issues attached to the milestone, move them +to the next upcoming milestone before merging the pull request.
+Milestones map to Drycc Workflow releases in drycc/workflow. These milestones do not correspond +to individual component release tags.
+Now that the $WORKFLOW_RELEASE
version of Workflow CLI has been vetted, we can push stable
artifacts based on this version.
Kick off https://ci.drycc.info/job/workflow-cli-build-stable/ with the TAG
build parameter of $WORKFLOW_RELEASE
+and then verify stable
artifacts are available and appropriately updated after the job completes:
$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
+$ ./drycc version
+# (Should show $WORKFLOW_RELEASE)
+
Let the rest of the team know they can start blogging and tweeting about the new Workflow release. +Post a message to the #company channel on Slack. Include a link to the released chart and to the +master CHANGELOG:
+@here Drycc Workflow v2.17.0 is now live!
+Master CHANGELOG: https://drycc.info/docs/workflow/changelogs/v2.17.0/
+
You’re done with the release. Nice job!
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+The Drycc Workflow Roadmap is a community document created as part of the open +Planning Process. Each roadmap item describes a high-level capability or +grouping of features that are deemed important to the future of Drycc.
+Given the project’s rapid Release Schedule, roadmap +items are designed to provide a sense of direction over many releases.
+drycc run /bin/bash
Provide the ability for developers to launch an interactive terminal session in +their application environment.
+Related issues:
+ +Stream application logs via drycc logs -f
https://github.com/drycc/drycc/issues/465
Teams and Permissions represents a more flexible permissions model to allow +more nuanced control to applications, capabilities and resources on the +platform. There have been a number of proposals in this area which need to be +reconciled for Drycc Workflow before we begin implementation.
+Related issues:
+Developers should be able to quickly and easily provision application +dependencies using a services or addon abstraction. +https://github.com/drycc/drycc/issues/231
+Drycc Workflow should be able to send and receive webhooks from external +systems. Facilitating integration with third party services like GitHub, +Gitlab, Slack, Hipchat.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+For information on troubleshooting a failing component, see +Troubleshooting with Kubectl.
+For information on troubleshooting application deployment issues, see +Troubleshooting Applications.
+The most common problem for this issue is the user forgetting to run drycc keys:add
or add their
+private key to their SSH agent. To do so, run ssh-add ~/.ssh/id_rsa
and try running
+git push drycc master
again.
If you happen get a Could not open a connection to your authentication agent
+error after trying to run ssh-add
command above, you may need to load the SSH
+agent environment variables issuing the eval "$(ssh-agent)"
command before.
Running into something not detailed here? Please open an issue or hop into +#community on Slack for help!
+ +This document describes how one can use kubectl
to debug any issues with the cluster.
Using kubectl
, one can inspect the cluster’s current state. When Workflow is installed
+with helm
, Workflow is installed into the drycc
namespace. To inspect if Workflow is
+running, run:
$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-gqum7 0/1 ContainerCreating 0 4s
+drycc-controller-h6lk6 0/1 ContainerCreating 0 4s
+drycc-controller-celery-cmxxn 0/3 ContainerCreating 0 4s
+drycc-database-56v39 0/1 ContainerCreating 0 4s
+drycc-logger-fluentbit-xihr1 0/1 Pending 0 2s
+drycc-logger-grupg 0/1 ContainerCreating 0 3s
+drycc-storage-c2exb 0/1 Pending 0 3s
+drycc-monitor-grafana-9ccur 0/1 Pending 0 3s
+drycc-monitor-telegraf-dc3y3 0/1 Pending 0 2s
+drycc-registry-5bor6 0/1 Pending 0 3s
+drycc-rabbitmq-0 0/1 ContainerCreating 0 3s
+
+!!! tip
+To save precious keystrokes, alias kubectl --namespace=drycc
to kd
so it is easier to type
+in the future.
To fetch the logs of a specific component, use kubectl logs
:
$ kubectl --namespace=drycc logs drycc-controller-h6lk6
+system information:
+Django Version: 1.9.6
+Python 3.5.1
+addgroup: gid '0' in use
+Django checks:
+System check identified no issues (2 silenced).
+[...]
+
+To dive into a running container to inspect its environment, use kubectl exec
:
$ kubectl --namespace=drycc exec -it drycc-database-56v39 gosu postgres psql
+psql (13.4 (Debian 13.4-1.pgdg100+1))
+Type "help" for help.
+
+postgres=# \l
+ List of databases
+ Name | Owner | Encoding | Collate | Ctype | Access privileges
+-------------------+----------+----------+------------+------------+-----------------------
+ drycc_controller | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ drycc_passport | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
+ | | | | | postgres=CTc/postgres
+ template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
+ | | | | | postgres=CTc/postgres
+(4 rows)
+postgres=# \connect drycc_controller
+You are now connected to database "drycc_controller" as user "postgres".
+drycc_controller=# \dt
+ List of relations
+ Schema | Name | Type | Owner
+--------+--------------------------------+-------+-------------------
+ public | api_app | table | drycc_controller
+ public | api_build | table | drycc_controller
+ public | api_certificate | table | drycc_controller
+ public | api_config | table | drycc_controller
+ public | api_domain | table | drycc_controller
+ public | api_key | table | drycc_controller
+ public | api_push | table | drycc_controller
+ public | api_release | table | drycc_controller
+ public | auth_group | table | drycc_controller
+ --More--
+ drycc_controller=# SELECT COUNT(*) from api_app;
+ count
+-------
+ 0
+(1 row)
+
+
+When you deploy an application to Workflow using git push drycc master
and the Builder
+attempts to deploy using the Buildpack workflow, check the following steps:
git push drycc <branch>
)?Dockerfile
in the project’s root directory?Dockerfile
to the project?If you deployed your application but it is failing to start, you can use drycc logs
to check
+why the application fails to boot. Sometimes, the application container may fail to boot without
+logging any information about the error. This typically occurs when the healthcheck configured for
+the application fails. In this case, you can start by
+troubleshooting using kubectl. You can inspect the application’s current
+state by examining the pod deployed in the application’s namespace. To do that, run
$ kubectl --namespace=myapp get pods
+NAME READY STATUS RESTARTS AGE
+myapp-web-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s
+
+We can then describe the pod and determine why it is failing to boot:
+Events:
+ FirstSeen LastSeen Count From SubobjectPath Type Reason Message
+ --------- -------- ----- ---- ------------- -------- ------ -------
+ 43s 43s 1 {default-scheduler } Normal Scheduled Successfully assigned myapp-web-1585713350-3brbo to kubernetes-node-1
+ 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Normal Created Created container with container id b86bd851a61f
+ 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Normal Started Started container with container id b86bd851a61f
+ 37s 35s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Warning Unhealthy Liveness probe failed: Get http://10.246.39.13:8000/healthz: dial tcp 10.246.39.13:8000: getsockopt: connection refused
+
+In this instance, we set the healthcheck initial delay timeout for the application at 1 second, +which is too aggressive. The application needs some time to set up the API server after the +container has booted. By increasing the healthcheck initial delay timeout to 10 seconds, the +application is able to boot and is responding correctly.
+See Custom Health Checks for more information on how to customize the application’s +health checks to better suit the application’s needs.
+ +2 minute read
+When you deploy an application to Workflow using git push drycc master
and the Builder
+attempts to deploy using the Buildpack workflow, check the following steps:
git push drycc <branch>
)?Dockerfile
in the project’s root directory?Dockerfile
to the project?If you deployed your application but it is failing to start, you can use drycc logs
to check
+why the application fails to boot. Sometimes, the application container may fail to boot without
+logging any information about the error. This typically occurs when the healthcheck configured for
+the application fails. In this case, you can start by
+troubleshooting using kubectl. You can inspect the application’s current
+state by examining the pod deployed in the application’s namespace. To do that, run
$ kubectl --namespace=myapp get pods
+NAME READY STATUS RESTARTS AGE
+myapp-web-1585713350-3brbo 0/1 CrashLoopBackOff 2 43s
+
+We can then describe the pod and determine why it is failing to boot:
+Events:
+ FirstSeen LastSeen Count From SubobjectPath Type Reason Message
+ --------- -------- ----- ---- ------------- -------- ------ -------
+ 43s 43s 1 {default-scheduler } Normal Scheduled Successfully assigned myapp-web-1585713350-3brbo to kubernetes-node-1
+ 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Normal Created Created container with container id b86bd851a61f
+ 41s 41s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Normal Started Started container with container id b86bd851a61f
+ 37s 35s 1 {kubelet kubernetes-node-1} spec.containers{myapp-web} Warning Unhealthy Liveness probe failed: Get http://10.246.39.13:8000/healthz: dial tcp 10.246.39.13:8000: getsockopt: connection refused
+
+In this instance, we set the healthcheck initial delay timeout for the application at 1 second, +which is too aggressive. The application needs some time to set up the API server after the +container has booted. By increasing the healthcheck initial delay timeout to 10 seconds, the +application is able to boot and is responding correctly.
+See Custom Health Checks for more information on how to customize the application’s +health checks to better suit the application’s needs.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Common issues that users have run into when provisioning Workflow are detailed below.
+Kubernetes provides a command line tool for communicating with a Kubernetes cluster’s control plane, using the Kubernetes API.
+This document describes how one can troubleshoot common issues when deploying or debugging an application that fails to start or deploy.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+This document describes how one can use kubectl
to debug any issues with the cluster.
Using kubectl
, one can inspect the cluster’s current state. When Workflow is installed
+with helm
, Workflow is installed into the drycc
namespace. To inspect if Workflow is
+running, run:
$ kubectl --namespace=drycc get pods
+NAME READY STATUS RESTARTS AGE
+drycc-builder-gqum7 0/1 ContainerCreating 0 4s
+drycc-controller-h6lk6 0/1 ContainerCreating 0 4s
+drycc-controller-celery-cmxxn 0/3 ContainerCreating 0 4s
+drycc-database-56v39 0/1 ContainerCreating 0 4s
+drycc-logger-fluentbit-xihr1 0/1 Pending 0 2s
+drycc-logger-grupg 0/1 ContainerCreating 0 3s
+drycc-storage-c2exb 0/1 Pending 0 3s
+drycc-monitor-grafana-9ccur 0/1 Pending 0 3s
+drycc-monitor-telegraf-dc3y3 0/1 Pending 0 2s
+drycc-registry-5bor6 0/1 Pending 0 3s
+drycc-rabbitmq-0 0/1 ContainerCreating 0 3s
+
+!!! tip
+To save precious keystrokes, alias kubectl --namespace=drycc
to kd
so it is easier to type
+in the future.
To fetch the logs of a specific component, use kubectl logs
:
$ kubectl --namespace=drycc logs drycc-controller-h6lk6
+system information:
+Django Version: 1.9.6
+Python 3.5.1
+addgroup: gid '0' in use
+Django checks:
+System check identified no issues (2 silenced).
+[...]
+
+To dive into a running container to inspect its environment, use kubectl exec
:
$ kubectl --namespace=drycc exec -it drycc-database-56v39 gosu postgres psql
+psql (13.4 (Debian 13.4-1.pgdg100+1))
+Type "help" for help.
+
+postgres=# \l
+ List of databases
+ Name | Owner | Encoding | Collate | Ctype | Access privileges
+-------------------+----------+----------+------------+------------+-----------------------
+ drycc_controller | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ drycc_passport | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
+ template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
+ | | | | | postgres=CTc/postgres
+ template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
+ | | | | | postgres=CTc/postgres
+(4 rows)
+postgres=# \connect drycc_controller
+You are now connected to database "drycc_controller" as user "postgres".
+drycc_controller=# \dt
+ List of relations
+ Schema | Name | Type | Owner
+--------+--------------------------------+-------+-------------------
+ public | api_app | table | drycc_controller
+ public | api_build | table | drycc_controller
+ public | api_certificate | table | drycc_controller
+ public | api_config | table | drycc_controller
+ public | api_domain | table | drycc_controller
+ public | api_key | table | drycc_controller
+ public | api_push | table | drycc_controller
+ public | api_release | table | drycc_controller
+ public | auth_group | table | drycc_controller
+ --More--
+ drycc_controller=# SELECT COUNT(*) from api_app;
+ count
+-------
+ 0
+(1 row)
+
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+For information on troubleshooting a failing component, see +Troubleshooting with Kubectl.
+For information on troubleshooting application deployment issues, see +Troubleshooting Applications.
+The most common problem for this issue is the user forgetting to run drycc keys:add
or add their
+private key to their SSH agent. To do so, run ssh-add ~/.ssh/id_rsa
and try running
+git push drycc master
again.
If you happen get a Could not open a connection to your authentication agent
+error after trying to run ssh-add
command above, you may need to load the SSH
+agent environment variables issuing the eval "$(ssh-agent)"
command before.
Running into something not detailed here? Please open an issue or hop into +#community on Slack for help!
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+The Twelve-Factor App is a methodology for building modern +applications that can be scaled across a distributed system.
+Twelve-factor is a valuable synthesis of years of experience with +software-as-a-service apps in the wild, particularly on the +Heroku platform.
+Workflow is designed to run applications that adhere to the Twelve-Factor App +methodology and best practices.
+Kubernetes is an open-source cluster manager developed by Google and +donated to the Cloud Native Compute Foundation. Kubernetes manages all +the activity on your cluster, including: desired state convergence, stable +service addresses, health monitoring, service discovery, and DNS resolution.
+Workflow builds upon Kubernetes abstractions like Services, +Deployments and Pods to provide a developer-friendly experience. +Building containers directly from application source code, aggregating logs, +and managing deployment configurations and app releases are just some of the +features Workflow adds.
+Drycc Workflow is a set of Kubernetes-native components, installable via +Helm. Systems engineers who are familiar with Kubernetes will feel right +at home running Workflow.
+See the components overview for more detail.
+[Container][] is an open source project to build, ship and run any +application as a lightweight, portable, self-sufficient container.
+If you have not yet converted your application to containers, Workflow provides
+a simple and straightforward “source to Container image” capability. Supporting
+multiple language runtimes via community buildpacks, building your application
+in a container can be as easy as git push drycc master
.
Applications which use either a Dockerfile or reference external Container +images are launched unmodified.
+Workflow is designed around the concept of an application, or app.
+Applications come in one of three forms:
+git
repositorygit
repositoryApplications are identified by a unique name for easy reference. If you do not +specify a name when creating your application, Workflow generates one for you. +Workflow also manages related information, including domain names, SSL +certificates, and developer-provided configuration.
+The builder component processes incoming git push drycc master
requests
+and manages your application packaging.
If your application is using a buildpack, builder will launch an ephemeral +job to extract and execute the packaging instructions. The resulting +application artifact is stored by the platform for execution during the run +stage.
+If instead builder finds a Dockerfile, it follows those instructions to +create a Container image. The resulting artifact is stored in a Drycc-managed registry which +will be referenced during the run stage.
+If another system already builds and packages your application, that container +artifact can be used directly. When referencing an external Container +image, the builder component doesn’t attempt to repackage your +app.
+During the release stage, a build is combined with application configuration +to create a new, numbered release. New releases are created any time a new +build is created or application configuration is changed. Tracking releases as a +“write-only ledger” this way makes it easy to rollback to any previous release.
+The run stage deploys the new release to the underlying Kubernetes cluster by +changing the Deployment object which references the new release. +By managing the desired replica count, Workflow +orchestrates a zero-downtime, rolling update of your application. Once +successfully updated, Workflow removes the last reference to the old release. +Note that during the deploy, your application will be running in a mixed mode.
+Workflow treats all persistent services such as databases, caches, storage, +messaging systems, and other backing services as resources managed +separately from your application. This philosophy aligns with Twelve-Factor +best practices.
+Applications attach to backing services using environment variables. +Because apps are decoupled from backing services, they are free to +scale up independently, to use services provided by other apps, or to switch +to external or third-party vendor services.
+All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.
+Operators use Helm to configure and install the Workflow components which +interface directly with the underlying Kubernetes cluster. Service discovery, +container availability and networking are all delegated to Kubernetes, while +Workflow provides a clean and simple developer experience.
+Drycc Workflow provides additional functionality to your Kubernetes cluster, including:
+All platform components and applications deployed via Workflow expect to be +running on an existing Kubernetes cluster. This means that you can happily run +your Kubernetes-native workloads next to applications that are managed through +Drycc Workflow.
+ +By default Workflow creates per-application Namespaces and Services so you can +easily connect your applications to other on-cluster services through standard +Kubernetes mechanisms.
+ +The router component is responsible for routing HTTP/s traffic to your
+Applications as well as proxying git push
and platform API traffic.
By default, the router component is deployed as a Kubernetes service with type
+LoadBalancer
; which, depending on your configuration, will provision a
+cloud-native load balancer automatically.
The router automatically discovers routable Applications, SSL/TLS certificates +and application-specific configurations through the use of Kubernetes +annotations. Any changes to router configuration or certificates are applied +within seconds.
+Drycc Workflow no longer dictates a specific topology or server count for your +deployment. The platform components will happily run on single-server +configurations as well as multi-server production clusters.
+ +All Workflow components are deployed as services (and associated controllers) in your Kubernetes cluster. +If you are interested we have a more detailed exploration of the Workflow architecture.
+All of the componentry for Workflow is built with composability in mind. If you +need to customize one of the components for your specific deployment or need +the functionality in your own project we invite you to give it a shot!
+Project Location: drycc/controller
+The controller component is an HTTP API server which serves as the endpoint for
+the drycc
CLI. The controller provides all of the platform functionality as
+well as interfacing with your Kubernetes cluster. The controller persists all
+of its data to the database component.
Project Location: drycc/passport
+The passport component exposes a web API and provide OAuth2 authentication.
+Project Location: drycc/postgres
+The database component is a managed instance of PostgreSQL which holds a +majority of the platforms state. Backups and WAL files are pushed to object +storage via WAL-E. When the database is restarted, backups are fetched and +replayed from object storage so no data is lost.
+Project Location: drycc/builder
+The builder component is responsible for accepting code pushes via Git and +managing the build process of your Application. The builder process is:
+git push
requests over SSHBuilder currently supports both buildpack and Dockerfile based builds.
+Project Location: drycc/imagebuilder
+For Buildpack-based deploys, the builder component will launch a one-shot Job
+in the drycc
namespace. This job runs imagebuilder
component which handles
+default and custom buildpacks (specified by .packbuilder
). The completed image
+is pushed to the managed Container registry on cluster. For more information
+about buildpacks see using buildpacks.
Unlike buildpack-based, For Applications which contain a Dockerfile
in the root
+of the repository, it generates a Container image (using the underlying Container engine).
+For more information see using Dockerfiles.
Project Location: drycc/storage
+All of the Workflow components that need to persist data will ship them to the +object storage that was configured for the cluster.For example, database ships +its WAL files, registry stores Container images, and slugbuilder stores slugs.
+Workflow supports either on or off-cluster storage. For production deployments +we highly recommend that you configure off-cluster object storage.
+To facilitate experimentation, development and test environments, the default charts for +Workflow include on-cluster storage via storage.
+If you also feel comfortable using Kubernetes persistent volumes you may +configure storage to use persistent storage available in your environment.
+Project Location: drycc/registry
+The registry component is a managed container registry which holds application +images generated from the builder component. Registry persists the Container image +images to either local storage (in development mode) or to object storage +configured for the cluster.
+The logging subsystem consists of two components. Fluentbit handles log shipping +and logger maintains a ring-buffer of application logs.
+Project Location: drycc/fluentbit
+Fluentbit is deployed to your Kubernetes cluster via Daemon Sets. Fluentbit
+subscribes to all container logs, decorates the output with Kubernetes metadata
+and can be configured to drain logs to multiple destinations. By default,
+Fluentbit ships logs to the logger component, which powers drycc logs
.
Project Location: drycc/logger
+The logger
component receives log streams from fluentbit
, collating by
+Application name. Logger does not persist logs to disk, instead maintaining an
+in-memory ring buffer. For more information on logger see the project
+documentation.
Project Location: drycc/monitor
+The monitoring subsystem consists of two components: Telegraf and Grafana.
+Telegraf is the is the metrics collection agent that runs using the daemon set API. It runs on +every worker node in the cluster, fetches information about the pods currently running and ships it +to Prometheus.
+Grafana is a standalone graphing application. It natively supports Prometheus as a datasource and +provides a robust engine for creating dashboards on top of timeseries data. Workflow provides a few +dashboards out of the box for monitoring Drycc Workflow and Kubernetes. The dashboards can be used +as a starting point for creating more custom dashboards to suit a user’s needs.
+Project Location: drycc/prometheus
+Prometheus is a system monitoring and alerting system. It was opensourced by SoundCloud in 2012 and is +the second project both to join and to graduate within Cloud Native Computing Foundation after Kubernetes. +Prometheus stores all metrics data as time series, i.e metrics information is stored along with the +timestamp at which it was recorded, optional key-value pairs called as labels can also be stored along +with metrics.
+Project Location: drycc/rabbitmq
+RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.
+Project Location: drycc/rabbitmq
+Helm Broker is a Service Broker that exposes Helm charts as Service Classes in Service Catalog. +To do so, Helm Broker uses the concept of addons. An addon is an abstraction layer over a Helm chart +which provides all information required to convert the chart into a Service Class.
+Project Location: drycc/rabbitmq
+Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.
+2 minute read
+All components are published as a set of container images which can be deployed to any +compliant Kubernetes cluster.
+Operators use Helm to configure and install the Workflow components which +interface directly with the underlying Kubernetes cluster. Service discovery, +container availability and networking are all delegated to Kubernetes, while +Workflow provides a clean and simple developer experience.
+Drycc Workflow provides additional functionality to your Kubernetes cluster, including:
+All platform components and applications deployed via Workflow expect to be +running on an existing Kubernetes cluster. This means that you can happily run +your Kubernetes-native workloads next to applications that are managed through +Drycc Workflow.
+ +By default Workflow creates per-application Namespaces and Services so you can +easily connect your applications to other on-cluster services through standard +Kubernetes mechanisms.
+ +The router component is responsible for routing HTTP/s traffic to your
+Applications as well as proxying git push
and platform API traffic.
By default, the router component is deployed as a Kubernetes service with type
+LoadBalancer
; which, depending on your configuration, will provision a
+cloud-native load balancer automatically.
The router automatically discovers routable Applications, SSL/TLS certificates +and application-specific configurations through the use of Kubernetes +annotations. Any changes to router configuration or certificates are applied +within seconds.
+Drycc Workflow no longer dictates a specific topology or server count for your +deployment. The platform components will happily run on single-server +configurations as well as multi-server production clusters.
+ + +Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+5 minute read
+All Workflow components are deployed as services (and associated controllers) in your Kubernetes cluster. +If you are interested we have a more detailed exploration of the Workflow architecture.
+All of the componentry for Workflow is built with composability in mind. If you +need to customize one of the components for your specific deployment or need +the functionality in your own project we invite you to give it a shot!
+Project Location: drycc/controller
+The controller component is an HTTP API server which serves as the endpoint for
+the drycc
CLI. The controller provides all of the platform functionality as
+well as interfacing with your Kubernetes cluster. The controller persists all
+of its data to the database component.
Project Location: drycc/passport
+The passport component exposes a web API and provide OAuth2 authentication.
+Project Location: drycc/postgres
+The database component is a managed instance of PostgreSQL which holds a +majority of the platforms state. Backups and WAL files are pushed to object +storage via WAL-E. When the database is restarted, backups are fetched and +replayed from object storage so no data is lost.
+Project Location: drycc/builder
+The builder component is responsible for accepting code pushes via Git and +managing the build process of your Application. The builder process is:
+git push
requests over SSHBuilder currently supports both buildpack and Dockerfile based builds.
+Project Location: drycc/imagebuilder
+For Buildpack-based deploys, the builder component will launch a one-shot Job
+in the drycc
namespace. This job runs imagebuilder
component which handles
+default and custom buildpacks (specified by .packbuilder
). The completed image
+is pushed to the managed Container registry on cluster. For more information
+about buildpacks see using buildpacks.
Unlike buildpack-based, For Applications which contain a Dockerfile
in the root
+of the repository, it generates a Container image (using the underlying Container engine).
+For more information see using Dockerfiles.
Project Location: drycc/storage
+All of the Workflow components that need to persist data will ship them to the +object storage that was configured for the cluster.For example, database ships +its WAL files, registry stores Container images, and slugbuilder stores slugs.
+Workflow supports either on or off-cluster storage. For production deployments +we highly recommend that you configure off-cluster object storage.
+To facilitate experimentation, development and test environments, the default charts for +Workflow include on-cluster storage via storage.
+If you also feel comfortable using Kubernetes persistent volumes you may +configure storage to use persistent storage available in your environment.
+Project Location: drycc/registry
+The registry component is a managed container registry which holds application +images generated from the builder component. Registry persists the Container image +images to either local storage (in development mode) or to object storage +configured for the cluster.
+The logging subsystem consists of two components. Fluentbit handles log shipping +and logger maintains a ring-buffer of application logs.
+Project Location: drycc/fluentbit
+Fluentbit is deployed to your Kubernetes cluster via Daemon Sets. Fluentbit
+subscribes to all container logs, decorates the output with Kubernetes metadata
+and can be configured to drain logs to multiple destinations. By default,
+Fluentbit ships logs to the logger component, which powers drycc logs
.
Project Location: drycc/logger
+The logger
component receives log streams from fluentbit
, collating by
+Application name. Logger does not persist logs to disk, instead maintaining an
+in-memory ring buffer. For more information on logger see the project
+documentation.
Project Location: drycc/monitor
+The monitoring subsystem consists of two components: Telegraf and Grafana.
+Telegraf is the is the metrics collection agent that runs using the daemon set API. It runs on +every worker node in the cluster, fetches information about the pods currently running and ships it +to Prometheus.
+Grafana is a standalone graphing application. It natively supports Prometheus as a datasource and +provides a robust engine for creating dashboards on top of timeseries data. Workflow provides a few +dashboards out of the box for monitoring Drycc Workflow and Kubernetes. The dashboards can be used +as a starting point for creating more custom dashboards to suit a user’s needs.
+Project Location: drycc/prometheus
+Prometheus is a system monitoring and alerting system. It was opensourced by SoundCloud in 2012 and is +the second project both to join and to graduate within Cloud Native Computing Foundation after Kubernetes. +Prometheus stores all metrics data as time series, i.e metrics information is stored along with the +timestamp at which it was recorded, optional key-value pairs called as labels can also be stored along +with metrics.
+Project Location: drycc/rabbitmq
+RabbitMQ is the most widely deployed open source message broker. +Controller use celery with rabbitMQ to execute the asynchronous task.
+Project Location: drycc/rabbitmq
+Helm Broker is a Service Broker that exposes Helm charts as Service Classes in Service Catalog. +To do so, Helm Broker uses the concept of addons. An addon is an abstraction layer over a Helm chart +which provides all information required to convert the chart into a Service Class.
+Project Location: drycc/rabbitmq
+Prometheus is an open-source systemsmonitoring and alerting toolkit originally built atSoundCloud.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+4 minute read
+The Twelve-Factor App is a methodology for building modern +applications that can be scaled across a distributed system.
+Twelve-factor is a valuable synthesis of years of experience with +software-as-a-service apps in the wild, particularly on the +Heroku platform.
+Workflow is designed to run applications that adhere to the Twelve-Factor App +methodology and best practices.
+Kubernetes is an open-source cluster manager developed by Google and +donated to the Cloud Native Compute Foundation. Kubernetes manages all +the activity on your cluster, including: desired state convergence, stable +service addresses, health monitoring, service discovery, and DNS resolution.
+Workflow builds upon Kubernetes abstractions like Services, +Deployments and Pods to provide a developer-friendly experience. +Building containers directly from application source code, aggregating logs, +and managing deployment configurations and app releases are just some of the +features Workflow adds.
+Drycc Workflow is a set of Kubernetes-native components, installable via +Helm. Systems engineers who are familiar with Kubernetes will feel right +at home running Workflow.
+See the components overview for more detail.
+[Container][] is an open source project to build, ship and run any +application as a lightweight, portable, self-sufficient container.
+If you have not yet converted your application to containers, Workflow provides
+a simple and straightforward “source to Container image” capability. Supporting
+multiple language runtimes via community buildpacks, building your application
+in a container can be as easy as git push drycc master
.
Applications which use either a Dockerfile or reference external Container +images are launched unmodified.
+Workflow is designed around the concept of an application, or app.
+Applications come in one of three forms:
+git
repositorygit
repositoryApplications are identified by a unique name for easy reference. If you do not +specify a name when creating your application, Workflow generates one for you. +Workflow also manages related information, including domain names, SSL +certificates, and developer-provided configuration.
+The builder component processes incoming git push drycc master
requests
+and manages your application packaging.
If your application is using a buildpack, builder will launch an ephemeral +job to extract and execute the packaging instructions. The resulting +application artifact is stored by the platform for execution during the run +stage.
+If instead builder finds a Dockerfile, it follows those instructions to +create a Container image. The resulting artifact is stored in a Drycc-managed registry which +will be referenced during the run stage.
+If another system already builds and packages your application, that container +artifact can be used directly. When referencing an external Container +image, the builder component doesn’t attempt to repackage your +app.
+During the release stage, a build is combined with application configuration +to create a new, numbered release. New releases are created any time a new +build is created or application configuration is changed. Tracking releases as a +“write-only ledger” this way makes it easy to rollback to any previous release.
+The run stage deploys the new release to the underlying Kubernetes cluster by +changing the Deployment object which references the new release. +By managing the desired replica count, Workflow +orchestrates a zero-downtime, rolling update of your application. Once +successfully updated, Workflow removes the last reference to the old release. +Note that during the deploy, your application will be running in a mixed mode.
+Workflow treats all persistent services such as databases, caches, storage, +messaging systems, and other backing services as resources managed +separately from your application. This philosophy aligns with Twelve-Factor +best practices.
+Applications attach to backing services using environment variables. +Because apps are decoupled from backing services, they are free to +scale up independently, to use services provided by other apps, or to switch +to external or third-party vendor services.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Drycc Workflow is a lightweight application platform that deploys and scales Twelve-Factor apps as containers across a Kubernetes cluster.
+Drycc Workflow is built using a service oriented architecture.
+Workflow is comprised of a number of small, independent services that combine to create a distributed CaaS.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
++This is the multi-page printable view of this section. +Click here to print. +
+The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.
+Install the latest drycc
client for Linux or Mac OS X with:
+$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
The installer puts drycc
in your current directory, but you should move it
+somewhere in your $PATH:
$ ln -fs $PWD/drycc /usr/local/bin/drycc
+
+The Drycc client comes with comprehensive documentation for every command.
+Use drycc help
to explore the commands available to you:
$ drycc help
+The Drycc command-line client issues API calls to a Drycc controller.
+
+Usage: drycc <command> [<args>...]
+
+Auth commands::
+
+ login login to a controller
+ logout logout from the current controller
+
+Subcommands, use `drycc help [subcommand]` to learn more::
+...
+
+To get help on subcommands, use drycc help [subcommand]
:
$ drycc help apps
+Valid commands for apps:
+
+apps:create create a new application
+apps:list list accessible applications
+apps:info view info about an application
+apps:open open the application in a browser
+apps:logs view aggregated application logs
+apps:run run a command in an ephemeral app container
+apps:destroy destroy an application
+apps:transfer transfer app ownership to another user
+
+Use `drycc help [command]` to learn more
+
+The CLI reads from the default client
profile, which is located on your
+workstation at $HOME/.drycc/client.json
.
Easily switch between multiple Drycc Workflow installations or users by setting
+the $DRYCC_PROFILE
environment variable or by using the -c
flag.
There are two ways to set the $DRYCC_PROFILE
option.
$HOME/.drycc/<name>.json
.Examples:
+$ DRYCC_PROFILE=production drycc login drycc.production.com
+...
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration saved to /home/testuser/.drycc/production.json
+$ DRYCC_PROFILE=~/config.json drycc login drycc.example.com
+...
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration saved to /home/testuser/config.json
+
+The configuration flag works identically to and overrides $DRYCC_PROFILE
:
$ drycc whoami -c ~/config.json
+You are drycc at drycc.example.com
+
+If your workstation uses a proxy to reach the network where the cluster lies,
+set the http_proxy
or https_proxy
environment variable to enable proxy support:
$ export http_proxy="http://proxyip:port"
+$ export https_proxy="http://proxyip:port"
+
+!!! note +Configuring a proxy is generally not necessary for local Minikube clusters.
+Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features.
+If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, drycc resource:command
will execute drycc-resource
with the argument list command
. In full form:
$ # these two are identical
+$ drycc accounts:list
+$ drycc-accounts list
+
+Any flags after the command will also be sent to the plugin as an argument:
+$ # these two are identical
+$ drycc accounts:list --debug
+$ drycc-accounts list --debug
+
+But flags preceding the command will not:
+$ # these two are identical
+$ drycc --debug accounts:list
+$ drycc-accounts list
+
+
+Workflow use the passport component to create and authorize users, it can config options for LDAP authentication or browse passport web site to register users.
+If you already have an account, use drycc login
to authenticate against the Drycc Workflow API.
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration file written to /root/.drycc/client.json
+
+Or you can login with username and password +$ drycc login http://drycc.example.com –username=demo –password=demo +Configuration file written to /root/.drycc/client.json
+Logout of an existing controller session using drycc logout
.
$ drycc logout
+Logged out as drycc
+
+You can verify your client configuration by running drycc whoami
.
$ drycc whoami
+You are drycc at http://drycc.example.com
+
+!!! note
+Session and client configuration is stored in the ~/.drycc/client.json
file.
For Dockerfile and Buildpack based application deploys via git push
, Drycc Workflow identifies users via SSH
+keys. SSH keys are pushed to the platform and must be unique to each user. Users may have multiple SSH keys as needed.
If you do not already have an SSH key or would like to create a new key for Drycc Workflow, generate a new key using
+ssh-keygen
:
$ ssh-keygen -f ~/.ssh/id_drycc -t rsa
+Generating public/private rsa key pair.
+Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in /Users/admin/.ssh/id_drycc.
+Your public key has been saved in /Users/admin/.ssh/id_drycc.pub.
+The key fingerprint is:
+3d:ac:1f:f4:83:f7:64:51:c1:7e:7f:80:b6:70:36:c9 admin@plinth-23437.local
+The key's randomart image is:
++--[ RSA 2048]----+
+| .. |
+| ..|
+| . o. .|
+| o. E .o.|
+| S == o..o|
+| o +. .o|
+| . o + o .|
+| . o = |
+| . . |
++-----------------+
+$ ssh-add ~/.ssh/id_drycc
+Identity added: /Users/admin/.ssh/id_drycc (/Users/admin/.ssh/id_drycc)
+
By publishing the public half of your SSH key to Drycc Workflow the component responsible for receiving git push
+will be able to authenticate the user and ensure that they have access to the destination application.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
You can always view the keys associated with your user as well:
+$ drycc keys:list
+ID OWNER KEY
+admin@plinth-23437.local admin ssh-rsa abc AAAAB3Nz...3437.local
+admin@subgenius.local admin ssh-rsa 123 AAAAB3Nz...nius.local
+
Remove keys by their name:
+$ drycc keys:remove admin@plinth-23437.local
+Removing admin@plinth-23437.local SSH Key... don
+
+3 minute read
+The Drycc Workflow command-line interface (CLI), or client, allows you to interact +with Drycc Workflow.
+Install the latest drycc
client for Linux or Mac OS X with:
+$ curl -sfL https://www.drycc.cc/install-cli.sh | bash -
The installer puts drycc
in your current directory, but you should move it
+somewhere in your $PATH:
$ ln -fs $PWD/drycc /usr/local/bin/drycc
+
+The Drycc client comes with comprehensive documentation for every command.
+Use drycc help
to explore the commands available to you:
$ drycc help
+The Drycc command-line client issues API calls to a Drycc controller.
+
+Usage: drycc <command> [<args>...]
+
+Auth commands::
+
+ login login to a controller
+ logout logout from the current controller
+
+Subcommands, use `drycc help [subcommand]` to learn more::
+...
+
+To get help on subcommands, use drycc help [subcommand]
:
$ drycc help apps
+Valid commands for apps:
+
+apps:create create a new application
+apps:list list accessible applications
+apps:info view info about an application
+apps:open open the application in a browser
+apps:logs view aggregated application logs
+apps:run run a command in an ephemeral app container
+apps:destroy destroy an application
+apps:transfer transfer app ownership to another user
+
+Use `drycc help [command]` to learn more
+
+The CLI reads from the default client
profile, which is located on your
+workstation at $HOME/.drycc/client.json
.
Easily switch between multiple Drycc Workflow installations or users by setting
+the $DRYCC_PROFILE
environment variable or by using the -c
flag.
There are two ways to set the $DRYCC_PROFILE
option.
$HOME/.drycc/<name>.json
.Examples:
+$ DRYCC_PROFILE=production drycc login drycc.production.com
+...
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration saved to /home/testuser/.drycc/production.json
+$ DRYCC_PROFILE=~/config.json drycc login drycc.example.com
+...
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration saved to /home/testuser/config.json
+
+The configuration flag works identically to and overrides $DRYCC_PROFILE
:
$ drycc whoami -c ~/config.json
+You are drycc at drycc.example.com
+
+If your workstation uses a proxy to reach the network where the cluster lies,
+set the http_proxy
or https_proxy
environment variable to enable proxy support:
$ export http_proxy="http://proxyip:port"
+$ export https_proxy="http://proxyip:port"
+
+!!! note +Configuring a proxy is generally not necessary for local Minikube clusters.
+Plugins allow developers to extend the functionality of the Drycc Client, adding new commands or features.
+If an unknown command is specified, the client will attempt to execute the command as a dash-separated command. In this case, drycc resource:command
will execute drycc-resource
with the argument list command
. In full form:
$ # these two are identical
+$ drycc accounts:list
+$ drycc-accounts list
+
+Any flags after the command will also be sent to the plugin as an argument:
+$ # these two are identical
+$ drycc accounts:list --debug
+$ drycc-accounts list --debug
+
+But flags preceding the command will not:
+$ # these two are identical
+$ drycc --debug accounts:list
+$ drycc-accounts list
+
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+How to download, install, and start using the Drycc CLI. The Drycc CLI used to be part of the Drycc Toolbelt.
+Get started on Drycc today
+Create, manage, and upload SSH keys to Drycc for use in deploying and connecting to applications.
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+less than a minute
+Workflow use the passport component to create and authorize users, it can config options for LDAP authentication or browse passport web site to register users.
+If you already have an account, use drycc login
to authenticate against the Drycc Workflow API.
$ drycc login http://drycc.example.com
+Opening browser to http://drycc.example.com/v2/login/drycc/?key=4ccc81ee2dce4349ad5261ceffe72c71
+Waiting for login... .o.Logged in as drycc
+Configuration file written to /root/.drycc/client.json
+
+Or you can login with username and password +$ drycc login http://drycc.example.com –username=demo –password=demo +Configuration file written to /root/.drycc/client.json
+Logout of an existing controller session using drycc logout
.
$ drycc logout
+Logged out as drycc
+
+You can verify your client configuration by running drycc whoami
.
$ drycc whoami
+You are drycc at http://drycc.example.com
+
+!!! note
+Session and client configuration is stored in the ~/.drycc/client.json
file.
Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+2 minute read
+For Dockerfile and Buildpack based application deploys via git push
, Drycc Workflow identifies users via SSH
+keys. SSH keys are pushed to the platform and must be unique to each user. Users may have multiple SSH keys as needed.
If you do not already have an SSH key or would like to create a new key for Drycc Workflow, generate a new key using
+ssh-keygen
:
$ ssh-keygen -f ~/.ssh/id_drycc -t rsa
+Generating public/private rsa key pair.
+Enter passphrase (empty for no passphrase):
+Enter same passphrase again:
+Your identification has been saved in /Users/admin/.ssh/id_drycc.
+Your public key has been saved in /Users/admin/.ssh/id_drycc.pub.
+The key fingerprint is:
+3d:ac:1f:f4:83:f7:64:51:c1:7e:7f:80:b6:70:36:c9 admin@plinth-23437.local
+The key's randomart image is:
++--[ RSA 2048]----+
+| .. |
+| ..|
+| . o. .|
+| o. E .o.|
+| S == o..o|
+| o +. .o|
+| . o + o .|
+| . o = |
+| . . |
++-----------------+
+$ ssh-add ~/.ssh/id_drycc
+Identity added: /Users/admin/.ssh/id_drycc (/Users/admin/.ssh/id_drycc)
+
By publishing the public half of your SSH key to Drycc Workflow the component responsible for receiving git push
+will be able to authenticate the user and ensure that they have access to the destination application.
$ drycc keys:add ~/.ssh/id_drycc.pub
+Uploading id_drycc.pub to drycc... done
+
You can always view the keys associated with your user as well:
+$ drycc keys:list
+ID OWNER KEY
+admin@plinth-23437.local admin ssh-rsa abc AAAAB3Nz...3437.local
+admin@subgenius.local admin ssh-rsa 123 AAAAB3Nz...nius.local
+
Remove keys by their name:
+$ drycc keys:remove admin@plinth-23437.local
+Removing admin@plinth-23437.local SSH Key... don
+
+
+Was this page helpful?
+ + ++ Glad to hear it! Please tell us how we can improve. +
++ Sorry to hear that. Please tell us how we can improve. +
+Native to Kubernetes, Drycc is the Container as a Service(CaaS) suite available +on every public cloud, every Kubernetes distribution, the private cloud and the edge.
+(An easy-to-use, scalable CaaS platform available on Metal, AWS, Azure, and Google Cloud, +and more)
+We provide a few out of the box dashboards for monitoring Drycc Workflow.
+We do a Pull Request contributions workflow on GitHub. New users are always welcome!
+If you have any questions concerning our products, our support team will be happy to help you.
+Features
+Open source from day one, leverage the power of global innovation with the leading database open source community.
+Both X86 and ARM64 are supported with binaries and multiarch images available for both, drycc works great from something in any server.
+Drycc Workflow is a lightweight CaaS platform that deploys and scales Twelve-Factor apps as containers across a K8s cluster.
+It’s easy to deploy, operate and scale drycc — anywhere.
+").text(`No results found for query "${i}"`)):c.forEach(n=>{const i=s.get(n.ref),a=t.data("offline-search-base-href")+n.ref.replace(/^\//,""),o=e("